Android 7.0 更新APK在安裝時的報錯 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.bjhl.education/files/xxx.apk exposed beyond app through Intent.getData()

1、在AndroidManifest.xml中添加如下代碼

<provider

? ? ? ? ? ? ? ?android:name="android.support.v4.content.FileProvider"

? ? ? ? ? ? ? ?android:authorities="app的包名.fileProvider"

? ? ? ? ? ? ? ?android:grantUriPermissions="true"

? ? ? ? ? ? ? ?android:exported="false">

? ? ? ? ? ? ? <meta-data

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? android:name="android.support.FILE_PROVIDER_PATHS"

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? android:resource="@xml/file_paths"/>

</provider>


注意:

authorities:app的包名.fileProvider

grantUriPermissions:必須是true,表示授予 URI 臨時訪問權(quán)限

exported:必須是false

resource:中的@xml/file_paths是我們接下來要添加的文件

2、在res目錄下新建一個xml文件夾,并且新建一個file_paths的xml文件(如下圖)


3、打開file_paths.xml文件添加如下內(nèi)容

<?xml version="1.0" encoding="utf-8"?>

<paths>

? ? ? ? ? ? ?<external-path path="Android/data/app的包名/" name="files_root"/>

? ? ? ? ? ? ?<external-path path="." name="external_storage_root"/>

</paths>

path:需要臨時授權(quán)訪問的路徑(.代表所有路徑)

name:就是你給這個訪問路徑起個名字

4、修改代碼適配Android N

Intentintent =newIntent(Intent.ACTION_VIEW);

//判斷是否是AndroidN以及更高的版本

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N) {

? ? ? ? ? ? ?Uri contentUri = FileProvider.getUriForFile(context,"com.bjhl.education.fileProvider",file);

? ? ? ? ? ? ?intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

? ? ? ? ? ? ?intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

? ? ? ? ? ? ?intent.setDataAndType(contentUri,"application/vnd.android.package-archive");

}else{

? ? ? ? ? ? ?intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

? ? ? ? ? ? ?intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");

}

context.startActivity(intent);

1、首先我們對Android N及以上做判斷;

2、然后添加flags,表明我們要被授予什么樣的臨時權(quán)限

3、以前我們直接Uri.fromFile(apkFile)構(gòu)建出一個Uri,現(xiàn)在我們使用FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);

4、BuildConfig.APPLICATION_ID直接是應(yīng)用的包名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android N系列適配---FileProvider Android 7.0的適配,主要包含方面: Andro...
    25a58172fbb5閱讀 7,261評論 3 32
  • 只簡述我發(fā)現(xiàn)問題的根源,有些是適配了7.0,會報權(quán)限失敗問題,那是由于沒有動態(tài)授權(quán)導(dǎo)致,接下來我一步一步給大家實現(xiàn)...
    Wocus閱讀 2,451評論 4 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,936評論 25 709
  • Android7.0發(fā)布已經(jīng)有一個多月了,Android7.0在給用戶帶來一些新的特性的同時,也給開發(fā)者帶來了新的...
    東經(jīng)315度閱讀 1,420評論 0 14
  • 今天在手繪群里,給一個小伙伴分享了測量法,所以也想把這個簡單的素描小知識分享給更多的小伙伴。 學(xué)過素描的肯定都知道...
    李文茵閱讀 1,686評論 7 17

友情鏈接更多精彩內(nèi)容