2015-08-26 8 views
13

Ben resim kaydetmek için dizini oluşturmak için bu kodu vardır:Android 6 (M) izin sorunu (çalışmıyor dizin oluşturma)

 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 döner android 6'nın altında "/storage/emulated/0/Pictures/myphoto/" ve 6 android o null döndürür üzerinde.

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

buildToolVersion 23 targetSdkVersion 23

Nasıl düzeltmek zorunda?

+0

dosyası" storeDir döndürür" Dosya 'nesneleri, dizeleri değil. Bunun ötesinde, 'targetSdkVersion' nedir? – CommonsWare

+0

edited question –

+0

null döndürür null aslında –

cevap

21

@CommonsWare'in yanıtladığı gibi, Android M üzerinde konsept sorma süresi izni var, böylece yeni yaklaşımda, yükleme sırasında izinler sorulmaz. Uygulama, ancak çalışma zamanında izin isteyen, telefonun belirli özelliğini kullanmaya çalışırken. Kullanıcı daha sonra phone settings->app->yourapp->permissions'dan da izinleri devre dışı bırakabilir. Bu kodu impliment do için

enter image description here

: Sen gibi bu iş için izin almak zorundadır

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

Emülasyonda test ettim, eğer çalışma zamanı izni verdiysem, süreci öldürmeli ve tekrar başlamalı mıyım? –

+0

@ParaSara hayır –

+0

'a ihtiyacım yok Aynı sorunla karşılaştım: http://stackoverflow.com/questions/32947638/requesting-and-allowing-write-external-storage-permission-at-runtime-has-no- effe –

16

Bir Android 6.0+ çevre üzerindeki bu çalıştıran ve bir targetSdkVersion Bu durumda 23.

arasında, WRITE_EXTERNAL_STORAGEthe Android 6.0 runtime permission system parçasıdır var. Uygulamanızın bu sisteme katılması için gözden geçirin ya da targetSdkVersion'unuzu aşağıdaki 23'ten aşağıya bırakın.

+0

izinsiz test ettim, şans yok –

+0

@JemshitIskenderov: İzinleri kaldırmanızı söylemedim. Uygulamanızı Android 6.0 çalışma zamanı izin sistemine katılmaya veya 23 yaşının altındaki "targetSdkVersion" 'a düşürmeye güncellemenizi söyledim. – CommonsWare

+0

"Android 6.0 çalışma zamanı izni sistemine katılmak için uygulamanızı revize etme" ile ne demek istiyorsunuz? –

4

: Yani o izni ile bir şeyler yapmadan önce kontrol edin ve kullanıcı sormak zorunda

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

iyi şanslar !!!

0

Bu kodu deneyin. Bu kod `dönüyor - /// " ": /// depolama// 0 Resimler/myphoto/dosya "6 android ve android, 6 döndürür aşağıdaki"/ taklit:

@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

Zaten verilen çözüm ile çözüldü –