Android 7.0之后调用相机的方式不允许以file://的方式调用,需要以共享文件的方式content://url
ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath()); Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);
系统权限更改
为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问传递软件包网域外的
file://
URI 可能给接收器留下无法访问的路径。因此,尝试传递 file://
URI 会触发 FileUriExposedException
。分享私有文件内容的推荐方法是使用 FileProvider
。
DownloadManager
不再按文件名分享私人存储的文件。旧版应用在访问 COLUMN_LOCAL_FILENAME
时可能出现无法访问的路径。面向 Android 7.0 或更高版本的应用在尝试访问 COLUMN_LOCAL_FILENAME
时会触发 SecurityException
。通过使用 DownloadManager.Request.setDestinationInExternalFilesDir()
或 DownloadManager.Request.setDestinationInExternalPublicDir()
将下载位置设置为公共位置的旧版应用仍可以访问 COLUMN_LOCAL_FILENAME
中的路径,但是我们强烈反对使用这种方法。对于由 DownloadManager
公开的文件,首选的访问方式是使用ContentResolver.openFileDescriptor()
。