2015-02-10 5 views
1

Я пытаюсь записать файл на свой телефон.Как получить путь внешнего хранилища?

Я использовал Environment.getDataDirectory(), чтобы узнать путь внутреннего хранилища и Environment.getExternamStorageDirectory(), чтобы узнать путь внешнего хранилища.

Но когда я использую Environment.getExternalStorageDirectory() как путь, файл создается в Внутреннее хранилище. И когда я использую Environment.GetDataStorage() в качестве пути, файл не создается. (Это не совсем верно, но я не могу найти в приложении explorer как минимум.)

Я думаю, что внутреннее хранилище телефона воспринимается как внешнее хранилище (в моем случае , он имеет объем хранения 32 ГБ)

Я хочу знать сменное хранилище (например, micro SD card). Что мне делать?

+2

'Я хочу знать, внешнее запоминающее устройство (микро SD карты) path.' Что лучше относиться как съемный носитель. Все остальное - внутреннее или внешнее хранилище. – greenapps

+1

Вам лучше изменить заголовок вопроса: _Как получить путь внешнего хранилища? _. Он может проголосовать за ваш вопрос. –

+0

Благодарим вас за советы! – soonoo

ответ

1

Вы можете попробовать этот код, чтобы получить SDCard (внешнее запоминающее устройство) путь:

String separator = "/"; 
String sdcardPath = Environment.getExternalStorageDirectory().getPath() + separator; 

Например, путь SDCard как String воли выглядит следующим образом:

"mnt/sdcard/" 

Если еще Безразлично Не работайте, попробуйте изменить getPath() с getAbsolutePath().

Затем добавьте эти разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

Вот как получить каталог SDCard в соответствии с @ ответ ShubhangMalviya в:

public String getSDCardDirectory(){ 
    String SdcardPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString(); 
    String dir = SdcardPath.substring(SdcardPath.lastIndexOf('/') + 1); 
    System.out.println(dir); 
    String[] trimmed = SdcardPath.split(dir); 
    String sdcardPath = trimmed[0]; 
    System.out.println(sdcardPath); 
    return sdcardPath; 
} 

Я рекомендую вам использовать Environment.DIRECTORY_DCIM, из-за большинство людей никогда не перемещают свой каталог пути DCIM (фото) от sdcard до Внутреннее хранилище. Обычно всегда в SD-карте.

+0

К сожалению, getPath() 'и' getAbsolutePath() 'возвращает одно и то же значение только с' getExternalStorage() ' – soonoo

+0

. Я отредактировал ответ, создав метод, чтобы получить путь к sdcard в' String'. –

3

Из официальной документации getExternalStorageDirectory()

не пугайтесь слова «внешний» здесь. Этот каталог лучше рассматривать как носитель/общий накопитель. Это файловая система, в которой может хранить относительно большой объем данных и распределяется между всеми приложениями (не применяет разрешения). Традиционно это SD-карта, но она также может быть реализована как встроенное хранилище в устройстве , которое отличается от защищенного внутреннего хранилища и может быть , установленным как файловая система на компьютере.

Таким образом, он может отличаться от встроенного хранилища в устройстве.

В вашем случае Вы можете использовать getExternalStoragePublicDirectory(java.lang.String)

Здесь пользователь, как правило, размещать и управлять своими собственными файлы

Путь здесь должен быть один из DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS , DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS или DIRECTORY_DCIM. Может не быть нулевым.

Или Если вы хотите, чтобы ваши данные были удалены, когда пользователь удаляет приложение, вы можете использовать getExternalFilesDir()

Поскольку эти файлы находятся внутри приложения, и обычно не видны пользователю как средства массовой информации.

Также есть некоторые различия между getFilesDir() и getExternalFilesDir()

  1. Внешние файлы не всегда доступны: они исчезают, если пользователь подключает внешний накопитель на компьютере или удаляет его. Информацию о состоянии хранилища см. В API-интерфейсах.

  2. В этих файлах нет безопасности. Например, любое приложение, содержащее WRITE_EXTERNAL_STORAGE, может записывать эти файлы.

+0

Я использовал 'getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS)', но путь загрузки просто изменился с '/ storage/emulated/0' на' /storage/emulated/0/Download'. (При наличии встроенного хранилища). Вы знаете, почему? – soonoo

+0

Я думаю, что вы должны увидеть ответ на commonsware http://stackoverflow.com/a/23030038/2319390, не забудьте посмотреть его серию публикаций в блоге –

+0

Не могли бы вы продумать это предложение «Внешние файлы не всегда доступны: они будут исчезают, если пользователь монтирует внешнее хранилище на компьютере или удаляет его »? По моему мнению, файлы будут скрыты, когда пользователь подключит свое устройство к ПК. Но в каком режиме монтирования Google говорит? Когда я подключаю свое устройство к ПК, я могу видеть все файлы на ПК, которые хранятся на указанном выше пути. Пожалуйста, объясните приведенное выше предложение. Заранее спасибо! – VicJordan

0
try this.... 
static String storagestate = Environment.getExternalStorageState(); 
    private static FileOutputStream outStream; 
    private static File imageFilepath; 

    public static String saveImage(Bitmap bitmap) { 
     File folder = null; 
//check for SD card 
     if (storagestate.equals(Environment.MEDIA_MOUNTED)) { 
      folder = new File(Environment.getExternalStorageDirectory(), 
        "*YourStorageNameInDevice"); 
      if (!folder.exists()) { 
       folder.mkdir(); 
      } 
      outStream = null; 

      String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") 
        .format(new Date()); 
//getting filepath 
      imageFilepath = new File(folder.getPath() + File.separator 
        + timestamp + ".PNG"); 
      try { 
       outStream = new FileOutputStream(imageFilepath); 
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
       outStream.flush(); 
       outStream.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return imageFilepath.getAbsolutePath(); 
    } 
}