本文來自同步博客腹暖。
Android M:運行時權(quán)限
運行時權(quán)限屬于比較熟悉的話題不深入展開汇在。除了support
包可以讓應(yīng)用完成運行時權(quán)限,github
上也有好多擴展脏答。用得比較多的是Google
官方的EasyPermissions
趾疚。
Android N:提高私有文件的安全性
私有文件安全性的變動官方文檔提到了三點副作用,詳見文檔以蕴。下面記錄開發(fā)中遇見的兩點糙麦。
應(yīng)用間共享文件
在調(diào)用照片拍照、調(diào)用包管理器安裝apk等場景下都需要跨應(yīng)用共享文件丛肮。在版本N
之前赡磅,直接使用“file://+文件路徑”的方式就可以共享。
但是在N
之后宝与,這樣操作會拋出異常FileUriExposedException焚廊。
實際上在共享文件時,接受共享的應(yīng)用可能并沒有向系統(tǒng)申請讀取文件的權(quán)限习劫,也可能沒有訪問該文件的權(quán)限咆瘟。如果擁有者應(yīng)用通過修改文件的權(quán)限,讓其他任何應(yīng)用都可以訪問它诽里,這顯然是不安全的袒餐。
N
要求使用“content://+文件路徑”的方式共享文件,并在共享的那一刻生成針對指定應(yīng)用的臨時權(quán)限谤狡。這種分享私有文件方法灸眼,Google
推薦使用FileProvider完成。
參考其他博客墓懂,這里記錄兩個注意點:
-
FileProvider
是support
包提供的功能焰宣,并不需要檢查Android的版本進行區(qū)分處理。統(tǒng)一使用FileProvider
向外共享文件即可捕仔。 -
FileProvider
的Available Files
的配置需要注意path
匕积、name
盈罐、以及paths
里面的不同標簽的意義。很多使用者混淆了闪唆,詳細請參考官方文檔盅粪。下圖是某網(wǎng)友的總結(jié)。
DownloadManager
的COLUMN_LOCAL_FILENAME
字段限制
N
以前的應(yīng)用可以訪問COLUMN_LOCAL_FILENAME
字段苞氮,但是之后的版本若訪問該字段,將報SecurityException瓤逼。
有一種不推薦的方式可以讓應(yīng)用繼續(xù)訪問這個字段:在下載文件時笼吟,通過DownloadManager.Request.setDestinationInExternalFilesDir()
或DownloadManager.Request.setDestinationInExternalPublicDir()
把文件存儲在公共目錄。
Google
推薦使用ContentResolver.openFileDescriptor()
霸旗。
而我在開發(fā)中碰到需要獲取下載文件最終存儲的完整路徑的場景贷帮,下面記錄我的處理方式:
String path = "";
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
String fileUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
if (fileUri != null) {
path = Uri.parse(fileUri).getPath();
}
} else {
//Android 7.0以上的方式:請求獲取寫入權(quán)限,這一步報錯過時的方式:DownloadManager.COLUMN_LOCAL_FILENAME
int fileNameIdx = c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
path = c.getString(fileNameIdx);
}
Android O:安裝非認證渠道APK
O
開始屏蔽了全局的“安裝未知應(yīng)用”設(shè)置開關(guān)诱告,而是將之作為權(quán)限與每個應(yīng)用綁定撵枢。任何需要安裝APK的應(yīng)用需要在AndroidManifest中注冊android.permission.REQUEST_INSTALL_PACKAGES
權(quán)限,否則將無法安裝應(yīng)用精居。
可以選擇使用ACTION_MANAGE_UNKNOWN_APP_SOURCES
發(fā)起 Intent
操作锄禽,預(yù)先將用戶引導(dǎo)至安裝未知應(yīng)用權(quán)限界面。也可以使用PackageManager.canRequestPackageInstalls()
靴姿,查詢此權(quán)限的狀態(tài)沃但。
Android P:限制非SDK接口的使用
很慶幸也很不幸,我負責(zé)的項目沒有檢測到使用了非SDK接口佛吓。
有關(guān)非SDK接口相關(guān)介紹參考這篇文章宵晚。
文中提到的veridex
工具需要自己下載Android
的源代碼,具體操作參考官方文檔维雇。