Как получить путь к общему хранилищу? Внешнее хранилище (не SD-карта)

Я хотел бы получить путь к общедоступному хранилищу моего устройства Android. У меня есть два приложения. Один записывает некоторые файлы журналов, а другой используется для их чтения (по этой причине я не могу использовать личное хранилище приложения). Я хотел бы знать, есть ли метод, который даст мне путь к «общественному пространству» моего устройства, где я могу легко создавать и читать файлы.

Это решение не то, что я ищу:

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

Ни то, что:

Как получить внутренний и внешний путь SD-карты в андроид

Есть ли простое решение моей проблемы? Является ли внешнее общедоступное хранилище тем, что мне нужно?

http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

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

Мой код ниже не работает (он не сохраняет файл). Когда я выбираю каталог, который находится непосредственно в Environment.getExternalStorageDirectory().getAbsolutePath(), он работает... Что я делаю неправильно? :

transient private final String DIRECTORY = "/Android/data/com.aaa.bbb.ccc/files/";

public void writeLog()
{
    Calendar calendar = setDate();

    File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + DIRECTORY);
    if(!dir.exists())
        dir.mkdir();

    File file = new File (dir, "log_" + calendar.get(Calendar.YEAR) + "_"
                                 + ((calendar.get(Calendar.MONTH))+1) + "_"
                                 + calendar.get(Calendar.DAY_OF_MONTH)
                                 + ".dta");

...

}

ОБНОВИТЬ:

Почему этот код работает:

    File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Dir1/");
    if(!dir.exists())
        dir.mkdir();

И это не

    File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Dir1/Dir2/Dir3/");
    if(!dir.exists())
        dir.mkdir();

person Marek    schedule 30.05.2013    source источник


Ответы (2)


попробуйте посмотреть android.os.Environment здесь.

Следующие методы кажутся интересными.

public static File getDataDirectory ();
//Gets the Android data directory. 

public static File getDownloadCacheDirectory ();
//Gets the Android download/cache content directory.  

ИЗМЕНИТЬ: *Решение:*

тогда небольшая ошибка, которую вы совершали,

замените это:

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

с участием:

if(!dir.exists())
    dir.mkdirs(); // will create all the parent directories as well..

надеюсь, я помог вам сейчас с

person aditya    schedule 30.05.2013
comment
Почему этот метод не подходит: getExternalStorageDirectory().getAbsolutePath и почему мой код не работает... он должен работать - person Marek; 30.05.2013
comment
в вашем коде проблема в том, что нет SDCard. поэтому я предложил вам найти способы записать файл в память телефона. Если sdcard нет, как вы можете записать в нее? - person aditya; 30.05.2013
comment
Код, который я использую, заключается в записи в память телефона, видимую как SD-карта (у меня Galaxy S3). Проблема в другом. Когда я использую DIRECTORY, как это написано сейчас, это не работает. Но когда я помещаю в DIRECTORY только один каталог, например DIRECTORY = /SomeDir/, он отлично работает... почему? - person Marek; 30.05.2013
comment
Я только что нашел эту ошибку в тот же момент, когда вы написали. Но спасибо! Позвольте мне проверить, работает ли чтение - person Marek; 30.05.2013
comment
да, ничто не может остановить вас на данный момент! - person aditya; 30.05.2013
comment
на эмуляторе Android 4.4.2 без SD-карты я получаю ошибку отказа в разрешении, если пытаюсь написать в getDownloadCacheDirectory() EACCESS (отказано в доступе), когда я открываю файл для записи /cache/test.tmp. getDataDirectory() также защищен от записи. на эмуляторе android 2.1 работает. - person k3b; 17.11.2014

На некоторых устройствах имя внешней SD-карты по умолчанию отображается как extSdCard, а на других — sdcard1. Этот фрагмент кода помогает узнать этот точный путь и помогает получить путь к внешнему устройству.

String sdpath, sd1path, usbdiskpath, sd0path; 
if (new File("/storage/extSdCard/").exists()) {
    sdpath="/storage/extSdCard/";
    Log.i("Sd Cardext Path", sdpath);
}
if (new File("/storage/sdcard1/").exists()) {
    sd1path="/storage/sdcard1/";
    Log.i("Sd Card1 Path", sd1path);
}
if (new File("/storage/usbcard1/").exists()) {
    usbdiskpath="/storage/usbcard1/";
    Log.i("USB Path", usbdiskpath);
}
if (new File("/storage/sdcard0/").exists()) {
    sd0path="/storage/sdcard0/";
    Log.i("Sd Card0 Path", sd0path);
}
person Sam    schedule 19.05.2014