1. 程式人生 > >安卓App報錯:android.os.FileUriExposedException

安卓App報錯:android.os.FileUriExposedException

安卓7.0開始,不再允許在App中把 file://Uri 暴露給其他App,因此在程式碼中需要做下版本判斷,在7.0版本及以上需要使用 FileProvider 生成 content://Uri 來代替 file://Uri。同時安卓工程需要做以下調整:

1、在 AndroidManifest.xml 的 application 標籤頁下增加 provider 宣告

    <application
        ......
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.smartphone.wifikey.fileProvider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepath" />
        </provider>
    </application>

以上內容需注意 android:authorites 必須填寫為實際訪問的 App 包名稱。

2、在 res 目錄下建立 xml 資料夾,新建 filepath.xml 並填寫以下內容

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

3、程式碼中增加對7.0版本的判斷與處理

    private void installApk(File apkFile) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //判斷是否是Android N以及更高的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(mContext, "com.smartphone.wifikey" + ".fileProvider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        startActivity(intent);
    }

以上程式碼必須注意,getUriForFile 方法的第二個引數必須為”實際訪問的App包名.fileProvider”。另外在測試時,如果出現其他異常,留心檢查下應用許可權。

有問題給我郵件或者評論哦,覺得對你有幫助就點贊吧~:-)