电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

基于Android FileProvider 屬性配置詳解及FileProvider多節點問題

瀏覽:128日期:2022-09-25 17:37:36

眾所周知在android7.0,修改了對私有存儲的限制,導致在獲取資源的時候,不能通過Uri.fromFile來獲取uri了我們需要適配7.0+的機型需要這樣寫:

1:代碼適配

if (Build.VERSION.SDK_INT > 23) {//intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri contentUri = FileProvider.getUriForFile(context, SysInfo.packageName + '.fileProvider', outputFile);intent.setDataAndType(contentUri, 'application/vnd.android.package-archive'); } else {intent.setDataAndType(Uri.fromFile(outputFile), 'application/vnd.android.package-archive'); }

2:創建provider_paths.xml

<?xml version='1.0' encoding='utf-8'?><paths xmlns:android='http://schemas.android.com/apk/res/android'> <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk--> <external-path name='beta_external_path' path='Download/'/> <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/--> <external-path name='beta_external_files_path' path='Android/data/'/> </paths>

其中 provider_path屬性詳解

name和path

name:uri路徑片段。為了執行安全,這個值隱藏你所共享的子目錄名。此值的子目錄名包含在路徑屬性中。

path:你所共享的子目錄。雖然name屬性是一個URI路徑片段,但是path是一個真實的子目錄名。注意,path是一個子目錄,而不是單個文件或者多個文件。

1.files-path

代表與Context.getFileDir()相同的文件路徑

2.cache-path

<cache-path name='name' path='path' />

代表與getCacheDir()相同的文件路徑

3.external-path

<external-path name='name' path='path' />

代表與Environment.getExternalStorageDirectory()相同的文件路徑

4.external-files-path

<external-files-path name='name' path='path' />

代表與Context#getExternalFilesDir(String) 和Context.getExternalFilesDir(null)相同的文件路徑

5.external-cache-path

<external-cache-path name='name' path='path' />

代表與Context.getExternalCacheDir()相同的文件路徑

6:配置AndroidManifest.xml

android:authorities在FileProvider中使用

<provider android:name='android.support.v4.content.FileProvider' android:authorities='com.mydomain.fileprovider' android:exported='false' android:grantUriPermissions='true'> <meta-data android:name='android.support.FILE_PROVIDER_PATHS' android:resource='@xml/file_paths' /> </provider>

7:使用FileProvider

*** 返回URI:content://com.mydomain.fileprovider/my_images/default_image.jpg.File imagePath = new File(Context.getFilesDir(), 'images'); File newFile = new File(imagePath, 'default_image.jpg'); Uri contentUri = getUriForFile(getContext(), 'com.mydomain.fileprovider', newFile);

8.自定義FileProvider

class MyFileProvider extends FileProvider {}

AndroidMenifest.xml中配置 android:authorities即可

3:我們項目中可能會用到其他一些第三方sdk有用到拍照功能的話,他也為了適配android7.0也添加了這個節點,此時有些人可能就不知道如何下手了,其實很簡單我們只要重寫一個類 繼承自FileProvider,然后就按上述方法在添加一個節點就可以了:

<provider android:name='com.blueZhang.MyFileProvider' android:authorities='${applicationId}.provider' android:grantUriPermissions='true' android:exported='false'> <meta-data android:name='android.support.FILE_PROVIDER_PATHS' android:resource='@xml/cust_file_paths' /></provider>

如果你不想自定義FileProvider,那么還有一種方法,那就是把第三方sdk中的路徑配置copy到provider_paths.xml即可。

如下所示:

<?xml version='1.0' encoding='utf-8'?><paths xmlns:android='http://schemas.android.com/apk/res/android'> <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk--> <external-path name='beta_external_path' path='Download/'/> <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/--> <external-path name='beta_external_files_path' path='Android/data/'/> <external-path name='external_storage_root' path='.'/> <files-path name='files' path='.'/> </paths>

注意⚠️:在使用provider時 配置路徑 path='.'代表所有路徑

生成 Content URI

在 Android 7.0 出現之前,我們通常使用 Uri.fromFile() 方法生成一個 File URI。這里,我們需要使用 FileProvider 類提供的公有靜態方法 getUriForFile 生成 Content URI。

比如:

Uri contentUri = FileProvider.getUriForFile(this,BuildConfig.APPLICATION_ID + '.fileProvider', myFile);

需要傳遞三個參數。第二個參數便是 Manifest 文件中注冊 FileProvider 時設置的 authorities 屬性值,第三個參數為要共享的文件,并且這個文件一定位于第二步我們在 path 文件中添加的子目錄里面。

舉個例子:

String filePath = Environment.getExternalStorageDirectory() + '/images/'+System.currentTimeMillis()+'.jpg';File outputFile = new File(filePath);if (!outputFile.getParentFile().exists()) { outputFile.getParentFile().mkdir();}Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + '.fileProvider', outputFile);

生成的 Content URI 是這樣的:

content://com.yifeng.samples.myprovider/my_images/1493715330339.jpg

其中,構成 URI 的 host 部分為 <provider> 元素的 authorities 屬性值(applicationId + customname),path 片段 my_images 為 res/xml 文件中指定的子目錄別名(真實目錄名為:images)。

第四步,授予 Content URI 訪問權限

生成 Content URI 對象后,需要對其授權訪問權限。授權方式有兩種:

第一種方式,使用 Context 提供的 grantUriPermission(package, Uri, mode_flags) 方法向其他應用授權訪問 URI 對象。三個參數分別表示授權訪問 URI 對象的其他應用包名,授權訪問的 Uri 對象,和授權類型。其中,授權類型為 Intent 類提供的讀寫類型常量:

FLAG_GRANT_READ_URI_PERMISSION

FLAG_GRANT_WRITE_URI_PERMISSION

或者二者同時授權。這種形式的授權方式,權限有效期截止至發生設備重啟或者手動調用 revokeUriPermission() 方法撤銷授權時。

第二種方式,配合 Intent 使用。通過 setData() 方法向 intent 對象添加 Content URI。然后使用 setFlags() 或者 addFlags() 方法設置讀寫權限,可選常量值同上。這種形式的授權方式,權限有效期截止至其它應用所處的堆棧銷毀,并且一旦授權給某一個組件后,該應用的其它組件擁有相同的訪問權限。

第五步,提供 Content URI 給其它應用

擁有授予權限的 Content URI 后,便可以通過 startActivity() 或者 setResult() 方法啟動其他應用并傳遞授權過的 Content URI 數據。當然,也有其他方式提供服務。

如果你需要一次性傳遞多個 URI 對象,可以使用 intent 對象提供的 setClipData() 方法,并且 setFlags() 方法設置的權限適用于所有 Content URIs。

常見使用場景

前面介紹的內容都是理論部分,在 開發者官方 FileProvider 部分 都有所介紹。接下來我們看看,實際開發一款應用的過程中,會經常遇見哪些 FileProvider 的使用場景。

自動安裝文件

版本更新完成時打開新版本 apk 文件實現自動安裝的功能,應該是最常見的使用場景,也是每個應用必備功能之一。常見操作為,通知欄顯示下載新版本完畢,用戶點擊或者監聽下載過程自動打開新版本 apk 文件。適配 Android 7.0 版本之前,我們代碼可能是這樣:

File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), 'app_sample.apk'); Intent installIntent = new Intent(Intent.ACTION_VIEW);installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);installIntent.setDataAndType(Uri.fromFile(apkFile), 'application/vnd.android.package-archive');startActivity(installIntent)

現在為了適配 7.0 及以上版本的系統,必須使用 Content URI 代替 File URI。

在 res/xml 目錄下新建一個 file_provider_paths.xml 文件(文件名自由定義),并添加子目錄路徑信息:

<?xml version='1.0' encoding='utf-8'?><paths xmlns:android='http://schemas.android.com/apk/res/android'> <external-files-path name='my_download' path='Download'/> </paths>

然后在 Manifest 文件中注冊 FileProvider 對象,并鏈接上面的 path 路徑文件:

<provider android:name='android.support.v4.content.FileProvider' android:authorities='com.yifeng.samples.myprovider' android:exported='false' android:grantUriPermissions='true'> <meta-data android:name='android.support.FILE_PROVIDER_PATHS' android:resource='@xml/file_provider_paths'/> </provider>

修改 java 代碼,根據 File 對象生成 Content URI 對象,并授權訪問:

File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), 'app_sample.apk');Uri apkUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID+'.fileProvider', apkFile); Intent installIntent = new Intent(Intent.ACTION_VIEW);installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);installIntent.setDataAndType(apkUri, 'application/vnd.android.package-archive');startActivity(installIntent);

好了 有不明白的 及時聯系

以上這篇基于Android FileProvider 屬性配置詳解及FileProvider多節點問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格| 方源木业官网-四川木门-全国木门专业品牌 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 天然气分析仪-液化气二甲醚分析仪|传昊仪器 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 广西教师资格网-广西教师资格证考试网 | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 识禅_对禅的了解,从这里开始 | 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | 潍坊大集网-潍坊信息港-潍坊信息网 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 天长市晶耀仪表有限公司 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 |