Android开发,调用相册图片或者调用相机进行拍照获取图片
2015-10-27 17:24
881 查看
这是比较常见的情况。
只是初次使用的时候会出现很多的错误导致不能达成想要的效果,这里写出来分享一下。
我这里是某一个按钮的点击事件,弹出选择框来选择是拍照还是打开相册还是取消。
case R.id.headicon_2即是进入照相机进行拍照
case R.id.headicon_3即是取消操作
这里要使用一个Intent信使来操作
ACTION_PICK是进入文件夹进行选择,intent.settype("image/*")是限制只能选择图片
ACTION_IMAGE_CAPTURE是进行拍照,这个相对复杂,大体操作是先判断有没有SD卡存在,否则拍完了没办法存储,然后判断android的版本,这是比较重要的一点,因为android的版本问题,在android4.1之前和之后是不一样的操作。然后跳到照相界面
注意这两个跳转都是需要返回的跳转,即startActivityForResult,我这里,1代表相册,2代表相机
接下来是处理返回的方法
这里面有些我自己做操作的代码,你们主要看怎么使用就行。
里面有一个startPhotoZoom的方法
这是用于将图片进行裁剪成正方形的方法
希望能对你们有帮助。
只是初次使用的时候会出现很多的错误导致不能达成想要的效果,这里写出来分享一下。
我这里是某一个按钮的点击事件,弹出选择框来选择是拍照还是打开相册还是取消。
headicon_btn.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (group.getCheckedRadioButtonId()) { // 调用相册 case R.id.headicon_1: Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*");// 相片类型 startActivityForResult(intent, 1); break; // 调用照相机 case R.id.headicon_2: String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); mUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "/DCIM/Camera/" + String.valueOf(System.currentTimeMillis()) + ".png")); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, mUri); } startActivityForResult(getImageByCamera, 2); } else { Toast.makeText(getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show(); } break; // 取消 case R.id.headicon_3: break; } } });case R.id.headicon_1即是进入相册选择图片
case R.id.headicon_2即是进入照相机进行拍照
case R.id.headicon_3即是取消操作
这里要使用一个Intent信使来操作
ACTION_PICK是进入文件夹进行选择,intent.settype("image/*")是限制只能选择图片
ACTION_IMAGE_CAPTURE是进行拍照,这个相对复杂,大体操作是先判断有没有SD卡存在,否则拍完了没办法存储,然后判断android的版本,这是比较重要的一点,因为android的版本问题,在android4.1之前和之后是不一样的操作。然后跳到照相界面
注意这两个跳转都是需要返回的跳转,即startActivityForResult,我这里,1代表相册,2代表相机
接下来是处理返回的方法
/** * 当数据返回时调用 跳到相册选择照片跳回 */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { try { ContentResolver resolver = this.getContentResolver(); switch (requestCode) { case 1: case 2: if (data != null) { startPhotoZoom(data.getData()); } else { if (mUri != null) { startPhotoZoom(mUri); }else { return; } } break; case 3: if (data != null) { Uri uri = data.getData(); Bitmap bitmap = MediaStore.Images.Media.getBitmap(resolver, uri); this.bitmap = bitmap; baby_info_headicon.setImageBitmap(bitmap); baby_click.setVisibility(View.GONE); // 保存图片到本地 File f = new File(INFO.HEAD_PATH); if (!f.exists()) {// 若该文件夹不存在则新建一个文件夹 f.mkdirs(); } f = new File(INFO.HEAD_PATH + "/" + data_util.GetData_String(getApplicationContext(), "username") + "headicon.png"); FileOutputStream outputStream; try { f.createNewFile(); outputStream = new FileOutputStream(f); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); outputStream.flush(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } break; default: break; } } catch (Exception e) { e.printStackTrace(); } }
这里面有些我自己做操作的代码,你们主要看怎么使用就行。
里面有一个startPhotoZoom的方法
这是用于将图片进行裁剪成正方形的方法
/** * 头像裁剪 * * @param data */ private void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 240); intent.putExtra("outputY", 240); startActivityForResult(intent, 3); }所以上面还有一个返回参数为3,如果你们不需要进行裁剪,在上面的返回操作改变一下,删除3这个返回参数,在1和2中进行操作就可以了。
希望能对你们有帮助。
相关文章推荐
- Android 中public.xml在SDK开发和动态加载的用法
- smarthome(android) 开发备忘笔记
- android开发中用到的px、dp、sp
- [Xamarin.Android] 结合Windows Azure与Google cloud message 来实现Push Notification
- android中的常用线程池区别--转载
- Android加载大图片不OutOfMemoryError
- Android基础之图片的压缩算法
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- 004androidStudio ndk开发环境
- Android 播放视频并获取指定时间的帧画面
- android内存泄漏测试
- Xutils 使用get请求时,连续请求返回数据相同问题的解决
- Android的内存优化
- Android studio 创建百度地图应用
- android netd 笔记
- 如何更新android应用的包名
- Android资源管理
- 美团Android自动化之旅—生成渠道包
- Android判断输入框的状况
- Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标