权限变更
随安卓版越来越高,对隐私保护力度亦越来越大。Android6.0引动态权限控制(Runtime Permissions),Android7.0私有目录限访、StrictMode API政策。
私有目录限访
说明
iOS对目录及文件访问保护很到位(iOS沙箱机制)。但安卓于该方面偏弱,应用可读写手机存储任一目录及文件,这也带来很多安全问题。
分类
Android7.0为提私有文件安全性,面向Android N或更高版应用将限访私有目录。
私有文件权限不再放权所有应用,
MODE_WORLD_READABLE
或MODE_WORLD_WRITEABLE
操作将触发SecurityException。意味无法通File API访手机存储数据,基于File API一些文件浏览器等亦将受很大影响,但迄今为止该限制尚未完全执行。应用仍可原生API或File API改私有目录权限。
给其它应用传
file:// URI
类型uri可能致接受者无法访该路径。故Android7.0传file:// URI
会触发FileUriExposedException。通FileProvider解决
DownloadManager不再按文件名分享私人存储文件。COLUMN_LOCAL_FILENAME于Android7.0标为deprecated,旧版应用访COLUMN_LOCAL_FILENAME时可能无法访问路径。面向Android N或更高版应用尝访COLUMN_LOCAL_FILENAME会触发SecurityException。
通ContentResolver.openFileDescriptor()访由DownloadManager公开文件。
应用共享文件
Android7.0框架强制执行StrictMode API政策禁向应用外公开file:// URI。包含文件file:// URI
类型Intent离开应用则失败并FileUriExposedException,如调系统相机拍照或裁切照片。
应用间共享文件可发content:// URI类型uri并通FileProvider授URI临访权限。
日志
android.os.FileUriExposedException: file:///storage/emulated/0/DUtil/%E9%AB%98%E5%BE%B72.apk exposed beyond app through Intent.getData()
解决
清单文件注册provider
exported须false,true报安全异常。grantUriPermissions:true表授URI临访权限。<provider android:name="android.support.v4.content.FileProvider" android:authorities="@string/fileProviderAuthorities" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_paths" /> </provider>
指定共享目录
res下创一xml目录后创一名file_provider_paths
(名字随便,同清单文件注册的provider所引resource保持一致即可)资源文件。如下:<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <external-path path="" name="files" /> </paths> </resources>
path=""指代码根目录,即可向其它应用共享根目录及子目录任何一文件。path="pictures"表根目录下pictures目录(eg:/storage/emulated/0/pictures),不能向其它应用分享pictures目录外文件。
用FileProvider
Uri uri = Uri.fromFile(file);
改为
Uri uri = FileProvider.getUriForFile(SingleTaskActivity.this, "com.self.zsp.multidownload", file);
获uri
content://com.self.zsp.multidownload/files/
上述指定path="",故content://com.jph.takephoto.fileprovider/camera_photos/所表真实路径即根目录(/storage/emulated/0/)。content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg所表真实路径是/storage/emulated/0/temp/1474960080319.jpg
电池和内存
Android 6.0(API 23)引低电耗模式,Android7.0于电池和内存做进一步优化以减应用对电量消耗及对内存占用。这些优化所引规则变更可能会影响应用访系统资源及系统通特定隐式Intent与其它应用互动方式。