Пожалуйста, прочтите весь пост, прежде чем голосовать против и / или отмечать его как дубликат!
Я работаю над приложением, которое считывает файлы из определенной папки на телефоне пользователя - либо с SD-карты (если она есть), либо из встроенного хранилища. Да, "READ_EXTERNAL_STORAGE" упоминается в манифесте, и я также обрабатываю всплывающее окно разрешения для API> 23.
Раньше я просто использовал
File folder = new File(Environment.getExternalStorageDirectory(), "myfolder");
чтобы получить путь к папке, которая хранится во встроенном хранилище (32 ГБ для S7), но теперь я хочу получить путь к SD-карте. Согласно почти каждому результату, который дал мне Google, «Environment.getExternalStorageDirectory ()» должен указать вам путь к SD-карте, но для меня это не так (и никогда не было).
Я протестировал следующее с двумя разными Samsung Galaxy S7, оба с Android 7.0, один с SD-картой (+ папка), другой без (+ папка):
Log.d(tag, System.getenv("EXTERNAL_STORAGE"));
Log.d(tag, System.getenv("SECONDARY_STORAGE"));
Log.d(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+"myfolder").isDirectory());
Log.e(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+ordner).getAbsolutePath());
Log.d(tag, Environment.isExternalStorageRemovable());
Log.d(tag, Environment.getExternalStorageDirectory());
Log.d(tag, Environment.getExternalStorageDirectory().getAbsolutePath());
К моему удивлению, оба телефона выводят одинаковую информацию:
/sdcard
null
true
/sdcard/myfolder
false
/storage/emulated/0
/storage/emulated/0
Согласно приложению файлового менеджера («Мои файлы»), встроенное хранилище называется «Внутреннее хранилище», что имеет еще меньший смысл (я знаю разницу между внутренним и внешним хранилищем в Android).
Как мне получить путь к реальной SD-карте (без жесткого ее кодирования)?
Прочтите, пожалуйста, весь пост! мой первый тест уже дал мне «/ sdcard», но даже несмотря на то, что я создал папку «myfolder» прямо внутри нее с помощью приложения «Мои файлы», третий тест не удался.
Я вижу, вы используете SECONDARY_STORAGE
для проверки своей папки, а не EXTERNAL_STORAGE
Поднимитесь на одну строку вверх. Как я уже сказал: пожалуйста, прочтите весь пост!
Log.d(""+new File(System.getenv("SECONDARY_STORAGE")+File.separator+"myfolder").isDirectory());
Что ты здесь видишь, чувак?
Неужели «чувак»? Но да, это была моя ошибка, потому что использование EXTERNAL_STORAGE фактически приводит к «true», спасибо за совет.
Неважно, он действительно возвращает "true", но он также возвращается на S7, у которого нет SD-карты, так что вернемся к исходной точке. : /
@Neph Я пропустил весь ответ, который вы передали на каждый ответ из того, что я сделал ниже, 1) Вы создали папку на SD-карте вашего устройства с помощью стороннего приложения 2) Вы получаете другой адрес с помощью метода Env.getexternalstorage (), поэтому Вы не можете решить, правильный это адрес или нет. 3) Если эта папка существует внутри устройства, вы хотите выполнить операцию архивирования и разархивирования файлов, верно?
1) Да и нет, я создал папку «myfolder» со стандартным приложением Android «Мои файлы» (не сторонним) - я также просто протестировал создание еще одного через Win 10, и полученная папка («myfolder2») появилась на на том же уровне, что и «myfolder», 2) Нет, я всегда получаю «/ storage / emulated / 0» (и всегда получаю), 3) Да, я хочу распаковать файл в этой папке на SD-карте, а затем прочитать получившиеся файлы или просто прочтите файлы, которые уже находятся в папке.
Дубликат stackoverflow.com/questions/5694933/…
@LarsH Это действительно похожий вопрос, вы правы в этом, но ему 7 лет и о гораздо более старой версии Android - я спросил об Android 7.0, в котором доступ к файлам на SD-картах работает совершенно иначе, чем, например, Android 4.3.
вам необходимо вставить следующее разрешение в файл манифеста вашего приложения:
<?xml version = "1.0" encoding = "utf-8"?>
<manifest
xmlns:android = "http://schemas.android.com/apk/res/android" >
<!-- Add this -->
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
Прочтите, пожалуйста, весь пост! Разрешение уже упоминается в моем файле манифеста (включая всплывающее окно с разрешениями в моем коде), иначе оно не сработало бы в первую очередь, пока я не попытался его изменить, поэтому он также может обрабатывать SD-карты.
Единственный способ, который я нашел, - это полужестко его закодировать:
File[] folders = myappcontext.getExternalCacheDirs();
дает вам путь к папкам «кеша», к которым у вашего приложения есть доступ (но которые удаляются при удалении приложения).
Если в телефоне используется съемная SD-карта (которая в данный момент смонтирована), длина массива должна быть «2»:
Выглядят они примерно так:
/storage/emulated/0/Android/data/com.mycompany.myapp/cache
/storage/xxxx-xxxx/Android/data/com.mycompany.myapp/cache
... где "x" - это номер (id?) вашей SD-карты. Я смог протестировать это только с двумя разными SD-картами, и у обеих был свой номер.
Environment.getExternalStorageDirectory();
также должен дать вам
/storage/emulated/0/
это способ получения доступа к внешнему хранилищу без жесткого кодирования. ;)
Если вы создадите новую папку на самом первом уровне вашей SD-карты на вашем ПК, ее путь будет следующим:
/storage/xxxx-xxxx/myfolder
Я также должен вас предупредить: несмотря на то, что вы можете читать папку «myfolder», вы не можете писать в ней (просто вызовет исключение «Доступ запрещен» в Android 7) из-за изменений во всей системе, которые пришли с Kitkat. . Но это другая проблема, которую я собираюсь затронуть в новом вопросе.
Это хорошие способы (из-за отсутствия лучшего способа) найти съемную SD-карту. Для более надежного подхода для других версий Android и производителей см. stackoverflow.com/questions/5694933/…
Environment.getExternalStorageDirectory()
можно использовать. продолжайте следить за родительской папкой, пока не найдете / sdcard /