首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android 10 -使用PackageManager安装新版本的apk而不是意图并不真正有效。

Android 10 -使用PackageManager安装新版本的apk而不是意图并不真正有效。
EN

Stack Overflow用户
提问于 2020-01-17 09:36:59
回答 2查看 6.4K关注 0票数 5

我的apk当前更新的方式是通过新的apk在旧的apk上安装自己(同时不覆盖本地数据库或设置)。

因此,由于Android10(API 29)被否决了,所以这一点不再有效了:

代码语言:javascript
运行
复制
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文档中的演示,我了解了以下内容:

代码语言:javascript
运行
复制
Intent intent = new Intent(PSMentorActivity.this,InstallApkSessionApi.class);
intent.putExtra("apkFile",outputFile);
this.startActivity(intent);

其中InstallApkSessionApi包含一个按钮,当按下按钮时,应该启动安装窗口:

代码语言:javascript
运行
复制
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中得到的响应总是:

代码语言:javascript
运行
复制
 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_PACKAGESREQUEST_INSTALL_PACKAGES,由于第一种权限不适合第三方使用,而后者是签名级别,所以我无法使用它们。

有没有什么东西是我严重缺失了,还是没有办法让我更新我的Apk而不通过谷歌播放?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-17 10:15:21

我也遇到过同样的问题,也尝试过同样的方法(PackageInstaller),就像你一样。它不起作用。所以,这里有一个解决办法,

代码语言:javascript
运行
复制
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)上测试过,它运行良好。如果你仍然面临任何问题,请告诉我。注意:您的版本代码必须大于旧版本代码。

票数 4
EN

Stack Overflow用户

发布于 2020-01-17 13:35:14

因此,经过帮助和一些更多的搜索伟大的互联网,我已经能够使这两种方法为我工作。我还是不明白是什么原因造成了这个问题。以前,我用Uri.fromFile(file)直接从文件中创建了意图中使用的Uri。这适用于Android 10下的任何东西。我处理这个问题的新方法是使用提供程序并使用它获取文件。

  1. 当前方法,要使用一段时间,直到我能够正确地实现PackageManager安装(仍然有一些问题需要修复)。

代码语言:javascript
运行
复制
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);

使用

  1. 使用PackageManager,正如我在问题中所指定的,但有以下区别(现在正在从Uri构建inputStream ):

代码语言:javascript
运行
复制
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。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59784661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档