Доступ к хранилищу в укромном уголке
Самое близкое к документации, что я могу найти, связанное с хранением файлов, - этоэтот пост (см. ниже, если вы не можете получить к нему доступ), но он оставляет меня с несколькими вопросами.
Мне бы очень, очень, очень хотелось получить исчерпывающее объяснение того, какие пути соответствуют какому хранилищу здесь, видя, как мы должны жестко их кодировать, и как именно мы должны получить к ним доступ. Фактический образец кода был бы превосходной степенью. Моя лучшая догадка от возни с этим заключается в том, что:
- / sdcard - > сопоставляется с внутренним слотом eMMC, и доступ ограничен. Окружающая среда.getExternalStorageDirectory ();... все еще возвращает это.
- / media - > карты на внутреннюю память 8 ГБ (я могу записать на это)
- / data -> ?
- ? - >карты на дополнительную карту microSD
Как мы можем получить доступ к внешней (необязательной, дополнительной, той, которую вы можете вытащить) SD-карте, если /SD-карта сопоставляется с ограниченным хранилищем вместо?
Теперь к цитирую документы разработчика Nook:
Фон есть две различные схемы секционирования для укромного уголка Цветные устройства на рынке сегодня, один с только 250 МБ доступны для приложения на разделе / data и один с 4 ГБ доступны для приложения в разделе / data. В результате, это необходимо что приложения разрабатываются и разрабатываются таким образом, чтобы эффективно управляйте пространством. Приложения, которые не смогут этого сделать, не будут принимается к распространению через Магазин.
Область, связанная с технической рекомендацией или решением, если ваш приложение требует большого объема данных (включая, но не ограничиваясь к изображениям, аудио-или видеоконтенту), вы должны загрузить их ресурсы во время выполнения и хранить их в большем разделе устройство. Если ваше приложение будет запрашивать и хранить более 100 МБ данных или ресурсов вы должны соблюдать следующее ограничения:
Ваше приложение должно быть четко и ясно состояние в описании при условии, что большой объем данных используется / доставляется приложение. Вы должны записать свои ресурсы и данные на соответствующие раздел. Вы можете обнаружить, если устройство имеет увеличенный / данные раздел следующим образом:
StatFs stat = new StatFs("/data"); long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount(); long megAvailable = bytesAvailable / 1048576; if (megAvailable > 1000){ ... write your resources in /data } else { ... write your resources on /mnt/media ... }
Для записи данных в личное пространство вашего приложения на /data
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE);
Ваше приложение не должно предполагать наличие SD-карты на устройстве, но вы можете проверить ее с помощью вызова to
Окружающая среда.getExternalStorageState (); если SD-карта не найдена, ваше приложение должно выйти изящно с уведомлением для пользователя что касается причины выхода.
Помните, что для доступа к разделу / media, а также ExternalStorage вам нужно объявить в своем манифесте:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> </uses-permission>
2 ответа:
Прежде всего попробуйте следующие методы:
- контекст.getExternalFilesDir
- контекст.getExternalCacheDir
- окружающая среда.getExternalStoragePublicDirectory
Если ни один из них не возвращает вам каталог, в который вы можете писать, проверьте следующий поток google-groups и используйте код, приведенный в последнем ответе, который перечисляет все текущие точки монтирования:
У меня та же проблема с галактикой S. До сих пор все Android устройства I
у меня есть доступная команда "mount". Я строю список доступных томов разбор" монтируемого " ответа. Это не идеально, но Кливер, чем Андроид API хранилища.String cmd = "/system/bin/mount"; try { Runtime rt = Runtime.getRuntime(); Process ps = rt.exec(cmd); BufferedReader rd = new BufferedReader( new InputStreamReader(ps.getInputStream()) ); String rs; while ((rs = rd.readLine()) != null) { //check what you need! Log.i("MOUNT_CMD", rs); } rd.close(); ps.waitFor(); } catch(Exception e) { //... }
Если есть возможность вставить карту microSD в устройство Nook во время его работы, вы также можете попробовать следующее:
mVolumeManagerReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Log.i("MediaMounter", "Storage: " + intent.getData()); } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); filter.addDataScheme("file"); context.registerReceiver(mVolumeManagerReceiver, filter);
Хорошо, вот что я узнал за последние пару недель.
Если вы хотите записать на внутреннюю SD-карту, используйте контекст .getFilesDir () . Он вернет частный каталог для вашего приложения. Вы не можете придумать свои собственные каталоги на внутреннем флэш-накопителе (он же "/data"). У вас нет разрешения на запись в любом другом месте, кроме папки, которую получает ваше приложение. Предположительно есть два внутренних раздела, "/ data " и "/ media", но я не могу добраться до них. "/media", чтобы спасти мою жизнь.
Вы можете использовать внешнюю флэш-память, "/sdcard", когда она доступна. Это карта, которую вы можете вытащить из устройства. Есть два способа сделать это:
- храните вещи в папке, назначенной вашему приложению (чтобы оно было удалено когда ваше приложение будет удалено). Вы можете найти эту папку с контекст.getExternalFilesDir () .
- храните вещи где угодно, либо в каком-то жестко закодированном пути под " / sdcard / foo / bar" или в окружающая среда.getExternalStorageDirectory () / что угодно.
Этот пост от представителя B&N (на который я ссылался в своем вопросе) оказался немного отвлекающим маневром, "/sdcard" не соответствует слоту eMMC, и я понятия не имею, что означает "мы сопоставили SD-карту с нашей внутренней eMMC".
Этот пост B&N говорит, что "/media" является внутренним, но я не могу писать в него, даже если у меня есть соответствующие разрешения манифеста... так что иди и разберись.
Это экранная карта моего тестового устройства, показывающая, что доступно, а что нет:
Код для этого (обратите внимание, что FileUtils не включен в sdk по умолчанию,он из org.apache.commons.io lib):
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView dataView = (TextView) findViewById(R.id.data); dataView.setText(testIt("/data")); TextView mediaView = (TextView) findViewById(R.id.media); mediaView.setText(testIt("/media")); TextView mntMediaView = (TextView) findViewById(R.id.mntMedia); mntMediaView.setText(testIt("/mnt/media")); try { File fd = this.getFilesDir(); if(fd != null) { TextView fdView = (TextView) findViewById(R.id.filesDir); fdView.setText("getFilesDir(): " + testIt(fd.toString())); } } catch (Exception e) { e.printStackTrace(); } try { File efd = this.getExternalFilesDir(null); if(efd != null) { TextView efdView = (TextView) findViewById(R.id.externalFilesDir); efdView.setText("getExternalFilesDir(): " + testIt(efd.toString())); } } catch (Exception e) { e.printStackTrace(); } try { File esd = Environment.getExternalStorageDirectory(); if(esd != null) { TextView esdView = (TextView) findViewById(R.id.externalStorageDirectory); esdView.setText("getExternalStorageDirectory(): " + testIt(esd.toString())); } } catch (Exception e) { e.printStackTrace(); } try { File espd = Environment.getExternalStoragePublicDirectory(null); if(espd != null) { TextView espdView = (TextView) findViewById(R.id.externalStoragePublicDirectory); espdView.setText("getExternalStoragePublicDirectory(): " + testIt(espd.toString())); } } catch (Exception e) { e.printStackTrace(); } } public String testIt(String dir){ StatFs stat = new StatFs(dir); long bytesAvailable = (long) stat.getBlockSize() * (long) stat.getBlockCount(); long megAvailable = bytesAvailable / FileUtils.ONE_MB; File dirFile = new File(dir + "/test/"); dirFile.mkdir(); return dir + "/test \n canRead() " + dirFile.canRead() + ", \n canWrite() " + dirFile.canWrite() + " with " + megAvailable + "MB available"; }