Android 7.0應(yīng)用之間如何共享文件
開發(fā)中經(jīng)常需要將某個文件向另一個應(yīng)用程序傳遞,如圖片上傳到另一個應(yīng)用程序、文件在不同存儲路徑之間的復(fù)制粘貼等都需要共享文件,可以這樣理解接收文件的應(yīng)用是在向提供文件的應(yīng)用發(fā)送請求。
從 Android 7.0 開始,Android 執(zhí)行 StrictMode 策略,禁止在應(yīng)用外部公開 file://URL,如果在 Android 7.0 以上的應(yīng)用不使用 FileProvider ,則會拋出 FileUriExposedException 異常,Android 7.0 以后要在應(yīng)用之間共享文件要使用 content://URL 授予 URL 臨時訪問權(quán)限,即要使用 FileProvider 的方式來授予臨時訪問權(quán)限,具有臨時訪問權(quán)限的 URL 是安全的,這種臨時的 URL 會自動過期,其中 FileProvider 提供的 getUriForFile() 用于生成文件的內(nèi)容。
在所有情況下,從您的應(yīng)用程序向另一個應(yīng)用程序提供文件的唯一安全方法是向接收應(yīng)用程序發(fā)送文件的內(nèi)容URI,并授予該URI的臨時訪問權(quán)限。具有臨時URI訪問權(quán)限的內(nèi)容URI是安全的,因為它們僅適用于接收URI的應(yīng)用程序,并且它們會自動過期。 Android FileProvider組件提供getUriForFile()方法,用于生成文件的內(nèi)容URI。
這里也會提到一個在 Android 7.0 及更高版本時經(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 中表示某個路徑需要兩個屬性,path 表示當(dāng)前指定目錄的子目錄,如果不指定則表示的是當(dāng)前指定目錄下的根目錄及子目錄,name 表示會將 name 添加的 URL 后面作為該文件的訪問路徑,參考如下:
//表示當(dāng)前要共享的文件會在 context.getFileDir() 目錄下的 images 子目錄下查找要共享的文件 <paths> <files-path path="images/" name="myImage" /> </paths> //表示最終生成的共享的文件URL content://com.example.myapp.fileprovider/myImage/image.jpg
獲取Uri
最后,配置完成之后,在所有需要使用文件相關(guān)的,在獲取 Url 時應(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 以上愉快的共享文件了,這個知識點也算是開發(fā)中經(jīng)常會遇到到。
以上就是Android 7.0應(yīng)用之間如何共享文件的詳細內(nèi)容,更多關(guān)于Android 7.0 共享文件的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android通過ViewModel保存數(shù)據(jù)實現(xiàn)多頁面的數(shù)據(jù)共享功能
- Android開發(fā)之5.0activity跳轉(zhuǎn)時共享元素的使用方法
- Android數(shù)據(jù)共享 sharedPreferences 的使用方法
- android與asp.net服務(wù)端共享session的方法詳解
- 詳解Android(共享元素)轉(zhuǎn)場動畫開發(fā)實踐
- Android 仿摩拜單車共享單車進度條實現(xiàn)StepView效果
- Android開發(fā)中多進程共享數(shù)據(jù)簡析
- Android設(shè)備間實現(xiàn)藍牙(Bluetooth)共享上網(wǎng)
- Android實現(xiàn)不同apk間共享數(shù)據(jù)的方法(2種方法)
- android編程實現(xiàn)設(shè)置、打開wifi熱點共享供他人連接的方法
- Android編程實現(xiàn)兩個Activity之間共享數(shù)據(jù)及互相訪問的方法
- android不同activity之間共享數(shù)據(jù)解決方法
相關(guān)文章
適配AndroidQ拍照和讀取相冊圖片的實現(xiàn)方法
這篇文章主要介紹了適配AndroidQ拍照和讀取相冊圖片的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
android 對話框彈出位置和透明度的設(shè)置具體實現(xiàn)方法
在android中我們經(jīng)常會用AlertDialog來顯示對話框。通過這個對話框是顯示在屏幕中心的。但在某些程序中,要求對話框可以顯示在不同的位置。2013-07-07
Android下通過httpClient發(fā)送GET和POST請求的實例代碼
這篇文章介紹了Android下通過httpClient發(fā)送GET和POST請求的實例代碼,有需要的朋友可以參考一下2013-08-08
Kotlin開發(fā)中與if等價的takeIf與takeUnless詳解
這篇文章主要介紹了Kotlin開發(fā)中與if等價的takeIf與takeUnless使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Android編程實現(xiàn)通訊錄中聯(lián)系人的讀取,查詢,添加功能示例
這篇文章主要介紹了Android編程實現(xiàn)通訊錄中聯(lián)系人的讀取,查詢,添加功能,涉及Android權(quán)限控制及通訊錄相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
Android 使用Vitamio打造自己的萬能播放器(7)——在線播放(下載視頻)
本文主要介紹Android Vitamio開發(fā)播放器,這里提供在線播放和下載視頻實例代碼,有需要的小伙伴可以參考下2016-07-07
Android開發(fā)自定義控件之折線圖實現(xiàn)方法詳解
這篇文章主要介紹了Android開發(fā)自定義控件之折線圖實現(xiàn)方法,結(jié)合實例形式詳細分析了Android自定義控件中折線圖原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2020-05-05
react native android6+拍照閃退或重啟的解決方案
android 6+權(quán)限使用的時候需要動態(tài)申請,那么在使用rn的時候要怎么處理拍照權(quán)限問題呢?本文提供的是一攬子rn操作相冊、拍照的解決方案,需要的朋友可以參考下2017-11-11

