欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android7.0行為變更之適配File Provider的方法

 更新時(shí)間:2018年04月17日 09:53:07   作者:TheShy_  
這篇文章主要介紹了Android7.0行為變更之適配File Provider的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

兩個(gè)小解釋:

FileProvider是ContentProvider特殊的子類,ContentProvider通過(guò)創(chuàng)建content:// Uri來(lái)替代file:/// Uri。

在Android 7.0的以上的系統(tǒng)中,嘗試傳遞file://URI可能會(huì)觸發(fā)FileUriExposedException

FileProvider的這個(gè)概述包括以下主題:

1.定義FileProvider

2.指定可用文件

3.檢索文件的Content URI

4.授予URI的臨時(shí)權(quán)限

5.將內(nèi)容URI提供給其他應(yīng)用程序

第一步:定義FileProvider:

//清單文件中
 <provider
    android:name="android.support.v4.content.FileProvider"http://固定
    android:authorities="${applicationId}.yourname"http://根據(jù)您控制的域?qū)傩栽O(shè)置為URI權(quán)限
    android:exported="false"http://FileProvider不需要公開(kāi)
    android:grantUriPermissions="true">//允許您授予對(duì)文件的臨時(shí)訪問(wèn)權(quán)限
    ...
</provider>

第二步:指定可用文件

//新建一個(gè)xml文件用于存放應(yīng)用需要共享的目錄文件
//以下paths元素告訴FileProvider您打算為images/私有文件區(qū)域的子目錄請(qǐng)求內(nèi)容URI
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <files-path name="my_images" path="images/"/>
  ...
</paths>

該元素必須包含一個(gè)或多個(gè)以下子元素:

//代表內(nèi)部存儲(chǔ)空間應(yīng)用私有目錄下的 files/ 目錄,等同于 Context.getFilesDir() 所獲取的目錄路徑;
<files-path name = “ name ” path = “ path ” />
//代表內(nèi)部存儲(chǔ)空間應(yīng)用私有目錄下的 cache/ 目錄,等同于 Context.getCacheDir() 所獲取的目錄路徑;
<cache-path name = “ name ” path = “ path ” />
//代表外部存儲(chǔ)空間根目錄,等同于 Environment.getExternalStorageDirectory() 所獲取的目錄路徑;
<external-path name = “ name ” path = “ path ” />
//代表外部存儲(chǔ)空間應(yīng)用私有目錄下的 files/ 目錄,等同于 Context.getExternalFilesDir(null) 所獲取的目錄路徑;
<external-files-path name = “ name ” path = “ path ” />
//代表外部存儲(chǔ)空間應(yīng)用私有目錄下的 cache/ 目錄,等同于 Context.getExternalCacheDir();
<external-cache-path name = “ name ” path = “ path ” />
//代表外部媒體區(qū)域根目錄中的文件。等同于Context.getExternalMediaDirs()。
<external-media-path name = “ name ” path = “ path ” />

這些子元素都使用兩個(gè)相同的屬性:

name="name"
一個(gè)URI路徑段。 用于給 path 屬性所指定的子目錄名稱取一個(gè)別名 為了提高安全性,此值將隱藏您要共享的子目錄的名稱。該值的子目錄名稱包含在該 path屬性中。
path="path"
你正在分享的子目錄。雖然該name屬性是一個(gè)URI路徑段,但該path值是實(shí)際的子目錄名稱。請(qǐng)注意,該值是指一個(gè)子目錄,而不是獨(dú)立文件名。您無(wú)法通過(guò)文件名共享單個(gè)文件,也無(wú)法使用通配符指定文件的子集。

第三步:檢索文件的 Content URI

//使用 FileProvider 類提供的公有靜態(tài)方法 getUriForFile 生成 Content URI
//第一個(gè)參數(shù):context上下文
//第二個(gè)參數(shù): Manifest 文件中注冊(cè) FileProvider 時(shí)設(shè)置的 authorities 屬性值
//第三個(gè)參數(shù):要共享的文件,并且這個(gè)文件一定位于第二步我們?cè)?path 文件中添加的子目錄里面
Uri contentUri = FileProvider.getUriForFile(this,
   BuildConfig.APPLICATION_ID + ".myprovider", myFile);

第四步:授予URI的臨時(shí)權(quán)限

授權(quán)方式有兩種:

第一種方式:

//調(diào)用方法:
//參數(shù)1:授權(quán)訪問(wèn) URI 對(duì)象的其他應(yīng)用包名
//參數(shù)2:授權(quán)訪問(wèn)的 Uri 對(duì)象
//參數(shù)3:授權(quán)類型FLAG_GRANT_READ_URI_PERMISSION 或者 FLAG_GRANT_WRITE_URI_PERMISSION
    (或者二者同時(shí)授權(quán)。這種形式的授權(quán)方式,權(quán)限有效期截止至發(fā)生設(shè)備重啟或者手動(dòng)調(diào)用 revokeUriPermission() 方法撤銷授權(quán)時(shí))
grantUriPermission(package, Uri, mode_flags)

第二種方式:

//配合intent使用
//權(quán)限有效期截止至其它應(yīng)用所處的堆棧銷毀,并且一旦授權(quán)給某一個(gè)組件后,該應(yīng)用的其它組件擁有相同的訪問(wèn)權(quán)限。
Intent.setFlags() 或者 Intent.addFlags()
Intent.setData(Uri uri);

第五步:將內(nèi)容URI提供給其他應(yīng)用程序

//通過(guò)以下方法啟動(dòng)其他應(yīng)用并傳遞授權(quán)過(guò)的 Content URI 數(shù)據(jù)。當(dāng)然,也有其他方式提供服務(wù)。
startActivity() 

或者

startActivityResult()

或者

setResult()

官方原文(需要自備梯子,想自己搭的教程點(diǎn)擊這里): Google Develpers - FileProvider

以下是一個(gè)我這邊的例子:

場(chǎng)景:版本更新完成時(shí)打開(kāi)新版本 apk 文件實(shí)現(xiàn)自動(dòng)安裝

//在 res/xml 目錄下新建一個(gè)filepath文件 并指定子目錄路徑信息
<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path name="external_path" path="."/>
  <cache-path name="cache_path" path="."/>
</paths>
//Manifest 文件中注冊(cè) FileProvider 對(duì)象,并鏈接上面的 path 路徑文件
<provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="com.xxx.FileProvider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/filepath"/>
</provider>
//授權(quán) 打開(kāi)安裝管理器安裝apk包
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri uri = UriUtil.getUriForFile(BitZApplication.mContext.get(), new File((String) msg.obj));
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);
//UriUtil工具類:
public static Uri getUriForFile(Context context, File file) {
    if (context == null || file == null) {
      throw new NullPointerException();
    }
    Uri uri;
    if (Build.VERSION.SDK_INT >= 24) {
      uri = FileProvider.getUriForFile(context, "com.xxx.FileProvider", file);
    } else {
      uri = Uri.fromFile(file);
    }
    return uri;
  }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android開(kāi)發(fā)使用RecyclerView添加點(diǎn)擊事件實(shí)例詳解

    Android開(kāi)發(fā)使用RecyclerView添加點(diǎn)擊事件實(shí)例詳解

    這篇文章主要為大家介紹了Android開(kāi)發(fā)使用RecyclerView添加點(diǎn)擊事件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Android客戶端首次啟動(dòng)引導(dǎo)界面

    Android客戶端首次啟動(dòng)引導(dǎo)界面

    這篇文章主要為大家詳細(xì)介紹了Android客戶端首次啟動(dòng)引導(dǎo)界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android Intent基礎(chǔ)用法及作用詳解

    Android Intent基礎(chǔ)用法及作用詳解

    Intent是一種重要的消息傳遞對(duì)象,用于在不同組件(如活動(dòng)(Activity)、服務(wù)(Service)、廣播接收器(BroadcastReceiver)等)之間進(jìn)行通信和交互,本文介紹Android Intent基礎(chǔ)用法及作用,感興趣的朋友一起看看吧
    2024-07-07
  • Android編程之文件的讀寫(xiě)實(shí)例詳解

    Android編程之文件的讀寫(xiě)實(shí)例詳解

    這篇文章主要介紹了Android編程之文件的讀寫(xiě)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android針對(duì)文件操作的詳細(xì)步驟,常用函數(shù)及使用技巧,需要的朋友可以參考下
    2015-12-12
  • android 選項(xiàng)卡(TabHost)如何放置在屏幕的底部

    android 選項(xiàng)卡(TabHost)如何放置在屏幕的底部

    如何將TAB放置在屏幕的底端,有很多的新手都想實(shí)現(xiàn)這種效果,本文搜集整理了一些,感興趣的朋友可以參考下哦
    2013-01-01
  • Android Studio設(shè)置顏色拾色器工具Color Picker教程

    Android Studio設(shè)置顏色拾色器工具Color Picker教程

    這篇文章主要介紹了Android Studio設(shè)置顏色拾色器工具Color Picker教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Flutter 利用CustomScrollView實(shí)現(xiàn)滑動(dòng)效果

    Flutter 利用CustomScrollView實(shí)現(xiàn)滑動(dòng)效果

    我們可以使用ListView將幾個(gè)GridView組合在一起實(shí)現(xiàn)了不同可滑動(dòng)組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動(dòng),防止多個(gè)滑動(dòng)組件的沖突。這種方式寫(xiě)起來(lái)不太方便,事實(shí)上 Flutter 提供了 CustomScrollView 來(lái)粘合多個(gè)滑動(dòng)組件,并且可以實(shí)現(xiàn)更有趣的滑動(dòng)效果。
    2021-06-06
  • Android 8.0不能自動(dòng)安裝APK問(wèn)題的解決方法(完美適配)

    Android 8.0不能自動(dòng)安裝APK問(wèn)題的解決方法(完美適配)

    這篇文章主要給大家介紹了關(guān)于Android 8.0不能自動(dòng)安裝APK問(wèn)題的解決方法(完美適配),這里的自動(dòng)安裝是指下載完成后,自動(dòng)彈出安裝界面,而不是靜默安裝APK,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • Kotlin之在Gradle中無(wú)參(no-arg)編譯器插件的使用詳解

    Kotlin之在Gradle中無(wú)參(no-arg)編譯器插件的使用詳解

    這篇文章主要介紹了Kotlin之在Gradle中無(wú)參(no-arg)編譯器插件的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Android Studio自動(dòng)排版的兩種實(shí)現(xiàn)方式

    Android Studio自動(dòng)排版的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了Android Studio自動(dòng)排版的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03

最新評(píng)論