Как заставить 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.
Используя это, вы можете получить доступ к нужному пути к файлу.