適配android7.0獲取文件的Uri的方法
前言#
Android 7.0已經(jīng)發(fā)布很久了,雖然市場份額還不是很高,但是流行起來都是早晚的事,所以適配Android 7.0刻不容緩。
Android 7.0 對系統(tǒng)進行了很多的優(yōu)化:例如文件訪問權(quán)限,省電,網(wǎng)絡(luò),后臺等等,其中最突出的就是應(yīng)用外的Uri訪問。
什么時候會用到Uri的應(yīng)用外訪問呢?舉一個簡單的例子,下載apk更新,這個時候會調(diào)用系統(tǒng)功能來安裝這個apk,這就是應(yīng)用外訪問文件,需要傳入文件的Uri。
但是這樣可能會顯得不太安全,萬一是什么非常重要的文件就糟糕了,所以Android 7.0對應(yīng)用外訪問的Uri要進行處理加密。
正文#
那應(yīng)該怎么處理這個問題呢?首先我們需要注冊ContentProvider,這個就很熟悉了,他可以把數(shù)據(jù)庫的內(nèi)容分享給其他應(yīng)用,現(xiàn)在是為了分享文件:
//res目錄下創(chuàng)建xml,設(shè)置要分享的目錄,名稱定義file_paths <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="myFile" path ="" /> </paths> // 注冊provider <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.lzp.fileprovider" android:exported="false" // 賦予Uri權(quán)限 android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" // 設(shè)置要分享的路徑 android:resource="@xml/file_paths"/> </provider>
設(shè)置分享的路徑有三種:
- <files-path/>代表的根目錄: Context.getFilesDir()
- <external-path/>代表的根目錄:Environment.getExternalStorageDirectory()
- <cache-path/>代表的根目錄: getCacheDir()
provider注冊完了之后,就需要稍微修改一下我們的java代碼:
Intent i = new Intent(Intent.ACTION_VIEW); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 判斷是否是7.0 if(Build.VERSION.SDK_INT >= 24){ // 適配android7.0 ,不能直接訪問原路徑 // 需要對intent 授權(quán) i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); i.setDataAndType(FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider",new File(filePath)),"application/vnd.android.package-archive"); } else{ i.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive"); } context.startActivity(i);
在java代碼中,我們先判斷了當前的手機的系統(tǒng)版本,如果是7.0以下就使用之前的Uri,如果是7.0以上,開始通過Provider來獲取加密后的Uri。
最終得到的Uri的格式:
content://com.lzp.fileprovider/myFile/xxxxx.apk
看來主要是把分享出去的路徑進行了加密,不能直接看到文件的完整路徑。
總結(jié)#
ok,解決這個問題就是這么簡單,如果是應(yīng)用內(nèi)訪問文件是不受影響的,例如我們的讀取圖片之類的操作,由于時間比較緊,寫的就比較簡單了,之后再寫點稍微高逼格一點的東西。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ListView實現(xiàn)聊天列表之處理不同數(shù)據(jù)項
這篇文章主要為大家詳細介紹了ListView實現(xiàn)聊天列表之處理不同數(shù)據(jù)項,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Android自定義view實現(xiàn)水波紋進度球效果
在我們的日常開發(fā)中自定義控件還是用的挺多的,設(shè)計師或者產(chǎn)品為了更好的漂亮,美觀,交互都會做一些牛逼的ui效果圖,但是最后實現(xiàn)的還是我們程序員啊。所以說 自定義view你還是得會的。2016-08-08Flutter?Widget之FutureBuilder使用示例詳解
這篇文章主要為大家介紹了Flutter?Widget之FutureBuilder使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11仿餓了嗎點餐界面ListView聯(lián)動的實現(xiàn)
這篇文章主要介紹了仿餓了嗎點餐界面ListView聯(lián)動的實現(xiàn)的相關(guān)資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下2016-09-09簡述Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法
本篇文章主要對Android中實現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法進行介紹,相信對大家學習會有很好的幫助,需要的朋友一起來看下吧2016-12-12