我正在开发一个具有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并且他们负责该操作”。我附上了该消息的屏幕截图,我需要删除此消息即使有我需要从谷歌购买的证书,我搜索了但却一无所获
任何解决方案,提前谢谢
即使有我需要从谷歌购买的证书,我也需要删除此消息
抱歉,无法删除此邮件。请注意,它只会出现一次;如果用户授予您的应用程序安装应用程序的能力,那么未来的ACTION_INSTALL_PACKAGE
请求不应显示该消息。
我没有在旧的apk中包含此权限,因此旧apk的所有用户都必须卸载旧的apk并手动安装新的apk
他们不需要卸载旧的应用程序。他们必须手动安装更新,但不需要删除旧更新。
为可能需要它的所有软件包添加授予权限,如下所示:
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();
}
希望这可以帮助。