从运行Oreo且没有REQUEST_INSTALL_PACKAGES的Android应用程序安装apk

问题描述 投票:2回答:2

我正在开发一个具有Autoupdate功能的Android应用程序,我正在开发这个应用程序的Android设备没有谷歌播放所以我必须上传新版本的新版本,当有更新和每次应用程序时以编程方式检查如果有新版本打开,如果有一个我下载它(apk)然后使用此代码安装

Uri apkUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(apkUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, 123);

它运行没有任何问题,因为运行该应用程序的设备运行Android 7.最近,该设备升级到Android 8,该功能停止工作,搜索了很多天后,我发现我必须采取一个名为REQUEST_INSTALL_PACKAGE的权限来安装新的软件包https://developer.android.com/reference/android/Manifest.permission.html#REQUEST_INSTALL_PACKAGES从Android API 25开始,正如文档在此链接中所述。我现在有两个问题;

第一:我没有在旧apk中包含此权限,因此旧apk的所有用户都必须卸载旧的apk并手动安装新的apk(新的一个是具有REQUEST_INSTALL_PACKAGE烫发的那个)

第二:即使他们这样做,我在那里使用的代码也会将用户带到一个屏幕上,其中有一条可怕的消息向他们描述“谁正在安装新的apk并且他们负责该操作”。我附上了该消息的屏幕截图,我需要删除此消息即使有我需要从谷歌购买的证书,我搜索了但却一无所获

enter image description here

任何解决方案,提前谢谢

android android-permissions
2个回答
2
投票

即使有我需要从谷歌购买的证书,我也需要删除此消息

抱歉,无法删除此邮件。请注意,它只会出现一次;如果用户授予您的应用程序安装应用程序的能力,那么未来的ACTION_INSTALL_PACKAGE请求不应显示该消息。

我没有在旧的apk中包含此权限,因此旧apk的所有用户都必须卸载旧的apk并手动安装新的apk

他们不需要卸载旧的应用程序。他们必须手动安装更新,但不需要删除旧更新。


1
投票

为可能需要它的所有软件包添加授予权限,如下所示:

List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}

完整(工作)代码是:

File download_file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "NameApplication.apk");
if (download_file.exists()) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Uri apkUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);
        Intent intent_update = new Intent(Intent.ACTION_VIEW);
        intent_update.setDataAndType(apkUri, "application/vnd.android.package-archive");
        intent_update.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        intent_update.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent_update, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            context.grantUriPermission(packageName, apkUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
    } else {
        PrefSingleton prefSingleton = PrefSingleton.getInstance();
        SharedPreferences.Editor editor = prefSingleton.getSharedPrefs().edit();
        editor.putBoolean("update", false);
        editor.apply();
        Uri apkUri = Uri.fromFile(download_file);
        Intent intent_update = new Intent(Intent.ACTION_VIEW);
        intent_update.setDataAndType(apkUri, "application/vnd.android.package-archive");
        intent_update.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    context.startActivity(intent_update);
} else {
    Toast.makeText(context, "Failed.", Toast.LENGTH_SHORT).show();
}

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.