【问题标题】:Download and install apk (without publishing in playstore) from the Instant App从 Instant App 下载并安装 apk(无需在 Playstore 中发布)
【发布时间】:2017-06-06 06:12:23
【问题描述】:

我已将.apk 文件上传到保管箱。当用户单击即时应用程序中的安装按钮时,我想下载并启动应用程序。但是调用startActivity()后出现如下异常:

原因:java.lang.SecurityException: Permission Denial: 从 ProcessRecord{8593d11 2399:com.google.android.packageinstaller/u0a26} 打开提供程序 android.support.v4.content.FileProvider (pid=2399, uid=10026 ) 不是从 uid 10298 导出的

 

Intent intent = new Intent(Intent.ACTION_VIEW);
if (intent.resolveActivity(getPackageManager()) == null) {
    Log.e("No Packate Manager", intent.getPackage() + "");
    return;
}

Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //BuildConfig.APPLICATION_ID
    // File file = new File(File folder, "app-debug.apk");
    //uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", file);
    uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "app-debug.apk"));
    List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
} else {
    // uri = Uri.fromFile(new File("/mnt/sdcard/Download/app-debug.apk"));
    File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    File outputFile = new File(folder, "app-debug.apk");
    uri = Uri.fromFile(outputFile);
}

intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// install.setDataAndType(myuri, manager.getMimeTypeForDownloadedFile(downloadId));

startActivity(intent);

【问题讨论】:

    标签: java android android-intent apk android-instant-apps


    【解决方案1】:

    无法从免安装应用开始安装在 Play 商店之外托管的 APK 文件(也不推荐)。

    您收到的错误是因为 Instant Apps 无法读取(或写入)外部磁盘存储。有关 Instant Apps 中受限功能的更多信息,请参阅docs。 Instant Apps可以读/写到它们自己的内部存储,但是它们不能向其他应用公开或共享该数据。

    推荐的方法是将常规 APK 发布到 Google Play,然后使用提供的 showInstallPrompt() 辅助方法来启动安装。这会将用户引导至 Google Play 以安装您的应用。

    您还应该查看我们的UX guidelines 以了解提供这样一个安装按钮(称为“显式安装提示”)。

    【讨论】:

      【解决方案2】:

      如果您想下载并安装 .apk 文件,则无需在 Dropbox 上托管 .apk 文件,而是可以在 Playstore 上发布它,并且从即时应用程序中,您可以将用户重定向到 Playstore 以通过以下方式下载应用程序这个

      首先在你的功能模块中添加这个依赖

      api "com.google.android.instantapps:instantapps:1.0.0"
      

      然后将你的项目级 build.gradle 与此匹配`

      buildscript {
      repositories {
      maven { url 'https://maven.google.com' }
      jcenter()
        }...
      }
      
      allprojects {
      repositories {
      maven { url 'https://maven.google.com' }
      jcenter()
       }
      }
      

      最后点击即时应用中的安装按钮,您可以调用它

      InstantApps.showInstallPrompt(MainActivity.this,0,"Install app")
      

      因此,这将在您之前发布的 Playstore 上打开您的应用。

      注意:在开发即时版本的应用之前,您必须先在 Playstore 上发布应用

      【讨论】:

        【解决方案3】:

        如果您从即时运行构建 .apk,它不会在任何其他设备上运行,因为它具有热交换更改的功能。

        转到 Android Studio 中的首选项 > 构建、执行、部署 > 即时运行。

        然后你应该禁用它,然后通过运行来构建。 该 .apk 可以在任何设备上正常运行。

        希望对您有所帮助。

        【讨论】:

        • 问题与 Android Instant Apps 相关,与 Android Studio Instant Run 无关。
        猜你喜欢
        • 2012-06-12
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2015-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多