最近上线的一个app在客户那里反馈调用手机系统拍照时崩溃的问题,说使用的是Android 7.0系统,后来费劲找来一个Android 7.0的手机调试了一下,发现不能再用以前的方式来调用:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pictureFile));            mCurrentFragment.startActivityForResult(intent, REQUEST_CODE_FORM_CAMERA);

这时会抛出异常:

FATAL EXCEPTION: main
Process: com.test.android.debug, PID: 19189
android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.test.android.debug/files/Pictures/bs20170419092740.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1816)
at android.net.Uri.checkFileUriExposed(Uri.java:2350)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)

这个异常只会在Android 7.0以及以上版本才会出现,是说通过此方式会出现暴露文件Uri的异常,这个Uri可以通过ClipData.Item.getUri() 方法获取到。后来查了一下需要使用以下方式:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {            doTakePhotoIn7(pictureFile.getAbsolutePath());        } else {            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pictureFile));            mCurrentFragment.startActivityForResult(intent, REQUEST_CODE_FORM_CAMERA);        }//在Android7.0以上拍照    private void doTakePhotoIn7(String path) {        Uri mCameraTempUri;        try {            ContentValues values = new ContentValues(1);            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");            values.put(MediaStore.Images.Media.DATA, path);            mCameraTempUri = mCurrentFragment.getActivity().getContentResolver()                    .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);            takePhoto(mCurrentFragment, REQUEST_CODE_FORM_CAMERA, mCameraTempUri);        } catch (Exception e) {            e.printStackTrace();        }    }    public static void takePhoto(Fragment fragment, int requestCode, Uri uri) {        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);        if (uri != null) {            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);        }        fragment.startActivityForResult(intent, requestCode);    }

更多相关文章

  1. onInterceptTouchEvent和onTouchEvent调用时序(转)
  2. Android时钟的widget【安卓进化三十七】
  3. Android(安卓)ListView分页时出现java.lang.ClassCastException:
  4. Android(安卓)的Handle之postDelayed方法
  5. 简单实用的安卓原生底部tab实现ViewPager+RadioButton
  6. Android中SQLite学习小结
  7. Android(安卓)Loader(二) CursorLoader
  8. Android(安卓)数据存储之SharedPreferences的使用
  9. Android中JavaScript和Native之间的Bridge

随机推荐

  1. 教你如何创建类似QQ的android弹出菜单
  2. Android(安卓)SDK 2.3与Eclipse最新版开
  3. Android(安卓)SDK下载技巧
  4. android TextView属性大全
  5. Android中widget组件的开发流程
  6. Android使用service后台更新计划任务
  7. android播放器(music player)源码分析1-Ser
  8. 布局概述之相对布局RelativeLayout
  9. Android的Task和Activity(一)
  10. Android高手应该精通哪些内容?