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

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

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

瀏覽:124日期: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
相關文章:
主站蜘蛛池模板: 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 中央空调温控器_风机盘管温控器_智能_液晶_三速开关面板-中央空调温控器厂家 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 电子天平-华志电子天平厂家 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 仿真茅草_人造茅草瓦价格_仿真茅草厂家_仿真茅草供应-深圳市科佰工贸有限公司 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 楼承板-开闭口楼承板-无锡海逵楼承板 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 中国在职研究生招生信息网 | 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 不发火防静电金属骨料_无机磨石_水泥自流平_修补砂浆厂家「圣威特」 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 |