2015-08-26 3 views
13

У меня есть этот код для создания каталога для сохранения фотографий: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 и на андроид 6 возвращает null.

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

buildToolVersion 23 targetSdkVersion 23

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

+0

"storeDir возвращает "Файл: /// хранение/эмулировать/0/Фотографии/MyPhoto /" ниже андроида 6 и на Android 6 она возвращает "файл: ///"" - этот код возвращает ' Файл', а не строки. Помимо этого, какова ваша 'targetSdkVersion'? – CommonsWare

+0

отредактировал вопрос –

+0

он возвращает нуль фактически –

ответ

21

Как ответила @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; 
      } 
     } 
    } 
+0

Я протестировал в эмуляторе, если вы даете разрешение во время выполнения, нужно убить процесс и снова перезапустить? –

+0

@ParaSara нет вам не нужно –

+0

Я столкнулся с такой же проблемой: http://stackoverflow.com/questions/32947638/requesting-and-allowing-write-external-storage-permission-at-runtime-has-no- effe –

16

Вы работаете в этом на Android 6.0+ среде и у вас есть targetSdkVersion из 23

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

+0

Я протестировал его без разрешения, не повезло –

+0

@JemshitIskenderov: Я не сказал вам удалить разрешение. Я сказал вам пересмотреть свое приложение, чтобы принять участие в системе разрешений для работы во время Android 6.0, или отказаться от вашего «targetSdkVersion» ниже 23. – CommonsWare

+0

Что вы подразумеваете под «пересмотром вашего приложения для участия в системе разрешений для работы во время Android 6.0»? –

4

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

enter image description here

для этого он impliment этот код:

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 
        ); 
     } 
    } 

удачи !!!

0

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

@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; 
       } 
      } 
+0

Уже решил с заданным решением –

Смежные вопросы