Сохранение изображения на SdCard для версии Android 6.0.1

Этот код правильно работает в версии Android 6.0.1, но если я запущу это приложение на устройствах Android 6.0.1, он не сохранит изображения на SD-карту. Что мне нужно обновить для устройств 6.0.1?

public void SaveImages(int a ,String b)
        {
            Bitmap bitmap = null;
            OutputStream output;
            if(a==0)
            {
                bitmap = BitmapFactory.decodeResource(getResources(),
                        R.drawable.image_0);
            }



File filepath = Environment.getExternalStorageDirectory();

        // Create a new folder in SD Card
        File dir = new File(filepath.getAbsolutePath()
                + "/Wallpapers/");
        dir.mkdirs();

        // Create a name for the saved image
        File file = new File(dir,b);

        // Show a toast message on successful save
        Toast.makeText(FullImageActivity.this, "Loading...",
                Toast.LENGTH_SHORT).show();
        Toast.makeText(FullImageActivity.this, "Image Saved to SD Card",
                Toast.LENGTH_SHORT).show();
        try {

            output = new FileOutputStream(file);

            // Compress into png format image from 0% - 100%
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
            output.flush();
            output.close();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
        }

        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

person Latmos    schedule 22.11.2016    source источник
comment
Это вызовет исключение безопасности в Android 6 .... Сначала запросите разрешение, затем сохраните, оно будет работать   -  person Mukeshkumar S    schedule 22.11.2016
comment
Проверьте разрешение выполнения приложения   -  person Nithinlal    schedule 22.11.2016
comment
Я только что добавил это разрешение: ‹uses-permission android:name=android.permission.WRITE_EXTERNAL_STORAGE/›   -  person Latmos    schedule 22.11.2016
comment
developer.android.com/training/permissions/requesting.html аналогичным образом получите Storage Разрешение   -  person Mukeshkumar S    schedule 22.11.2016


Ответы (2)


На Android 6.0+ вам необходимо запросить разрешение среды выполнения на запись во внешнее хранилище.


Чтобы запросить разрешение во время выполнения на запись во внешнее хранилище:

public class MarshmallowPermission {
    public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 2;

    public MarshmallowPermission() {
    }

    public boolean checkPermissionForExternalStorage(Activity activity) {
        if(Build.VERSION.SDK_INT >= 23) {
            int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if(result == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }

    public void requestPermissionForExternalStorage(Activity activity) {
        if(ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            Toast.makeText(activity,
                    "External Storage permission needed. Please allow in App Settings for additional functionality.",
                    Toast.LENGTH_LONG).show();
            // user has previously denied runtime permission to external storage
        } else {
            ActivityCompat.requestPermissions(activity,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
        }
    }
}

Тогда вы можете сделать

if(!marshmallowPermission.checkPermissionForExternalStorage(this)) {
    marshmallowPermission.requestPermissionForExternalStorage(this);
} else {
    // can write to external
}

А также

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == MarshmallowPermission.EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE) {
        if(marshmallowPermission.checkPermissionForExternalStorage(this)) {
            // can write to external
        } else {
            // runtime permission denied, user must enable permission manually
        }
    }
}
person EpicPandaForce    schedule 22.11.2016
comment
На самом деле это будет сложнее (сложнее?) с Android Q, где это разрешение больше не работает, и вместо этого людям приходится полагаться на Storage Access Framework. - person EpicPandaForce; 19.10.2019