Доступ к хранилищу в укромном уголке


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

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

  • / 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 4

2 ответа:

Прежде всего попробуйте следующие методы:

Если ни один из них не возвращает вам каталог, в который вы можете писать, проверьте следующий поток 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";
}