这里主要介绍如何调用系统的手机进行拍照,或者直接从相册中找图片。
权限
在Android4.4系统之前,访问SD卡的应用关联目录要声明权限,之后就可以不用声明了,为了兼容老版本,还是声明权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>代码一:准备工作
public static final int TAKE_PHOTO =1; //表示打开相机的标识符,知己定义的 PRivate ImageView picture; //用来展示最后的图片 private Uri imageUri; //表示图片文件的真实路径 ---------------接下来是打开相机前的准备工作------------------ File outputImage = new File(getExternalCacheDir(),"output_image.jpg"); //创建File对象,用于存贮拍照后的照片 //上述文件路径打印出来如下: // /storage/emulated/0/Android/data/com.yuyi.viewevent/cache/output_image.jpg try { if (outputImage.exists()){ outputImage.delete();//如果已经有这个对象了,则删除。 } outputImage.createNewFile();//在指定的路径下创建一个新的空文件 } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24){ imageUri=FileProvider .getUriForFile(MainActivity.this,"com.yuyi.viewevent",outputImage); //参数一是:Context对象,参数二:任意的字符串,参数三:file对象 //详细介绍,在最后面。 }else { imageUri = Uri.fromFile(outputImage); /**前面那个版本判断如果运行低于7.0的就直接把file对象转换成Uri对象, 得到一个本地真实路径,如果7.0以上,直接使用本地真实路径会认为不安全, 所以使用了FileProvider这个特殊的内容提供器,可以选择性地将封装过得 Uri共享给外部。 */ } //打印出imageUri的log如下: file:///storage/emulated/0/Android/data/com.yuyi.viewevent/cache/output_image.jpg //隐世意图启动相机 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);//将uri传递进去 startActivityForResult(intent,TAKE_PHOTO);代码二:对于拍照结果的处理
case TAKE_PHOTO: if (resultCode == RESULT_OK){ try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); //将存在本地的图片进行读取成为bitmap picture.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break;代码一
public static final int CHOOSE_PHOTO=2; //作为从相册选取的标识符 private ImageView picture; //表示用于展示的图片 private Uri imageUri; //表示文件的真实路径代码二
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_DENIED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);//动态获取权限 }else { openAlbum();//此方法表示主动去打开相册 } /**在这里面完成的是先进行运行时权限处理,动态去获取权限,因为相册中的照片都是存储 在SD卡上,我们要从SD卡中读取照片就要这个权限,表示授予了程序对SD卡读和写的能力。*/先看看在4.4以上系统使用时候,如何处理图片:
新闻热点
疑难解答