关于Android 7.0更新后调用系统相机及电筒问题
android升级到7.0后对权限又做了一个更新即不允许出现以file://的形式调用隐式APP,需要用共享文件的形式:content://
URI
因为系统相机是提供的共享 Provider ,
ContentValues contentValues = new ContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA, mTmpFile.getAbsolutePath());
Uri uri = getContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_CAMERA);
关于android7.0打开电筒时camera必须要设置预览,否则灯光是无法打开的。
camera.setPreviewTexture(new SurfaceTexture(10));
系统权限更改
为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问 (0700
)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。此权限更改有多重副作用:
- 私有文件的文件权限不应再由所有者放宽,为使用
MODE_WORLD_READABLE
和/或MODE_WORLD_WRITEABLE
而进行的此类尝试将触发SecurityException
。注:迄今为止,这种限制尚不能完全执行。应用仍可能使用原生 API 或
File
API 来修改它们的私有目录权限。但是,我们强烈反对放宽私有目录的权限。 - 传递软件包网域外的
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()
。
在应用间共享文件
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode
API 政策禁止在您的应用外部公开 file://
URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException
异常。
要在应用间共享文件,您应发送一项 content://
URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider
类。如需了解有关权限和共享文件的详细信息,请参阅共享文件。
无障碍改进
Android学习