我只想添加自己的考虑和经验。我曾遇到过同样的问题。
如果你想得到最好的结果,最好按照Nano和CommonsWare建议的方式进行。
我想强调一下,如果您的apk是内部位置,您可能会遇到“解析包错误”的问题。我想提醒您,在清单中需要正确的权限<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
。
但我注意到还需要添加Intent.FLAG_GRANT_READ_URI_PERMISSION。
因此,完整的示例代码可能像我的这样:
Uri fileUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", currentFile);
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(fileUri,"application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, APK_INSTALL_CODE);
我也要提醒您,这个机制是完全异步的,所以如果您需要知道结果才能继续进行,您需要等待它。
我不知道这是否是最好的方法,但它有效。
Uri fileUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", currentFile);
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(fileUri,"application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, APK_INSTALL_CODE);
while (WAIT_APK_INSTALL) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == APK_INSTALL_CODE) {
if (resultCode == 1) {
WAIT_APK_INSTALL = false;
}
else {
Intent intent = new Intent(getBaseContext(), ErrorActivity.class);
intent.putExtra(GlobalStrings.INTENT_EXTRA_MESSAGE, getString(R.string.apk_installation_failed));
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
}
}
}
startActivityForResult
启动进程,然后在onActivityResult
中分析回调以处理失败的情况吗? - nanoOnActivityResult
,而不等待用户响应。 - Rajeev Kumarintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
。 - nano