問題記錄-Android應用內版本升級時,覆蓋安裝時報ActivityNotFoundException問題

項目內提示升級的時候,有部分華爲用戶報下載完APP後應用閃退。趕緊找機型復現了下,報錯信息如下:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.qding.guanjia, PID: 30428
    android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///storage/emulated/0/Android/data/***包名****/files/download/test.apk typ=application/vnd.android.package-archive flg=0x10000000 }
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2113)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1739)
        at android.app.Activity.startActivityForResult(Activity.java:5343)
        at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
        at android.app.Activity.startActivityForResult(Activity.java:5284)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)

基本能定位到代碼裏覆蓋安裝的問題,我們原來覆蓋安裝的代碼如下:

public static void install(Context mContext, String filepath) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.fromFile(new File(filepath)), "application/vnd.android.package-archive");
        mContext.startActivity(intent);
    }

解決方法,Android7.0以後訪問手機內文件的時候要使用FileProvider的方式:

public static void install(Context mContext, String filepath) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri apkUri = FileProvider.getUriForFile(mContext, "包名.FileProvider", new File(filepath));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(new File(filepath)), "application/vnd.android.package-archive");
        }
        mContext.startActivity(intent);
    }

如上,問題解決。

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