android - targetSdkVersion 低于 22 的下载管理器的安全异常

标签 android android-permissions android-download-manager

我在 Lollipop 及以下发生了奇怪的崩溃。尝试从服务器下载文件时出现安全异常,但在运行 Marshmallow 及以上版本的设备中,应用程序不会崩溃。 Logcat:

Caused by: java.lang.SecurityException: need WRITE_EXTERNAL_STORAGE permission to use DESTINATION_FILE_URI: uid 10229 does not have android.permission.WRITE_EXTERNAL_STORAGE.

在 App 的 grandle 我使用

 targetSdkVersion 22

将在我们第一次推送到 Google 控制台以针对最新的 sdk 版本后发生变化,但目前这将保持为 22,因此不需要运行时权限。 此外,在 App 的 list 中,我们声明应用的权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

此外,在 AsynckTask 中使用 DownloadManager 的代码:

try {
        String dirPath = String.format("%5$s/%1$s/Resources/%2$s/%3$s/%4$s/", userID, resource.getiD(), filePackage.getiD(), language, dir.getCanonicalPath());
        File makeDirs = new File(dirPath);
        makeDirs.mkdirs();
    } catch (Exception ex) {
        ex.printStackTrace();
}

this.downloadManager = (DownloadManager) getApplicationContext().getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(url);
        request.setDestinationInExternalFilesDir(getApplicationContext(), null, filePath);
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
        request.setVisibleInDownloadsUi(false);
        downloadID = downloadManager.enqueue(request);

同样,此崩溃仅在操作系统版本为 5.0.2 的 Galaxy A5、运行带有 Lollipop 的三星 Galaxy S6 的模拟器和运行 Kitkat 4.4 的模拟器中观察到。 4 宏达电一号。

完整的堆栈跟踪:

    java.lang.RuntimeException: Unable to start activity ComponentInfo{...players.PDFViewer}: java.lang.SecurityException: need WRITE_EXTERNAL_STORAGE permission to use DESTINATION_FILE_URI: uid 10229 does not have android.permission.WRITE_EXTERNAL_STORAGE.
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2808)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2873)
                                                                             at android.app.ActivityThread.access$900(ActivityThread.java:181)
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                             at android.os.Looper.loop(Looper.java:145)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6145)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at java.lang.reflect.Method.invoke(Method.java:372)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
                                                                          Caused by: java.lang.SecurityException: need WRITE_EXTERNAL_STORAGE permission to use DESTINATION_FILE_URI: uid 10229 does not have android.permission.WRITE_EXTERNAL_STORAGE.
                                                                             at android.os.Parcel.readException(Parcel.java:1540)
                                                                             at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
                                                                             at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
                                                                             at android.content.ContentProviderProxy.insert(ContentProviderNative.java:475)
                                                                             at android.content.ContentResolver.insert(ContentResolver.java:1260)
                                                                             at android.app.DownloadManager.enqueue(DownloadManager.java:1336)
                                                                             at de.imsystems.crmmobile.players.PDFViewer.onCreate(PDFViewer.java:104)
                                                                             at android.app.Activity.performCreate(Activity.java:6374)
                                                                             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
                                                                             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2752)
                                                                             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2873) 
                                                                             at android.app.ActivityThread.access$900(ActivityThread.java:181) 
                                                                             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482) 
                                                                             at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                             at android.os.Looper.loop(Looper.java:145) 
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6145) 
                                                                             at java.lang.reflect.Method.invoke(Native Method) 
                                                                             at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

如果您有任何想法,请分享,在此先感谢。

最佳答案

最终这个帖子WRITE_EXTERNAL_STORAGE not working on lollipop even though it's set in the manifest帮助过我。我所做的是像这样更改 AndroidManifest.xml 文件中的权限:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="26" tools:replace="android:maxSdkVersion"/>

这样应用就不会崩溃!

关于android - targetSdkVersion 低于 22 的下载管理器的安全异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47035050/

相关文章:

android - 使用 MyLocationOverlay 绘制精度圆

android - Android Studio 中窗口类型 2002 的权限被拒绝

java - 根据Android权限是否禁用显示TextView?

android-permissions - 由于拒绝权限,MediaScannerConnection在Android 6上失败

java - 如何找到文件下载到的android目录

android - 使用 DownloadManager.Request 从 url 下载文件时下载不成功

iOS 上的 Android 下载管理器替代品

java - 每次更新数组时如何向监听器发出消息?

android - BottomAppBar 缺少菜单项 - 不显示所有菜单项

android - 如何让 Holo Light 主题在我的 Xamarin 应用程序中工作