安卓调用手机的相册与相机获取图片并适配到控件
2016-03-24 12:34
507 查看
在之前做项目的时候用到了调取系统相机的工能所以在这里做了一下总结,这是本人第一次写东西有很多不懂得地方或者有解释不明白的地方 希望大家前来指正不多说直接上代码:
首先是布局页面
写这个demo的时候是因为我本身的项目有相关的,就写了这些功能,我在网上看了很多相关的demo,大部分功能多恨单一,我把可能需要的方法全都加进来了方便大家使用,那个设置背景透明度的方法是考虑到一些情况加入的,例如需要弹出pop窗口的时候,本项目中并没有使用到,不想要的可以删除。
大家使用的时候记得添加相关的权限,否则可能运行不了
首先是布局页面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <ImageView android:id="@+id/imageView1" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="16dp" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:onClick="onClick" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="获取相册" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="25dp" android:onClick="onClick" android:text="相机拍照" /> </LinearLayout>这个部分很简单 就不多说了,接下来是主页面Mainactivity.class
public class MainActivity extends Activity implements OnClickListener { <span style="white-space:pre"> </span>//这里大家可以用XUtils进行处理,我没有做处理 private ImageView imageView; private Button button1, button2; /** 防止因为相机格式引发错误 */ @Override public void onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initinto(); } /** 实例化控件 */ public void initinto() { imageView = (ImageView) findViewById(R.id.imageView1); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button1.setOnClickListener(this); button2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: Log.d("DDD", "点击了选取相册按钮button1"); getPhotoFromxiangce(); break; case R.id.button2: Log.d("DDD", "点击了选取相册按钮button2"); getPhotofromxiangji(); break; default: break; } } /** 自己定义的名字 */ private String localTempImgDir = "localTempImgDir", localTempImgFileName = "localTempImgFileName"; private String filePath;// 图片的URL private static final String IMAGE_UNSPECIFIED = "image/*"; private static Uri urii; private static final int GET_IMAGE_VIA_CAMERA = 1;// 相机 private static final int PHOTO_ZOOM = 2; // 缩放 private static final int PHOTO_RESOULT = 3;// 结果 public static final int NULL_ID = -1; /** 获取相册图片的方法 */ public void getPhotoFromxiangce() { Log.d("DDD", "getPhotoFromxiangce执行了>>>>>>>>"); // 进入相册添加一张图片 Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED); startActivityForResult(intent, PHOTO_ZOOM); } /** 手机拍照的方法 */ public void getPhotofromxiangji() { Log.d("DDD", "getPhotofromxiangji执行了>>>>>>>>"); // 先验证手机是否有sdcard String status = Environment.getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { try { File dir = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir); if (!dir.exists()) dir.mkdirs(); Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); File f = new File(dir, localTempImgFileName);// localTempImgDir和localTempImageFileName是自己定义的名字 Uri u = Uri.fromFile(f); intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0); intent.putExtra(MediaStore.EXTRA_OUTPUT, u); startActivityForResult(intent, GET_IMAGE_VIA_CAMERA); } catch (ActivityNotFoundException e) { Toast.makeText(MainActivity.this, "没有找到储存目录", Toast.LENGTH_LONG) .show(); } } else { Toast.makeText(MainActivity.this, "没有储存卡", Toast.LENGTH_LONG) .show(); } } /** 在onActivityResult中这样折腾: */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("DDD", "正在执行onActivityResult()方法"); if (resultCode == RESULT_OK) { switch (requestCode) { // 直接进入相册 case PHOTO_ZOOM: buqianqie(data.getData()); // startPhotoZoom(data.getData()); break; // 相机方法监听 case GET_IMAGE_VIA_CAMERA: File f = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir + "/" + localTempImgFileName); try { Uri u = Uri.parse(android.provider.MediaStore.Images.Media .insertImage(getContentResolver(), f.getAbsolutePath(), null, null)); // u就是拍摄获得的原始图片的uri,剩下的你想干神马坏事请便…… startPhotoZoom(u); // buqianqie(u); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; // // 处理结果,剪切图片 case PHOTO_RESOULT: Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.PNG, 100, stream);// // (0-100)压缩文件 imageView.setImageBitmap(photo); // 把图片显示在ImageView控件上 } break; } } super.onActivityResult(requestCode, resultCode, data); } /** 不剪切图片 */ public void buqianqie(Uri uri) { Log.d("DDD", "uri>>>>>>>>>>>"+uri); imageView.setImageResource(NULL_ID); imageView.setImageURI(uri); Log.d("DDD", "正在执行buqianqie()方法"); urii = uri; filePath = getUrlFromUri(this, uri); // Bitmap bitmap = getBitmapFromUri(urii, this); // imageView.setImageBitmap(bitmap); } /** 剪切图片 */ public void startPhotoZoom(Uri uri) { Log.d("DDD", "正在执行startPhotoZoom()方法"); Intent intent = new Intent("com.android.camera.action.CROP"); urii = uri; filePath = getUrlFromUri(this, uri); intent.setDataAndType(uri, IMAGE_UNSPECIFIED); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 64); intent.putExtra("outputY", 64); intent.putExtra("return-data", true); startActivityForResult(intent, PHOTO_RESOULT); } /** 根据uri获取文件的路径URL */ public String getUrlFromUri(final Context context, final Uri uri) { Log.d("DDD", "正在执行getUrlFromUri()方法"); if (null == uri) return null; final String scheme = uri.getScheme(); String data = null; if (scheme == null) data = uri.getPath(); else if (ContentResolver.SCHEME_FILE.equals(scheme)) { data = uri.getPath(); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { Cursor cursor = context.getContentResolver().query(uri, new String[] { ImageColumns.DATA }, null, null, null); if (null != cursor) { if (cursor.moveToFirst()) { int index = cursor.getColumnIndex(ImageColumns.DATA); if (index > -1) { data = cursor.getString(index); } } cursor.close(); } } return data; } /** 通过uri转换成bitmip */ public static Bitmap getBitmapFromUri(Uri uri, Context mContext) { Log.d("DDD", "正在执行getBitmapFromUri()方法"); try { // 读取uri所在的图片 Bitmap bitmap = MediaStore.Images.Media.getBitmap( mContext.getContentResolver(), uri); Log.d("DDD", "bitmap方法"+bitmap.toString()); return bitmap; } catch (Exception e) { Log.d("DDD", "Exception方法"); e.printStackTrace(); return null; } } /** 设置添加屏幕的背景透明度 */ public void backgroundAlpha(float bgAlpha) { Log.d("DDD", "backgroundAlpha执行了>>>>>>>>"); WindowManager.LayoutParams lp = this.getWindow().getAttributes(); lp.alpha = bgAlpha; // 0.0-1.0 this.getWindow().setAttributes(lp); } /** 添加新笔记时弹出的popWin关闭的事件,主要是为了将背景透明度改回来 */ class poponDismissListener implements PopupWindow.OnDismissListener { @Override public void onDismiss() { Log.d("DDD", "poponDismissListener执行了>>>>>>>>onDismiss>>"); backgroundAlpha(1f); } }
写这个demo的时候是因为我本身的项目有相关的,就写了这些功能,我在网上看了很多相关的demo,大部分功能多恨单一,我把可能需要的方法全都加进来了方便大家使用,那个设置背景透明度的方法是考虑到一些情况加入的,例如需要弹出pop窗口的时候,本项目中并没有使用到,不想要的可以删除。
大家使用的时候记得添加相关的权限,否则可能运行不了
相关文章推荐
- bootstrap根据数据库自动生成多列
- eclispe中的maven项目使用spring报错
- Python—进程、线程、协程
- struts2查看源码
- git 彻底返回上一次提交前的版本
- 自动生成android dimens.xml适配屏幕
- [从头学数学] 第150节 二次函数
- 关闭MediaRecorder录制状态改变时的声音
- 在Ubuntu上安装Odoo9
- Android 通知 Notification 使用详情
- 网易2016年Java工程师实习编程题目
- php new self()和new static()
- 缓存溢出
- The Block Problem, id:101
- Quartz.NET开源作业调度架构
- Spring的IOC的事件的使用
- flex4拾遗一: transition
- dockerfile 格式
- dockerfile 安装 nginx
- 构建之法