Android 7.0應(yīng)用之間如何共享文件
開發(fā)中經(jīng)常需要將某個(gè)文件向另一個(gè)應(yīng)用程序傳遞,如圖片上傳到另一個(gè)應(yīng)用程序、文件在不同存儲(chǔ)路徑之間的復(fù)制粘貼等都需要共享文件,可以這樣理解接收文件的應(yīng)用是在向提供文件的應(yīng)用發(fā)送請(qǐng)求。
從 Android 7.0 開始,Android 執(zhí)行 StrictMode 策略,禁止在應(yīng)用外部公開 file://URL,如果在 Android 7.0 以上的應(yīng)用不使用 FileProvider ,則會(huì)拋出 FileUriExposedException 異常,Android 7.0 以后要在應(yīng)用之間共享文件要使用 content://URL 授予 URL 臨時(shí)訪問權(quán)限,即要使用 FileProvider 的方式來授予臨時(shí)訪問權(quán)限,具有臨時(shí)訪問權(quán)限的 URL 是安全的,這種臨時(shí)的 URL 會(huì)自動(dòng)過期,其中 FileProvider 提供的 getUriForFile() 用于生成文件的內(nèi)容。
在所有情況下,從您的應(yīng)用程序向另一個(gè)應(yīng)用程序提供文件的唯一安全方法是向接收應(yīng)用程序發(fā)送文件的內(nèi)容URI,并授予該URI的臨時(shí)訪問權(quán)限。具有臨時(shí)URI訪問權(quán)限的內(nèi)容URI是安全的,因?yàn)樗鼈儍H適用于接收URI的應(yīng)用程序,并且它們會(huì)自動(dòng)過期。 Android FileProvider組件提供getUriForFile()方法,用于生成文件的內(nèi)容URI。
這里也會(huì)提到一個(gè)在 Android 7.0 及更高版本時(shí)經(jīng)常出現(xiàn)的異常:FileUriExposedException,通過使用 FileProvider 就可以解決該異常,當(dāng)然這也是 Android 系統(tǒng)在安全性上不斷完善的結(jié)果。
- 指定FileProvider
- 指定文件共享路徑
指定FileProvider
在 AndroidManifest 文件中指定 Provider,參考如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <!--android:authorities="${applicationId}.yourname"--> <provider android:name="android.support.v4.content.FileProvider" <!--authorities屬性指定要用于FileProvider生成的內(nèi)容URI的URI權(quán)限,一般是applicationId.yourname"組成--> android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
指定文件共享路徑
上面代碼中在 meta-data 目錄中指定了要共享的文件目錄,文件目錄在 filepathd.xml 中定義,可在相應(yīng)的 xml 中定義的路徑有以下幾種,具體參考如下:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <paths> <!--表示設(shè)備的根目錄(new File("/"))--> <root-path name="root" path="" /> <!--表示context.getFileDir()--> <files-path name="files" path="" /> <!--表示context.getCacheDir()--> <cache-path name="cache" path="" /> <!--表示Environment.getExternalStorageDirectory()--> <external-path name="external" path="" /> <!--表示context.getExternalFilesDirs()--> <external-files-path name="name" path="path" /> <!--表示getExternalCacheDirs()--> <external-cache-path name="name" path="path" /> </paths> </resources>
在 xml 中表示某個(gè)路徑需要兩個(gè)屬性,path 表示當(dāng)前指定目錄的子目錄,如果不指定則表示的是當(dāng)前指定目錄下的根目錄及子目錄,name 表示會(huì)將 name 添加的 URL 后面作為該文件的訪問路徑,參考如下:
//表示當(dāng)前要共享的文件會(huì)在 context.getFileDir() 目錄下的 images 子目錄下查找要共享的文件 <paths> <files-path path="images/" name="myImage" /> </paths> //表示最終生成的共享的文件URL content://com.example.myapp.fileprovider/myImage/image.jpg
獲取Uri
最后,配置完成之后,在所有需要使用文件相關(guān)的,在獲取 Url 時(shí)應(yīng)該按照如下方式獲取,具體如下:
public Uri getUri(File file) { Uri uri = null; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".youName", file); } else { uri = Uri.fromFile(file); } return uri; }
這樣就可以在 Android 7.0 以上愉快的共享文件了,這個(gè)知識(shí)點(diǎn)也算是開發(fā)中經(jīng)常會(huì)遇到到。
以上就是Android 7.0應(yīng)用之間如何共享文件的詳細(xì)內(nèi)容,更多關(guān)于Android 7.0 共享文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android通過ViewModel保存數(shù)據(jù)實(shí)現(xiàn)多頁面的數(shù)據(jù)共享功能
- Android開發(fā)之5.0activity跳轉(zhuǎn)時(shí)共享元素的使用方法
- Android數(shù)據(jù)共享 sharedPreferences 的使用方法
- android與asp.net服務(wù)端共享session的方法詳解
- 詳解Android(共享元素)轉(zhuǎn)場(chǎng)動(dòng)畫開發(fā)實(shí)踐
- Android 仿摩拜單車共享單車進(jìn)度條實(shí)現(xiàn)StepView效果
- Android開發(fā)中多進(jìn)程共享數(shù)據(jù)簡(jiǎn)析
- Android設(shè)備間實(shí)現(xiàn)藍(lán)牙(Bluetooth)共享上網(wǎng)
- Android實(shí)現(xiàn)不同apk間共享數(shù)據(jù)的方法(2種方法)
- android編程實(shí)現(xiàn)設(shè)置、打開wifi熱點(diǎn)共享供他人連接的方法
- Android編程實(shí)現(xiàn)兩個(gè)Activity之間共享數(shù)據(jù)及互相訪問的方法
- android不同activity之間共享數(shù)據(jù)解決方法
相關(guān)文章
android wifi信號(hào)強(qiáng)度等級(jí)區(qū)分的修改介紹
calculateSignalLevel為計(jì)算信號(hào)等級(jí)函數(shù),MAX_RSSI和MIN_RSSI分別為最強(qiáng)和最弱信號(hào)強(qiáng)度等級(jí)的信號(hào)強(qiáng)度閥值2013-06-06適配AndroidQ拍照和讀取相冊(cè)圖片的實(shí)現(xiàn)方法
這篇文章主要介紹了適配AndroidQ拍照和讀取相冊(cè)圖片的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06android 對(duì)話框彈出位置和透明度的設(shè)置具體實(shí)現(xiàn)方法
在android中我們經(jīng)常會(huì)用AlertDialog來顯示對(duì)話框。通過這個(gè)對(duì)話框是顯示在屏幕中心的。但在某些程序中,要求對(duì)話框可以顯示在不同的位置。2013-07-07Android下通過httpClient發(fā)送GET和POST請(qǐng)求的實(shí)例代碼
這篇文章介紹了Android下通過httpClient發(fā)送GET和POST請(qǐng)求的實(shí)例代碼,有需要的朋友可以參考一下2013-08-08Kotlin開發(fā)中與if等價(jià)的takeIf與takeUnless詳解
這篇文章主要介紹了Kotlin開發(fā)中與if等價(jià)的takeIf與takeUnless使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01Android編程實(shí)現(xiàn)通訊錄中聯(lián)系人的讀取,查詢,添加功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)通訊錄中聯(lián)系人的讀取,查詢,添加功能,涉及Android權(quán)限控制及通訊錄相關(guān)操作技巧,需要的朋友可以參考下2017-07-07Android 使用Vitamio打造自己的萬能播放器(7)——在線播放(下載視頻)
本文主要介紹Android Vitamio開發(fā)播放器,這里提供在線播放和下載視頻實(shí)例代碼,有需要的小伙伴可以參考下2016-07-07Android實(shí)現(xiàn)無限循環(huán)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)無限循環(huán)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01Android開發(fā)自定義控件之折線圖實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Android開發(fā)自定義控件之折線圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android自定義控件中折線圖原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05react native android6+拍照閃退或重啟的解決方案
android 6+權(quán)限使用的時(shí)候需要?jiǎng)討B(tài)申請(qǐng),那么在使用rn的時(shí)候要怎么處理拍照權(quán)限問題呢?本文提供的是一攬子rn操作相冊(cè)、拍照的解決方案,需要的朋友可以參考下2017-11-11