AndroidN7.0、8.0上自動安裝apk問題

碼農筆錄發表於2018-07-10

Android 7.0 上安裝apk android.os.FileUriExposedException問題

如果你的系統版本是 8.0+,那你需要多加一個許可權,否則無法跳轉到安裝頁

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

如果安裝報錯,可能是臨時檔案訪問路徑沒有配置,或者百度上找到的安裝程式碼是舊版本的,7.0以後不在支援,文章最下面有適配的程式碼。

android.os.FileUriExposedException: file:///storage/emulated/0/trgis/1511427343635.apk exposed beyond app through Intent.getData()

今天做自動更新的時候,自己下載好的apk安裝包呼叫系統的安裝服務就報錯,很是鬱悶,因為之前的程式碼是好著的,後來查了下資料,原來是Android N 7.0版本之後不支援之前的寫法了,好了直接上解決方案。

1.在AndroidManifest.xml application標籤中新增如下程式碼

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="你的包名.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 臨時訪問許可權
exported:必須是false
resource:中的@xml/file_paths是我們接下來要新增的檔案

2.在res/xml下新建file_paths.xml

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

注意

path:需要臨時授權訪問的路徑(.代表所有路徑)
name:就是你給這個訪問路徑起個名字

3.適配AndroidN

  • 以前我們直接 Uri.fromFile(apkFile)構建出一個Uri,現在我們使用
    FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + “.fileProvider”, apkFile);

  • BuildConfig.APPLICATION_ID直接是應用的包名

Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   /* Android N 寫法*/
   intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
   Uri contentUri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".fileProvider", new File("apk地址"));
   intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
   /* Android N之前的老版本寫法*/
   intent.setDataAndType(Uri.fromFile(new File("apk地址")), "application/vnd.android.package-archive");
   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
startActivity(intent);

關注

如果有問題,請在下方評論,或者加群討論 200909980

關注下方微信公眾號,可以及時獲取到各種技術的乾貨哦,如果你有想推薦的帖子,也可以聯絡我們的。

img_5a253571436dadabbacddb297a06dce0.png
這裡寫圖片描述


相關文章