2

Trying to make a painting app. Everything but the save button is functioning as intended. Whenever I click the save button, it's not saving and I'm getting an error java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=10397, uid=10298 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission().

else if(view.getId()==R.id.save_btn){
                //save drawing
                AlertDialog.Builder saveDialog = new AlertDialog.Builder(this);
                saveDialog.setTitle("Save drawing");
                saveDialog.setMessage("Save drawing to device Gallery?");
                saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int which){
                        //save drawing
                    }
                });
                saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int which){
                        dialog.cancel();
                    }
                });
                saveDialog.show();
                drawView.setDrawingCacheEnabled(true);
                String imgSaved = MediaStore.Images.Media.insertImage(
                        getContentResolver(), drawView.getDrawingCache(),
                        UUID.randomUUID().toString()+".png", "drawing");

In the manifest I have

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Khalil M
  • 1,788
  • 2
  • 22
  • 36
Sai
  • 49
  • 5

2 Answers2

1

You have to write storage permission on Manifest fie.

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

Also for Marshmallow you have to write code for checking and granting storage permission.

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG,"Permission is granted");
        return true;
  }

If you need to ask permission then below code works.

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

Result callback for permission will be.

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
    Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
    //resume tasks needing this permission
}

}
AmmY
  • 1,821
  • 1
  • 20
  • 31
1

you can just wrap your code like this:

 //check permission is granted or no    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
     {
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RESULT);
     } 
    else
     {
    //your code
     }
Khalil M
  • 1,788
  • 2
  • 22
  • 36