Создать каталог на 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);
}
}