【问题标题】:Installing apk from android application running Oreo and having no REQUEST_INSTALL_PACKAGES从运行 Oreo 且没有 REQUEST_INSTALL_PACKAGES 的 android 应用程序安装 apk
【发布时间】:2019-02-10 13:41:49
【问题描述】:

我正在开发一个具有自动更新功能的 Android 应用程序,我正在为其开发此应用程序的 android 设备没有 google play,因此我必须在有更新时在某处上传新版本的新 apk 并每次以编程方式检查如果有新版本,则打开应用程序,如果有,我下载它(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,该功能停止工作,搜索了很多天我发现我必须获得一个名为@的权限987654325@ 安装新软件包 https://developer.android.com/reference/android/Manifest.permission.html#REQUEST_INSTALL_PACKAGES 从 Android API 25 开始,如文档在此链接中所述。 我现在有两个问题;

首先:我没有在旧apk中包含这个权限,所以旧apk的所有用户都必须卸载旧apk并手动安装新apk(新apk是具有REQUEST_INSTALL_PACKAGE perm的那个)

第二:即使他们这样做了,我在上面使用的代码也会将用户带到一个屏幕,并显示一条可怕的消息,向他们描述“谁在安装新的 apk 并且他们应对该行为负责”。我附上了消息的屏幕截图,即使有我需要从谷歌购买的证书,我也需要删除此消息,我搜索过但什么也没找到

任何解决方案,提前致谢

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      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();
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多