Создать каталог на Android R

Я хотел бы создать в своем телефоне каталог "RawMeasurement" в том же месте, что и "Музыка", "Документ", "Изображение"... в Android R

Тестировал с более ранними версиями api, работает, но под android R - невозможно.

Я думаю, проблема в Environement.getExternalStorageDirectory()

Искал другие методы, но безрезультатно.

Идеи? заранее спасибо

public void save(){

    String state;
    state = Environment.getExternalStorageState();

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm", Locale.getDefault());
    String currentDateAndTime = sdf.format(new Date());

    if(Environment.MEDIA_MOUNTED.equals(state)){
        File Dir  = new File(Environment.getExternalStorageDirectory().getPath(),"RawMeasurement");
        if(!Dir.exists()) {
            Dir.mkdirs();
            Toast.makeText(getContext(),"new folder",Toast.LENGTH_LONG).show();
        }
        File file = new File(Dir,"RawMeasurements"+currentDateAndTime+".txt");
        String message = "bla bla bla  " ;
        try{
            FileOutputStream out = new FileOutputStream(file);
            out.write(message.getBytes());
            out.close();
            Toast.makeText(getContext(),"message saved",Toast.LENGTH_LONG).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            logError("error");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }else{
        Toast.makeText(getContext(),"echec",Toast.LENGTH_LONG).show();
    }

}

4 ответа

Приложения не могут создавать свои собственные каталоги для конкретных приложений на внешнем хранилище в Android 11. Вы можете создавать папки внутри общедоступных каталогов. Например, в папке "Документы".

      final File dir;
if (Build.VERSION_CODES.R > Build.VERSION.SDK_INT) {
    dir = new File(Environment.getExternalStorageDirectory().getPath()
            + "//MyApp");
} else {
    dir = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getPath()
            + "//MyApp");
}

if (!dir.exists())
    dir.mkdir();

Я хотел бы создать в своем телефоне каталог RawMeasurement в том же месте, что и Музыка, Документ, Изображение... в Android R

Извините, но это не поддерживается. Вы можете запроситьMANAGE_EXTERNAL_STORAGEразрешение, после чего вы можете делать то, что хотите. Я предполагаю, что Google заблокирует ваше приложение в Play Store, если вы не предоставите действительно веское обоснование для этого разрешения.

Google хочет, чтобы вы использовали ACTION_OPEN_DOCUMENT_TREEчтобы позволить пользователю решить, где на устройстве пользователя ваше приложение должно размещать необработанные измерения пользователя. Затем вы можете создать поддерево (каталог) в выбранном пользователем месте, и вы можете поместить свой контент в это поддерево.

Система разрешений с момента появления Android R немного изменилась, дополнительную информацию см. В разделе Обновления хранилища в Android 11 в официальной документации.

я использовал externalMediaDirs.first() для моего собственного проекта, но это поместит файлы в Android/Media/com.example/

Создать папку в Android 11+

  • Получить разрешение
    Я создал два метода. Сначала мы проверим, есть ли у приложения разрешение
    Имя метода:-isPermissionGranted();
    если разрешение не предоставлено, мы запросим разрешение, вызвав этот метод
    Имя метода:-askPermissionForStorage();
  • Создать папку
    File file = new File(Environment.getExternalStorageDirectory().getPath()+"/Create Your Folder");
    file.mkdir();

Вот два метода

      private boolean isPermissionGranted() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        return Environment.isExternalStorageManager();
    } else {
        return ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED;
    }
}

private void askPermissionForStorage() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        try {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
            startActivityForResult(intent, 2);
        } catch (Exception e) {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
            startActivityForResult(intent, 2);
        }
    } else {
        ActivityCompat.requestPermissions(SplashScreen.this, new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE
        }, 1);
    }
}
Другие вопросы по тегам