Security Exception while using Android DownloadManager.enqueue()

448 Views Asked by At

Getting error :

java.lang.SecurityException: Permission Denial: writing com.android.providers.downloads.DownloadProvider uri content://downloads/my_downloads from pid=3608, uid=10081 requires android.permission.INTERNET, or grantUriPermission()
        at android.os.Parcel.readException(Parcel.java:1683)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
        at android.content.ContentResolver.insert(ContentResolver.java:1274)
        at android.app.DownloadManager.enqueue(DownloadManager.java:1014)
        at com.udacity.MainActivity.startDownload(MainActivity.kt:124)
        at com.udacity.MainActivity.download(MainActivity.kt:96)
        at com.udacity.MainActivity.onCreate$lambda-0(MainActivity.kt:52)
        at com.udacity.MainActivity.$r8$lambda$3NfQc1qKvvShQbwLc_qeJ0be78s(MainActivity.kt)
        at com.udacity.MainActivity$$ExternalSyntheticLambda0.onClick(D8$$SyntheticClass)
        at android.view.View.performClick(View.java:5610)
        at android.view.View$PerformClick.run(View.java:22265)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
In MainActivity : downloadManager.enqueue(request)

Method to call DownloadManager to start Download file

kotlin

private fun startDownload() { 

custom_button.buttonState = ButtonState.Clicked

val request = DownloadManager.Request(Uri.parse(url)) .setTitle(getString(R.string.app_name))

.setDescription(getString(R.string.app_description))

.setAllowedOverMetered(true)

.setAllowedOverRoaming(true)

val downloadManager = getSystemService(DOWNLOAD_SERVICE) as DownloadManager downloadID = downloadManager.enqueue(request)// enqueue puts the download request in the queue.

}

In Manifest using :

<uses-permission android:name="android.permision.INTERNET"/>
1

There are 1 best solutions below

0
M Ashhal On

I would suggest checking if you have these permissions in your manifest.

I'm not sure if this method will work above Android 10 since Scoped Storage was implemented. Learn more about it here -> https://developer.android.com/about/versions/11/privacy/storage

Also check out this answer for more help -> https://stackoverflow.com/a/68627407/19652887

<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" 
    android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

If these are in your manifest, try checking for them on Runtime

Kotlin ->


var isReadPermissionAllowed = false
var isWritePermissionAllowed = false

isReadPermissionAllowed = 
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

isWritePermissionAllowed = 
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

if (isReadPermissionAllowed && isWritePermissionAllowed) {
            startDownload()
        }else{
            ActivityCompat.requestPermissions(
                this,
                arrayOf(
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                ),1)
        }