我已将.apk
文件上传到保管箱。当用户单击Instant App中的安装按钮时,我想下载并启动应用程序。但是在调用startActivity()
之后发生以下异常:
引起:java.lang.SecurityException:权限拒绝:从ProcessRecord打开提供程序android.support.v4.content.FileProvider {8593d11 2399:com.google.android.packageinstaller / u0a26}(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);
答案 0 :(得分:2)
无法通过即时应用程序启动安装在Play商店外部托管的APK文件(也不推荐)。
您收到的错误是因为Instant Apps无法读取(或写入)外部磁盘存储。有关Instant Apps中受限制功能的详细信息,请参阅docs。即时应用可以读取/写入自己的内部存储,但是他们无法向其他应用公开或共享该数据。
推荐的方法是将常规APK发布到Google Play,然后使用提供的showInstallPrompt()
帮助程序方法启动安装。这会将用户引导至Google Play以安装您的应用。
您还应该查看我们的UX guidelines以显示此类安装按钮(称为“显式安装提示”)。
答案 1 :(得分:1)
如果您想下载并安装.apk文件,那么您不需要在Dropbox上托管.apk文件,而是可以在Playstore上发布它,从即时应用程序中,您可以将用户重定向到Playstore以通过以下方式下载应用程序此
首先在功能模块中添加此依赖项
api "com.google.android.instantapps:instantapps:1.0.0"
然后将项目级build.gradle与this`
匹配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上发布应用
答案 2 :(得分:-1)
如果您要从即时运行构建.apk,它将无法在任何其他设备上运行,因为它具有热交换更改的功能。
转到Android Studio中的偏好设置&gt;构建,执行,部署&gt;即时运行。
然后你应该禁用它,然后通过运行进行构建。 那个.apk可以在任何设备上正常运行。
希望有所帮助。