Проблема разрешения Android 6 (M) (создать каталог не работает)

У меня есть этот код для создания каталога для сохранения изображений:

File storageDir = null; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myphoto"); if (!storageDir.mkdirs()) { if (!storageDir.exists()){ Log.d("photo", "failed to create directory"); return null; } } } return storageDir; 

StoreDir возвращает "/storage/emulated/0/Pictures/myphoto/" ниже android 6, а на android 6 он возвращает null .

У меня есть разрешение <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

buildToolVersion 23 targetSdkVersion 23

Как исправить?

Как ответила @CommonsWare, на Android M существует концепция разрешения разрешения во время выполнения, поэтому в новом подходе разрешения не задаются при установке приложения, но при попытке использовать определенную функцию телефона, запрашивающего разрешение, во время выполнения. Пользователь позже может отключить разрешение из phone settings->app->yourapp->permissions . Поэтому вам нужно проверить, прежде чем делать что-то с этим разрешением, и спросить пользователя:

 int REQUEST_WRITE_EXTERNAL_STORAGE=1; ////... File storageDir = null; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { //RUNTIME PERMISSION Android M if(PackageManager.PERMISSION_GRANTED==ActivityCompat.checkSelfPermission(context,Manifest.permission.WRITE_EXTERNAL_STORAGE)){ storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myPhoto"); }else{ requestPermission(context); } } return storageDir; ////... private static void requestPermission(final Context context){ if(ActivityCompat.shouldShowRequestPermissionRationale((Activity)context,Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Provide an additional rationale to the user if the permission was not granted // and the user would benefit from additional context for the use of the permission. // For example if the user has previously denied the permission. new AlertDialog.Builder(context) .setMessage(context.getResources().getString(R.string.permission_storage)) .setPositiveButton(R.string.tamam, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE); } }).show(); }else { // permission has not been granted yet. Request it directly. ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE); } } ///... @Override public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { switch (requestCode) { case UtilityPhotoController.REQUEST_WRITE_EXTERNAL_STORAGE: { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(context, getResources().getString(R.string.permission_storage_success), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, getResources().getString(R.string.permission_storage_failure), Toast.LENGTH_SHORT).show(); super.onRequestPermissionsResult(requestCode, permissions, grantResults); } return; } } } 

Вы запускаете это в среде Android 6.0+, и у вас есть targetSdkVersion 23.

В этом случае WRITE_EXTERNAL_STORAGE является частью системы разрешения времени выполнения Android 6.0 . Либо измените приложение, чтобы принять участие в этой системе, либо отбросьте свой targetSdkVersion ниже 23.

Вы должны получить разрешение на эту работу, например:

Введите описание изображения здесь

Для этого выполните этот код:

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},23 ); } } 

удачи!!!

Попробуйте этот код.

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkPermission()) { //do your work } else { requestPermission(); } } } protected boolean checkPermission() { int result = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); if (result == PackageManager.PERMISSION_GRANTED) { return true; } else { return false; } } protected void requestPermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(this, "Write External Storage permission allows us to do store images. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show(); } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); } } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 100: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //do your work } else { Log.e("value", "Permission Denied, You cannot use local drive ."); } break; } }