Как заставить Environment.getExternalStoragePublicDirectory() создать путь к SD-карте, а не к эмулируемой /0, которая является внутренней памятью?

Я создаю папку и помещаю файл в эту папку, используя Environment.getExternalStoragePublicDirectory(), Но это создает путь к папке под названием /storage/emulated/0, Я искал на SD-карте свое имя файла, но там было любое. Итак, я решил, что /storage/emulated/0 находится во внутренней памяти телефона. Но согласно Android Doc внешняя память означает SD-карту.

Например, скриншоты хранятся на SD-карте, и я могу найти их, зайдя в Android-приложение "Загрузить" ->SD-карта -> Изображения -> Скриншоты:

,

Вот мой код, то, как я создаю путь к папке, а затем создаю уникальный путь к файлу для отдельной фотографии, добавляя время хранения фотографии:

public File getPublicDir() {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DCIM),"collage");
if (!file.mkdirs()) {
    Log.e("PUBLIC DIRECTORY", "Directory not created");
}
return file;
}

try{
Calendar calendar= Calendar.getInstance();
SimpleDateFormat sdformat=new SimpleDateFormat("MM_dd_yyyy_HH:mm:ss");
String DateString=sdformat.format(calendar.getTime());
file=new File(getPublicDir(),"mySnapshot_"+DateString+".png");
FileOutputStream fos=new FileOutputStream(file);
Boolean success=snapshot.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
Toast.makeText(MainActivity.this,"Compress? 
  :"+file,Toast.LENGTH_SHORT).show();
}catch(IOException e){
  e.printStackTrace();
  Toast.makeText(MainActivity.this,"NOT SAVED",Toast.LENGTH_SHORT).show();
}

РЕДАКТИРОВАТЬ:

я попробую String secStore = System.getenv("SECONDARY_STORAGE"); но secStore является нулевым, когда я запускаю приложение. Это из этого ответа стека.

Я пытаюсь вручную ввести адрес папки, которая ведет к SD-карте (на картинке выше):

String dir="/document/3464-6161:collage";
file=new File(dir,"mySnapshot_"+DateString+".png");

Но это дает мне эту ошибку:

1 ответ

Вы можете получить доступ к внешней SD-карте, используя getExternalStorageDirectory() и предоставив разрешение на запрос для Manifest.permission.WRITE_EXTERNAL_STORAGE

Кроме того, вы можете использовать StorageManager.getStorageVolumes(), чтобы узнать, какие доступные тома доступны на устройстве. Он вернет информацию о StorageVolume, как SD-карта и USB.

Примечание: это доступно из API 24.

Используя это, вы можете получить доступ к нужному пути к файлу.

Другие вопросы по тегам