溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Android 7.0應(yīng)用之間對(duì)文件進(jìn)行共享

發(fā)布時(shí)間:2020-12-24 13:58:27 來(lái)源:億速云 閱讀:166 作者:Leah 欄目:開發(fā)技術(shù)

怎么在Android 7.0應(yīng)用之間對(duì)文件進(jìn)行共享?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

開發(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 的方式來(lái)授予臨時(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ì)遇到到。

關(guān)于怎么在Android 7.0應(yīng)用之間對(duì)文件進(jìn)行共享問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI