4

我有一个具有所有必要权限的系统应用程序。以前,我会使用 DownloadManager 下载 apk,然后通过 PackageManager 的 installPackage() 使用反射来安装所说的 apk。

不幸的是,跟随 N 的行为改变 http://developer.android.com/preview/behavior-changes.html

DownloadManager 不能再按文件名共享私人存储的文件。旧版应用程序在访问 COLUMN_LOCAL_FILENAME 时可能会出现无法访问的路径。尝试访问 COLUMN_LOCAL_FILENAME 时,面向 Android N 或更高版本的应用会触发 SecurityException。使用 setDestinationInExternalFilesDir(Context, String, String) 或 setDestinationInExternalPublicDir(String, String) 将下载位置设置为公共位置的旧版应用程序仍然可以访问 COLUMN_LOCAL_FILENAME 中的路径,但是强烈建议不要使用此方法。访问由 DownloadManager 公开的文件的首选方法是使用 openFileDescriptor(Uri, String)。

我现在在尝试旧方法时遇到权限被拒绝错误。

我需要一个 Uri 来传递给 PM 的 installPackage(),所以我目前只是使用(已弃用)WORLD_READABLE 模式将该文件复制到我的应用程序的私有文件夹中,以便 PM 以后可以访问它并安装。这感觉很 hacky,我想知道是否有人知道更好的方法(androiddev 建议的另一个选项是将文件下载到公共目录,但这需要我添加 WRITE_EXTERNAL_STORAGE 权限,这不是一个选项。)

4

0 回答 0