Download Manager Android Permissions error: write external Storage Download Manager Android Permissions error: write external Storage xml xml

Download Manager Android Permissions error: write external Storage


You are getting this error because your app is running in Android 6.0(API level 23). From API level >= 23 you will need to check for the permission in run time. Your code is just fine for below level 23. So please check first if your user has given the permission to use the storage:

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {    Log.e("Permission error","You have permission");    return true;}

If not then prompt the request:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

Total things looks like this:

public  boolean haveStoragePermission() {    if (Build.VERSION.SDK_INT >= 23) {        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)                == PackageManager.PERMISSION_GRANTED) {            Log.e("Permission error","You have permission");            return true;        } else {            Log.e("Permission error","You have asked for permission");            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);            return false;        }    }    else { //you dont need to worry about these stuff below api level 23        Log.e("Permission error","You already have the permission");        return true;    }}

And last thing :)receive the result by callback:

    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if(grantResults[0]== PackageManager.PERMISSION_GRANTED){            //you have the permission now.            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myurl));            request.setTitle("Vertretungsplan");            request.setDescription("wird heruntergeladen");            request.allowScanningByMediaScanner();            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);            String filename = URLUtil.guessFileName(myurl, null, MimeTypeMap.getFileExtensionFromUrl(myurl));            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);            DownloadManager manager = (DownloadManager) c.getSystemService(Context.DOWNLOAD_SERVICE);            manager.enqueue(request);        }    }



Or, you can just use my custom class PermissionCheck to handle all this implementation very easily. Here is the class:

import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.support.v4.app.ActivityCompat;/** * Created by Tushar on 6/30/2017. */public class PermissionCheck{    public static boolean readAndWriteExternalStorage(Context context){        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);            return false;        }else{            return true;        }    }    public static boolean audioRecord(Context context){        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED ){            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.RECORD_AUDIO}, 2);            return false;        }else{            return true;        }    }    public static boolean readAndWriteContacts(Context context){        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}, 3);            return false;        }else{            return true;        }    }    public static boolean vibrate(Context context){        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.VIBRATE}, 4);            return false;        }else{            return true;        }    }    public static boolean sendSms(Context context){        if(ActivityCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.SEND_SMS}, 5);            return false;        }else{            return true;        }    }    //Just like this you can implement rest of the permissions. }


usage:

if(PermissionCheck.readAndWriteExternalStorage(context)){    //Your read write code.}if(PermissionCheck.sendSms(context)){    //Your sms sending code.}

**Notice that, these methods call will ask for the permissions automatically and also your onRequestPermissionsResult will be fired. :)


No need to do all this. Just paste below code on your onCreate() function:

private static int REQUEST_CODE=1;  ActivityCompat.requestPermissions(this, new String[]{    Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);


I had this same issue on my API 23 emulator (24 and 25 did fine) running a Custom Tabs app. I tried this solution, as well as some other variations, and I could see that I was being granted permission but the issue remained on any download attempts. When I ran the app on a real device (sans permission request code) I was automatically prompted to allow Google access to storage - not my app. I removed the code for run-time permissions and set permission for the Browser (default on the emulator) to access storage and my app worked fine.The following post provided some insight into what may be happening with the emulator: Requesting and allowing WRITE_EXTERNAL_STORAGE permission at runtime has no effects on the current session