安卓7.0 Uri.fromFile(file)報錯隨筆

android.os.FileUriExposedException:

1.前段時間,項目剛剛上線,然後,大家懂得--各種7.0崩潰

2.然後這個問題搞定了,下一個項目的時候7.0這個問題對吧,肯定得解決。然後複製,粘貼。 砰....崩潰


下面是我自己解決這兩個問題的方法,分享給大家(百度上面也有,我自己想自己遇到的還是得積累積累)

報錯原因:android7.0對於系統權限作了一些更改,爲了提高私有文件的安全性,當我們在訪問文件的時候,安卓禁止您的應用外部公開file://uri 

解決思路:需要在應用之間共享文件,那就少不了FileProvider類


第一步 在清單文件下注冊

<provider
    android:name="android.support.v4.content.FileProvider"

    //此處的provider需要和代碼中的provider保持一致
    android:authorities="你的包名.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>



第二步 res/xml/provider_paths類
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="" />

    <external-path
        name="files_root"
        path="Android/data/你的包名/download/"/>
</paths>
(第一個path是我用來解決7.0權限的,第二個是用於更新的)
第三步 在代碼中將Uri.fromFile替換
if (Build.VERSION.SDK_INT >= 24) {
    uri = FileProvider.getUriForFile(this,"你的包名.provider", file);
} else {
    uri = Uri.fromFile(file);
}
更新部分
private void installApk(Context context, File file) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Uri contentUri = FileProvider.getUriForFile(getApplicationContext(), "packagename.provider", file);
        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 provider需要保證它的唯一性,即在不同的app裏面需要使用不同的名稱建議項目名+provider
2 如果你兩個項目使用了同一個provider,真機上根本無法裝載哦
3 注意你的代碼裏面的provider名字需要和清單的provider名字一致,否則會報空








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章