Acceso al almacenamiento en el rincón

Lo más parecido a la documentación que puedo encontrar que tiene que ver con el almacenamiento de archivos es este post (ver más abajo si no puede acceder a él), pero me deja con varias preguntas.

Realmente, realmente, realmente me gustaría una explicación bien informada de lo que los caminos de mapa a lo que el almacenamiento de aquí, viendo cómo se supone que los códigos duros, y cómo precisamente se espera que para acceder a ellos. Una muestra de código real sería superlativa. Mi mejor suposición de jugar con esto es que:

  • / Sdcard-> en la ranura interna de eMMC, y el acceso está restringido. Environment.getExternalStorageDirectory (); … todavía devuelve esto.
  • / Media -> mapas a la memoria interna de 8GB (puedo escribir a esto)
  • / Data ->?
  • ? -> mapas a la tarjeta microSD opcional

¿Cómo podemos acceder a la tarjeta externa (opcional, adicional, la que se puede saltar), si / sdcard se asigna a almacenamiento restringido en su lugar ?

Ahora, para citar los documentos del desarrollador Nook:

Fondo Existen dos esquemas de partición diferentes para los dispositivos NOOK Color en el mercado actual, uno con sólo 250 MB disponibles para aplicaciones en la partición / data y uno con 4 GB disponible para aplicaciones en la partición / data. Como resultado, es imprescindible que las aplicaciones sean diseñadas y desarrolladas de tal manera que gestionen el espacio de manera efectiva. Las aplicaciones que no lo hagan no serán aceptadas para su distribución a través de la Tienda.

Si su aplicación requiere gran cantidad de datos (incluyendo pero no limitado a imágenes, contenido de audio o video), debe descargar esos recursos en tiempo de ejecución y almacenarlos en la partición más grande del dispositivo. Si su aplicación va a solicitar y almacenar más de 100 MB de datos o recursos, DEBE cumplir con las siguientes restricciones:

Su aplicación debe indicar de forma clara y explícita en la descripción siempre que la aplicación utilice o suministre una gran cantidad de datos. Debe escribir sus recursos y datos en la partición apropiada. Puede detectar si el dispositivo tiene una partición ampliada / de datos de la siguiente manera:

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 ... } 

Para escribir datos en el espacio privado de su aplicación en / data

 FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE); 

Su aplicación NO debe asumir la presencia de una tarjeta SD en el dispositivo, pero puede probarla por medio de una llamada a

Environment.getExternalStorageState (); Si una tarjeta SD no se encuentra, su aplicación DEBE salir con gracia con una notificación al usuario en cuanto a la razón de la salida.

Recuerde que para acceder a la partición / media, así como a ExternalStorage, debe declarar en su manifiesto:

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

En primer lugar, pruebe los métodos siguientes:

  • Context.getExternalFilesDir
  • Context.getExternalCacheDir
  • Environment.getExternalStoragePublicDirectory

Si ninguno de los dos le devuelve un directorio en el que puede escribir, compruebe el siguiente hilo de grupos de Google y utilice el código proporcionado en la última respuesta, que enumera todos los puntos de montaje actuales:

Tengo el mismo problema con Galaxy S. Hasta ahora todos los dispositivos Android I
Tiene tener "mount" comando disponible. Construyo una lista de la respuesta de "montaje" de análisis de volumen disponible. Esto no es perfecto pero cleaver que la API de almacenamiento de Android.

 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) { //... } 

Si es posible insertar la tarjeta microSD en el dispositivo Nook, mientras está funcionando, también podría intentar lo siguiente:

 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); 

Bueno, esto es lo que he aprendido en el último par de semanas.

Si desea escribir en la tarjeta SD interna , utilice Context.getFilesDir () . Devolverá el directorio privado para su aplicación. No puede inventar sus propios directorios en el almacenamiento flash interno (también conocido como "/ data"). No tiene permiso para escribir en ningún otro lugar que no sea la carpeta que le asigna la aplicación. Supuestamente hay dos particiones internas, "/ data" y "/ media", pero no puedo llegar a "/ media" para salvar mi vida.

Puede utilizar la memoria flash externa , "/ sdcard", cuando esté disponible. Esta es la tarjeta que puede salir del dispositivo. Hay dos maneras de ir sobre esto:

  • Guarde las cosas en la carpeta asignada a su aplicación (por lo que se eliminará cuando se desinstale su aplicación). Puede encontrar esa carpeta con Context.getExternalFilesDir () .
  • Almacene las cosas donde sea, ya sea en alguna ruta codificada en "/ sdcard / foo / bar" o en Environment.getExternalStorageDirectory () / lo que sea.

Este mensaje de un representante de B & N (al que me referencié en mi pregunta) resultó ser un poco de un arenque rojo, "/ sdcard" no se mapea a la ranura eMMC, y no tengo ni idea de lo que "mapeamos la tarjeta SD A nuestro eMMC interno "significa.

Este post de B & N dice que "/ media" es interno, pero no puedo escribir a él aunque tenga los permisos de manifiesto adecuados … así que ve a la figura.

Este es un screencap de mi dispositivo de prueba, que muestra lo que es y no es accesible: Introduzca aquí la descripción de la imagen

El código para eso (tenga en cuenta que FileUtils no está incluido en el sdk de forma predeterminada, es de la biblioteca org.apache.commons.io):

 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"; } 
  • Cómo crear un archivo de imagen de tarjeta SD para el emulador de Android?
  • Cómo guardar el archivo desde el sitio web a sdcard
  • Android: cómo escuchar "tarjeta sd eliminada inesperadamente"
  • ¿Cómo puedo copia de seguridad de archivos sqlite en tarjeta SD mediante programación?
  • Abrir un archivo de texto de 12kb toma WAY demasiado tiempo ...?
  • Transmita la salida logcat de android a una tarjeta sd
  • Sistema de archivos de la tarjeta SD de Android
  • No se puede guardar ni cargar entero con las preferencias
  • ¿Cómo comprobar el permiso se concede para una ruta de directorio y no abre el error EACCES?
  • Java.io.FileNotFoundException (permiso denegado) Al intentar escribir en el sdcard de Android
  • File.canWrite () dice "true" pero no puedo escribir en almacenamiento extraíble (kit kat)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.