日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

基于Android FileProvider 屬性配置詳解及FileProvider多節(jié)點(diǎn)問題

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

眾所周知在android7.0,修改了對(duì)私有存儲(chǔ)的限制,導(dǎo)致在獲取資源的時(shí)候,不能通過Uri.fromFile來獲取uri了我們需要適配7.0+的機(jī)型需要這樣寫:

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:創(chuàng)建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路徑片段。為了執(zhí)行安全,這個(gè)值隱藏你所共享的子目錄名。此值的子目錄名包含在路徑屬性中。

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

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:我們項(xiàng)目中可能會(huì)用到其他一些第三方sdk有用到拍照功能的話,他也為了適配android7.0也添加了這個(gè)節(jié)點(diǎn),此時(shí)有些人可能就不知道如何下手了,其實(shí)很簡單我們只要重寫一個(gè)類 繼承自FileProvider,然后就按上述方法在添加一個(gè)節(jié)點(diǎn)就可以了:

<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時(shí) 配置路徑 path='.'代表所有路徑

生成 Content URI

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

比如:

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

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

舉個(gè)例子:

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

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

第四步,授予 Content URI 訪問權(quán)限

生成 Content URI 對(duì)象后,需要對(duì)其授權(quán)訪問權(quán)限。授權(quán)方式有兩種:

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

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í)。

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

第五步,提供 Content URI 給其它應(yīng)用

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

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

常見使用場景

前面介紹的內(nèi)容都是理論部分,在 開發(fā)者官方 FileProvider 部分 都有所介紹。接下來我們看看,實(shí)際開發(fā)一款應(yīng)用的過程中,會(huì)經(jīng)常遇見哪些 FileProvider 的使用場景。

自動(dòng)安裝文件

版本更新完成時(shí)打開新版本 apk 文件實(shí)現(xiàn)自動(dòng)安裝的功能,應(yīng)該是最常見的使用場景,也是每個(gè)應(yīng)用必備功能之一。常見操作為,通知欄顯示下載新版本完畢,用戶點(diǎn)擊或者監(jiān)聽下載過程自動(dòng)打開新版本 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)

現(xiàn)在為了適配 7.0 及以上版本的系統(tǒng),必須使用 Content URI 代替 File URI。

在 res/xml 目錄下新建一個(gè) 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 文件中注冊(cè) FileProvider 對(duì)象,并鏈接上面的 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 代碼,根據(jù) File 對(duì)象生成 Content URI 對(duì)象,并授權(quán)訪問:

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);

好了 有不明白的 及時(shí)聯(lián)系

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲免费福利| 国产精品亚洲四区在线观看| 麻豆久久久久久| 欧美影院视频| 国产亚洲第一伦理第一区| 欧美一区在线观看视频| 国产精品主播| 久久97视频| 精品一区二区三区在线观看视频| 亚久久调教视频| 日本一区二区三区中文字幕| 蜜臀91精品一区二区三区| 免费在线观看不卡| 最近国产精品视频| 国产精品毛片aⅴ一区二区三区| 国产精品欧美在线观看| 久久一区国产| 久久久久免费| 久久久久久久久丰满| 国精品一区二区三区| 亚洲黄色在线| 综合视频一区| 国产精品视频3p| 日韩88av| 日韩精品永久网址| re久久精品视频| 蜜臀91精品一区二区三区| 欧美久久亚洲| av资源新版天堂在线| 91久久久精品国产| 四虎成人精品一区二区免费网站| 国产欧美成人| 三级在线看中文字幕完整版| 激情欧美国产欧美| 亚洲三级av| 你懂的国产精品永久在线| 日韩欧美一区免费| 夜夜嗨网站十八久久| 欧美日韩亚洲一区三区| 国产精品伦一区二区| 亚洲涩涩在线| 蜜桃视频在线观看一区| 国产精品白丝av嫩草影院| 日韩一区电影| 喷白浆一区二区| 国产亚洲欧美日韩精品一区二区三区 | 黄色免费成人| 日本成人在线网站| 国产成人精选| 亚洲综合欧美| 久久99久久久精品欧美| 久久久人人人| 日韩欧美在线精品| 国产一区二区三区四区五区传媒| 欧美.日韩.国产.一区.二区| 日韩精品一级| 成人午夜精品| 亚洲免费专区| 国产h片在线观看| 蜜臀久久99精品久久久画质超高清| 国产精品流白浆在线观看| 亚洲国产福利| 中文字幕日韩亚洲| 色在线中文字幕| 日日摸夜夜添夜夜添国产精品| 国产精品精品| 日韩欧美美女在线观看| 国产 日韩 欧美一区| 亚洲精品一级二级三级| 日韩一区二区三区免费| 日韩1区2区3区| av日韩中文| 婷婷五月色综合香五月| 成人精品中文字幕| 久久国内精品视频| 99国产精品久久久久久久成人热| 国产日韩高清一区二区三区在线 | 欧美.日韩.国产.一区.二区| 国产精品一区二区三区四区在线观看| 午夜精品影院| 国产精品99一区二区三| 少妇精品久久久一区二区| 成人羞羞视频播放网站| 久久国产乱子精品免费女| 黄色在线一区| 吉吉日韩欧美| 国产三级一区| 玖玖玖国产精品| 欧美日韩中文一区二区| 国产日韩三级| 在线精品视频一区| 国精品一区二区| 中文字幕在线免费观看视频| 国产毛片精品| 蜜芽一区二区三区| 久久精品国产大片免费观看| 老司机精品视频网| 青青国产精品| 亚洲综合福利| 夜夜精品视频| 四虎4545www国产精品 | 日本欧美韩国一区三区| 99成人在线| 99久久亚洲精品蜜臀| 国产一区二区三区亚洲综合| 国产日韩欧美三区| 日韩三区四区| 免费在线看一区| 免费久久精品| 日韩精品影视| 日韩国产一区| 97精品视频在线看| 国产一区二区三区视频在线| 国产极品一区| 国产精品超碰| 亚洲欧洲美洲国产香蕉| 国产一级一区二区| 亚洲免费精品| 婷婷中文字幕一区| 99久久99视频只有精品| 欧美日韩精品免费观看视欧美高清免费大片 | 国产精品亚洲四区在线观看 | 三级亚洲高清视频| 在线视频观看日韩| 久久精品欧美一区| 99久久精品国产亚洲精品| 日韩一区欧美| 日韩免费小视频| 欧美日韩视频网站| 午夜欧美巨大性欧美巨大| 国产理论在线| 三级精品视频| 国产一在线精品一区在线观看| 久久国产电影| 九九在线精品| 亚洲一区区二区| 蜜臀久久99精品久久久久宅男| 午夜宅男久久久| 野花国产精品入口| 免费在线看一区| 亚州精品视频| 国产乱码精品一区二区三区四区 | 国产精品jk白丝蜜臀av小说| 国产精品1区| 色欧美自拍视频| 久久免费国产| 亚洲午夜电影| 久久国产高清| 日本欧美在线| 欧美精品91| 欧美韩日一区| 欧洲一级精品| 亚洲免费激情| 日韩精品一区二区三区免费视频| 欧美亚洲福利| 高清日韩中文字幕| 日韩精品免费一区二区三区| 午夜在线精品| 国产精品一区二区精品视频观看 | 日韩av影院| 久久中文字幕导航| 国产综合色区在线观看| 国产一区视频在线观看免费| 久久亚洲色图| 国产乱码精品一区二区三区亚洲人| 久久只有精品| 欧美+日本+国产+在线a∨观看| 三级欧美在线一区| 久久wwww| 91精品精品| 天堂精品久久久久| 国内自拍视频一区二区三区| 99久久精品费精品国产| 蜜臀精品久久久久久蜜臀| 久久国产精品色av免费看| 成人av三级| 另类激情亚洲| 欧美日韩国产一区二区在线观看| 国产aⅴ精品一区二区三区久久| 狠狠色狠狠色综合日日tαg| 日韩精品免费视频人成| 福利一区和二区| 亚洲制服少妇| 久久精品免视看国产成人| 久久国产日本精品| 日韩激情网站| 久久久久久久久99精品大| 日韩久久99| 欧美日韩尤物久久| 四虎精品永久免费| 成人羞羞在线观看网站| 日韩高清二区| 日韩欧美字幕| 日韩视频1区| 久久久久国产精品一区三寸| 日韩va亚洲va欧美va久久| 成人日韩在线观看| 18国产精品| 国产日韩专区| 精品久久视频|