我的apk当前更新的方式是通过新的apk在旧的apk上安装自己(同时不覆盖本地数据库或设置)。
因此,由于Android10(API 29)被否决了,所以这一点不再有效了:
Intent intent = new Intent(Intent.ACTION_VIEW);
//output file is the apk downloaded earlier
intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive");
startActivity(intent);
根据我在互联网上找到的不同答案,我需要开始使用PackageInstaller。通过查看Android文档中的演示,我了解了以下内容:
Intent intent = new Intent(PSMentorActivity.this,InstallApkSessionApi.class);
intent.putExtra("apkFile",outputFile);
this.startActivity(intent);
其中InstallApkSessionApi包含一个按钮,当按下按钮时,应该启动安装窗口:
PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new
PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
int sessionId = packageInstaller.createSession(params);
session = packageInstaller.openSession(sessionId);
addApkToInstallSession(file, session);
// Create an install status receiver.
Context context = InstallApkSessionApi.this;
Intent intent = new Intent(context, InstallApkSessionApi.class);
intent.setAction(PACKAGE_INSTALLED_ACTION);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.getIntentSender();
// Commit the session (this will start the installation workflow).
session.commit(statusReceiver);
很简单,虽然比过去更复杂。我在onNewIntent中得到的响应总是:
case PackageInstaller.STATUS_FAILURE:
Toast.makeText(this, "Install failed!10 " + status + ", " + message,
Toast.LENGTH_SHORT).show();
break;
其中的状态和消息采用以下值:status=1, message= "INSTALL_FAILED_INTERNAL_ERROR: Permission denied"
。
所以我认为这是权限的问题。我已经拥有了读写存储的权限。其他相关的权限是:INSTALL_PACKAGES
和REQUEST_INSTALL_PACKAGES
,由于第一种权限不适合第三方使用,而后者是签名级别,所以我无法使用它们。
有没有什么东西是我严重缺失了,还是没有办法让我更新我的Apk而不通过谷歌播放?
发布于 2020-01-17 10:15:21
我也遇到过同样的问题,也尝试过同样的方法(PackageInstaller),就像你一样。它不起作用。所以,这里有一个解决办法,
if(android.os.Build.VERSION.SDK_INT >= 29){
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(Uri.fromFile(outputFile));
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
}else{
Intent intent = new Intent(Intent.ACTION_VIEW);
//output file is the apk downloaded earlier
intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-
archive");
startActivity(intent);
}
我在安卓10 (Google 2,One+7,三星s10)上测试过,它运行良好。如果你仍然面临任何问题,请告诉我。注意:您的版本代码必须大于旧版本代码。
发布于 2020-01-17 13:35:14
因此,经过帮助和一些更多的搜索伟大的互联网,我已经能够使这两种方法为我工作。我还是不明白是什么原因造成了这个问题。以前,我用Uri.fromFile(file)
直接从文件中创建了意图中使用的Uri。这适用于Android 10下的任何东西。我处理这个问题的新方法是使用提供程序并使用它获取文件。
Uri urlapk = FileProvider.getUriForFile(this,BuildConfig.APPLICATION_ID+".fileProvider",outputFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(urlapk, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
使用
private void addApkToInstallSession(Uri uri, PackageInstaller.Session session)
throws IOException {
try (OutputStream packageInSession = session.openWrite("package", 0, -1);
InputStream is = getContentResolver().openInputStream(uri)) {
byte[] buffer = new byte[16384];
int n;
while ((n = is.read(buffer)) >= 0) {
packageInSession.write(buffer, 0, n);
}
}
}
我使用PackageManager的主要问题是它关闭了我的应用程序,而它安装时没有向用户提供默认的反馈。因此,我想我将不得不“做出”这种反馈。我将转到PackageManager,因为apks不推荐ACTION_VIEW。
https://stackoverflow.com/questions/59784661
复制相似问题