android8.0以上自動更新apk未彈出安裝界面的解決辦法

1.爲什麼沒有彈出安裝界面?

android8.0添加了新的安全措施,不允許應用內安裝未經過Google play驗證的應用

所以在自動更新之前我們應該判斷一下是否擁有安裝未知應用的權限

  • 清單文件中添加權限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 
  • 檢測是否擁有安裝未知應用權限canRequestPackageInstalls
@RequiresApi(api = Build.VERSION_CODES.O)
private boolean isHasInstallPermissionWithO(Context context){
    if (context == null){
        return false;
    }
    return context.getPackageManager().canRequestPackageInstalls();
}
  • 如果沒有權限,則申請安裝未知應用權限(打開獲取權限界面)
@RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity(Context context) {
        if (context == null) {
            return;
        }
        Intent intent = new Intent();
        //獲取當前apk包URI,並設置到intent中(這一步設置,可讓“未知應用權限設置界面”只顯示當前應用的設置項)
        Uri packageURI = Uri.parse("package:" + context.getPackageName());
        intent.setData(packageURI);
        //設置不同版本跳轉未知應用的動作
        if (Build.VERSION.SDK_INT >= 26) {
            //intent = new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
            intent.setAction(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
        } else {
            intent.setAction(android.provider.Settings.ACTION_SECURITY_SETTINGS);
        }
        ((Activity) context).startActivity(intent);
        Toast.makeText(mContext, "請打開未知應用安裝權限", Toast.LENGTH_SHORT).show();
    }
  • 獲取到權限之後,安裝應用(打開軟件安裝界面)
intent.setAction(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= 24) {
                LogUtil.trace(TAG, "<func: installApk> Build.VERSION.SDK_INT >= 24");
                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", new File(tmpApk));
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            } else {
                intent.setDataAndType(Uri.fromFile(new File(tmpApk)), "application/vnd.android.package-archive");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }

            context.startActivity(intent);

此時應用程序就可以正常安裝了。下面是一個完整的安裝代碼:

public boolean installApk(Context context) throws Exception {
        try {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
			
			//檢查是否擁有安裝未知應用的權限,如果沒有則申請
            if(Build.VERSION.SDK_INT >= 26){
                boolean hasInstallPermission = isHasInstallPermissionWithO(mContext);
                if (!hasInstallPermission) {
                    startInstallPermissionSettingActivity(mContext);
                    return false;
                }
            }
			
			//如果擁有安裝未知權限則打開安裝應用界面
            if (Build.VERSION.SDK_INT >= 24) {
                LogUtil.trace(TAG, "<func: installApk> Build.VERSION.SDK_INT >= 24");
                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", new File(tmpApk));
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            } else {
                intent.setDataAndType(Uri.fromFile(new File(tmpApk)), "application/vnd.android.package-archive");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
			//打開安裝應用界面
            context.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
            LogUtil.error(TAG, "<func: installApk> exception : " + e.getMessage());
            ToastUtil.makeText(context, "安裝失敗!", Toast.LENGTH_SHORT);
            return false;
        }
        return true;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章