2016-07-01 7 views
2

Я создаю каталог в своем родном приложении. Он отлично работает в Android 5.0, но в Android 6.0 (Marshmallow) несколько раз он работал, а иногда и нет. Я использую следующий код для создания новый каталог. Я сохраняю файл видео и изображения в каталоге.Создание каталога не работает в Marshmallow Android

public static void createApplicationFolder() { 
    File f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME); 
    f.mkdirs(); 
    f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + Config.VIDEO_COMPRESSOR_COMPRESSED_VIDEOS_DIR); 
    f.mkdirs(); 
    f = new File(Environment.getExternalStorageDirectory(), File.separator + Config.VIDEO_COMPRESSOR_APPLICATION_DIR_NAME + Config.VIDEO_COMPRESSOR_TEMP_DIR); 
    f.mkdirs(); 

} 
+0

в Android M вам нужно спросить разрешение на это. – Newbiee

+0

Я уже добавил разрешение в манифесте, а также попробовал разрешение на запуск. Но его не работает. Другой способ? – Csharp

+0

да, вы должны спросить об этом – Newbiee

ответ

10
public class MyDevIDS extends AppCompatActivity { 

     private static final int REQUEST_RUNTIME_PERMISSION = 123; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      if (CheckPermission(MyDevIDS.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
       // you have permission go ahead 
       createApplicationFolder(); 
      } else { 
       // you do not have permission go request runtime permissions 
       RequestPermission(MyDevIDS.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION); 
      } 
     } 

     @Override 
     public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) { 

      switch (permsRequestCode) { 

       case REQUEST_RUNTIME_PERMISSION: { 
        if (grantResults.length > 0 
          && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
         // you have permission go ahead 
         createApplicationFolder(); 
        } else { 
         // you do not have permission show toast. 
        } 
        return; 
       } 
      } 
     } 

     public void RequestPermission(Activity thisActivity, String Permission, int Code) { 
      if (ContextCompat.checkSelfPermission(thisActivity, 
        Permission) 
        != PackageManager.PERMISSION_GRANTED) { 
       if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
         Permission)) { 
       } else { 
        ActivityCompat.requestPermissions(thisActivity, 
          new String[]{Permission}, 
          Code); 
       } 
      } 
     } 

     public boolean CheckPermission(Context context, String Permission) { 
      if (ContextCompat.checkSelfPermission(context, 
        Permission) == PackageManager.PERMISSION_GRANTED) { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } 
+0

Я пробовал это. Он работал на меня, спасибо большое. – Csharp

+1

@Csharp, пожалуйста, отметьте отметку, если это поможет. –

1

Устройства, работающие на Android M, вы не можете напрямую записывать данные на хранение. вы должны спросить разрешение на это.

this ссылка может быть полезным

Так разрешение WRITE_EXTERNAL_STORAGE следует задавать во время выполнения здесь.

public boolean permissions() { 
//cheeck id device is Android M 

if (Build.VERSION.SDK_INT >= 23) { 
    if(checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      == PackageManager.PERMISSION_GRANTED) { 
     //your permission is granted 
     return true; 
    } else { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
     return false; 
    } 
} 
else { 
//permission is automatically granted on devices lower than android M upon installation 

    return true; 
} 
} 

Вам также необходимо переопределить onRequestPermissionsResult) метод обратного вызова (. и вы можете добавить здесь логику.

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
if(grantResults[0]== PackageManager.PERMISSION_GRANTED){ 

    //Add your logic of saving a file to directory. 
} 

} 

Надеется, что это помогает :)

+0

Пожалуйста, добавьте соответствующий код из ссылки. В будущем эта ссылка может измениться, поэтому ответ будет полезен будущим посетителям. –

+0

Это также относится к READ_EXTERNAL_STORAGE? –

0

В Android Зефире вы должны попросить dangerous permissions, включая хранение группы разрешений, во время выполнения. Я знаю красивую библиотеку, которая может сделать вашу жизнь проще, RxPermissions.

Вы можете попросить разрешения с несколькими кодом:

RxPermissions.getInstance(this) 
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE) 
.subscribe(granted -> { 
    if (granted) { // Always true pre-M 
     // I can write to the storage now 
    } else { 
     // Oups permission denied 
    } 
}); 
Смежные вопросы