Java.lang.SecurityException:Permission Denial:在sdk 24及更高版本打开提供程序?

时间:2018-03-10 12:44:55

标签: android permissions

我知道这是一个SecurityException问题,但我不知道如何解决它。

在我的代码中,我想为下载的apk文件启动android安装程序,该文件保存在外部存储目录的下载文件夹中。

我有这段代码:

String fileName = "my_file_name.apk";
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                    + "/" + fileName);
Intent i = new Intent(Intent.ACTION_VIEW);
Uri uri;
if (Build.VERSION.SDK_INT < 24) {
     uri = Uri.fromFile(file);
} else { //>=24
     uri = FileProvider.getUriForFile(
                        context,
                        context.getApplicationContext()
                                .getPackageName() + ".provider", file);
}
i.setDataAndType(uri, "application/vnd.android.package-archive");
i.setFlags(FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(i);

此代码在sdk&lt; 24,但在sdk 24(android 7)及更高版本,我得到以下异常:

Process: com.google.android.packageinstaller, PID: 22774
                                               java.lang.RuntimeException: An error occurred while executing doInBackground()
  at android.os.AsyncTask$3.done(AsyncTask.java:318)
  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
  at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
  at java.util.concurrent.FutureTask.run(FutureTask.java:242)
  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
  at java.lang.Thread.run(Thread.java:762)
Caused by: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{f9741d3 22774:com.google.android.packageinstaller/u0a28} (pid=22774, uid=10028) that is not exported from uid 10186
  at android.os.Parcel.readException(Parcel.java:1693)
  at android.os.Parcel.readException(Parcel.java:1646)
  at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4912)
  at android.app.ActivityThread.acquireProvider(ActivityThread.java:6043)
  at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2474)
  at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1521)
  at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1135)
  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:988)
  at android.content.ContentResolver.openInputStream(ContentResolver.java:708)
  at com.android.packageinstaller.PackageInstallerActivity$StagingAsyncTask.doInBackground(PackageInstallerActivity.java:792)
  at com.android.packageinstaller.PackageInstallerActivity$StagingAsyncTask.doInBackground(PackageInstallerActivity.java:783)
  at android.os.AsyncTask$2.call(AsyncTask.java:304)
  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
  at java.lang.Thread.run(Thread.java:762) 

是否有run-time权限我必须要求用户使用?

1 个答案:

答案 0 :(得分:2)

FLAG_GRANT_READ_URI_PERMISSION添加到Intent。目前,安装程序应用无权访问您的内容。