Section1 简单代码
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); doGetImageFromCamera(); } private void doGetImageFromCamera() { //1 new Intent with Action Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //2 set output Uri Uri imageUri = setOutputFileUri(); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //3 startActivityForResult startActivityForResult(cameraIntent, 10000); } public Uri setOutputFileUri() { String imagePath = getImagePath("haha"); File file = new File(imagePath); return Uri.fromFile(file); } public static String getImagePath(String name) { String filePath = Environment.getExternalStorageDirectory() + File.separator + "tempPath" + File.separator + name; return filePath; }
我们 1.new 了一个intent,
2.设置好拍照的output Uri,
3.startActivityForResult
结果报如下错误,
android.os.FileUriExposedException: file:///storage/emulated/0/tempPath/haha exposed beyond app through ClipData.Item.getUri()
查资料可知,
这是因为谷歌在targetSdkVersion为 android N(7.0 api24)
的情况下作了权限的限制。
解决方案1:把targetSdkVersion 降为23
解决方案2:通过FileProvider 的方式来解决
解决方案3:使用ContentProvider方式传递uri
我们选择方案3
Section 2 ContentProvider 传递uri
修改后的代码如下
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); doGetImageFromCamera(); } private void doGetImageFromCamera() { //1 new Intent with Action Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //2 set output Uri Uri imageUri = setOutputFileUri(); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //3 startActivityForResult startActivityForResult(cameraIntent, 10000); } public Uri setOutputFileUri() { String imagePath = getImagePath("haha"); ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, imagePath); return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues); } public static String getImagePath(String name) { String filePath = Environment.getExternalStorageDirectory() + File.separator + "tempPath" + File.separator + name; return filePath; }报错如下
java.lang.SecurityException: Permission Denial:
writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=13656, uid=10227
requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
缺少权限
Section3
添加 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 权限现在,我们终于可以进入相机界面了。。