¿Cuál es la raíz de la memoria del teléfono? Un método de protección contra la copia no autorizada de archivos a la raíz de una tarjeta flash para usuarios del sistema operativo WINDOWS. Determinar unidades externas en el dispositivo

propietarios de portátiles dispositivos digitales Hace tiempo que apreciamos las ventajas y oportunidades que se abren al utilizar tarjetas de memoria. Como regla general, no surgen dudas sobre su funcionamiento. Al mismo tiempo, algunas designaciones pueden resultar engañosas. Un ejemplo es la raíz de una tarjeta de memoria.

Origen y significado de la raíz de la tarjeta de memoria Información diversa en formulario electrónico se puede guardar en dispositivo especial llamada tarjeta de memoria.

Está diseñado para almacenar documentos de texto, grabaciones de audio y vídeo, imágenes. La principal ventaja de este tipo de memoria es la facilidad de grabar información y la compacidad del dispositivo, además de una importante cantidad de datos almacenados. La memoria interna está representada por RAM, memoria permanente y memoria caché. Sus ventajas incluyen la velocidad, pero la desventaja es la cantidad limitada de datos almacenados. para el usuario moderno ordenador personal etcétera tecnología electrónica Tienes que encontrarte con la siguiente frase: "instalar en la raíz de la tarjeta de memoria" o "copiar en la raíz de la tarjeta". Se puede encontrar en cualquier lugar, porque tecnología moderna cada vez más comienza a apoyar tarjetas de terceros para aumentar la memoria interna. Las tarjetas de memoria están estandarizadas. Tienen ciertas dimensiones generales y ubicación de las almohadillas de contacto según el tipo de dispositivos para los que están destinados a utilizarse. Esto incluye computadoras portátiles, tabletas, teléfonos inteligentes, cámaras digitales e incluso PSP con otros consolas de juegos. Por lo tanto para funcionamiento correcto no puede arreglárselas con ellos sin tener una idea clara de lo que puede significar la expresión "raíz de la tarjeta de memoria" y de dónde se puede ubicar el nombre del lugar para guardar los datos en la tarjeta. palabra inglesa raíz – “radical, raíz”, que denota algo primordial, primordial. Se empezó a utilizar desde el principio, cuando empezaron a aparecer las computadoras. En ellos, la raíz se llamaba el contenido mismo del dispositivo, es decir, el lugar desde donde se iniciaba el sistema y donde se podían guardar los datos. Básicamente, en lo que respecta a las tarjetas de memoria actuales. esta designación nada ha cambiado. Directorio raíz Hoy en día, la raíz de una tarjeta de memoria es el directorio mismo, que se encuentra en la tarjeta. Esta es la misma carpeta que se abre al hacer clic en el icono de la tarjeta de memoria en un teléfono inteligente o netbook. Es solo que la palabra raíz se tradujo literalmente y ahora se usa su análogo ruso para referirse a la tarjeta misma. Por lo tanto, si se le solicita que copie datos a la raíz, entonces no necesita crear nada adicional en la tarjeta de memoria, simplemente copie archivos necesarios en él mismo, en el directorio raíz.

1. Descargar al dispositivo archivo de instalación SAS4Android.apk

2. Habilite el permiso de instalación en su dispositivo (teléfono, tableta, etc.) aplicaciones de terceros(no del Mercado). Esto se puede hacer en la configuración de su dispositivo: Configuración - Seguridad - Fuentes desconocidas– marque la casilla Permitir la instalación de aplicaciones desde fuentes desconocidas (después de instalar SAS4Android, esta casilla de verificación se puede desmarcar). Copia el archivo SAS4Android.apk a su dispositivo y comience a instalarlo.

3. Ejecute el archivo SAS4Android.apk .

4. Cuando lo inicia por primera vez, aparece una ventana que solicita la ruta a la raíz de la tarjeta de CD y acepta los términos de uso. Hacer clic DE ACUERDO. Además, en el primer lanzamiento, se crea automáticamente. carpeta de trabajo aplicaciones - SAS4Android y hay una carpeta en el trabajar. Esta es la carpeta de trabajo del programa en la que se guardarán los datos necesarios. Tenga en cuenta que debe indicar el camino es exactamente a la raíz Tarjeta SD (y no a ninguna otra carpeta): ¡esto es importante!

De forma predeterminada, la estructura de carpetas del programa es la siguiente:

Raíz_tarjeta_SD/SAS4Android/trabajo - carpeta de trabajo - creada automáticamente;

Raíz_tarjeta_SD/SAS4Android/cache - carpeta de caché: creada por el usuario.

Si se utiliza la estructura de carpetas predeterminada, el programa detecta automáticamente las rutas a las carpetas necesarias y archivos. Si se utiliza una estructura de carpetas diferente, las rutas deben especificarse manualmente. En dispositivos con versión de Android Antes de 4.3.x, se recomienda utilizar la estructura de carpetas predeterminada.

Puedes determinar la ruta a la tarjeta. de la siguiente manera: Antes de insertar la tarjeta SD en el dispositivo, cree (en su computadora) una carpeta con comprensible para ti nombre, por ejemplo Nombre.
Desconecte el dispositivo de la computadora; de lo contrario, la tarjeta SD en modo de almacenamiento no estará disponible para Android ni para todos los programas. (Es más conveniente usarlo para comunicarse con una computadora programa MyPhoneExplorer, que le permite editar información en el dispositivo a través de una computadora y la tarjeta SD permanece accesible para todos). abrir cualquier gestor de archivos en tu dispositivo e inicia sesión la misma raíz directorio del dispositivo. Habrá varios directorios allí. Mirando sus contenidos, busque "su" carpeta en uno de ellos. La ruta que muestra el administrador de archivos raíz este directorio es lo que necesitas. Recuérdalo o escríbelo. EN diferentes dispositivos Ambas versiones de Android tienen diferentes opciones para la ubicación y el nombre de la carpeta de la tarjeta SD. Si hay una carpeta mnt Por ejemplo mnt/tarjeta SD , o mnt/external_sd , o mnt/extSdkard . En algunos dispositivos, carpetas mnt puede que no lo haya. En este caso, la carpeta montada en la tarjeta normalmente se encuentra directamente en la raíz del dispositivo, por ejemplo así: / Tarjeta SD o / Tarjeta SD1 o /extSdkard . En las versiones de Android 4 y superiores, normalmente se encuentra la siguiente carpeta: almacenamiento/tarjeta SD o almacenamiento/tarjeta SD1 o almacenamiento/external_sd o almacenamiento/extSdkard .
Entonces, determinemos que nuestra tarjeta SD está montada como /mnt/externo . Esta es exactamente la ruta que se debe ingresar (o mejor aún, seleccionar abriendo el cuadro de diálogo del archivo con el botón [...]) cuando inicia el programa por primera vez antes de que aparezca el menú.

Características del lanzamiento en Android 4.4 y superior

En Android 4.4 y superiores, se eliminaron los derechos de la aplicación para escribir en la tarjeta SD. Si el fabricante no corrigió el firmware durante el ensamblaje, la aplicación en un dispositivo no rooteado no podrá escribir en la tarjeta SD. En este caso, el propio programa intentará encontrar dónde colocar el directorio de trabajo. Lo más probable es que sea un directorio en la sección de datos de la aplicación de la memoria interna (sin almacenamiento) del dispositivo.
En este caso, el programa funcionará, los datos se escribirán en la carpeta trabajar , lea desde allí. Pero el usuario se verá privado de la posibilidad de sacar cualquier cosa de la carpeta. trabajar o poner algo ahí. Por supuesto, estamos hablando de un dispositivo no rooteado. Si esta situación conviene al usuario, no es necesario hacer nada más. De lo contrario tendrás que trabajar con las manos.
Necesitamos encontrar un lugar en el dispositivo donde el programa pueda escribir datos, y podemos tomar estos datos desde allí y agregar los nuestros si es necesario.
Experimentalmente logramos encontrar un lugar así. Procedimiento de instalación:

1. Conectando dispositivo USB cable a la computadora y crearlo en el directorio almacenamiento interno carpeta Datos . O hacemos lo mismo en el propio dispositivo usando el administrador de archivos. El camino debe ser almacenamiento/sdcard0/Datos . A la carpeta Datos poner el archivo .nomedia .
¡Atención! Todos los intentos de crear una carpeta. trabajar(visible y editable en la computadora) en otros lugares/carpetas de la memoria interna fracasado. Puede crearlo e incluso cuando inicia SAS4Android por primera vez, puede especificar la ruta a la carpeta deseada. Pero después de la instalación, el acceso a esta carpeta se vuelve imposible. Puede ver el dispositivo a través del administrador de archivos, pero agregar algo (pistas, nueva clave licencias, configuraciones de mapas/capas, etc.) desde una tarjeta extraíble o computadora, y también copiar a tarjeta removible o una computadora, imposible.
¿Por qué se elige el nombre para la carpeta? "Datos" ? El truco es que coincida con el nombre. Datos , adoptado en la terminología estándar del dispositivo, y además ese androide distingue entre letras grandes y pequeñas. En total sistema android percibe esta carpeta como propia y no restringe los derechos de su contenido.

Aquí hay un método de derivación probado y listo para usar Restricciones de Android 4,4x. No se prohíbe al usuario experimentar con la ubicación y el nombre de esta carpeta.

Ahora la carpeta que creamos almacenamiento/sdcard0/Datos desempeñará el rol, cuya ruta debe especificarse cuando se inicia el programa por primera vez.
2. Creamos en la raíz. externo carpeta de tarjeta SD SAS4Android , y en esta carpeta - la carpeta cache . Ponemos el caché allí. La ruta al caché será .
3. Cuando lo inicies por primera vez, el programa te pedirá la ruta a la raíz de la tarjeta SD. Especifique la ruta a la carpeta que creamos: almacenamiento/sdcard0/Datos . en una carpeta Datos el programa creará una carpeta SAS4Android , y en él una carpeta trabajar con estándar conjunto básico archivos. Ahora todos los archivos del programa de trabajo se ubicarán en la carpeta. almacenamiento/sdcard0/Datos/SAS4Android/trabajo , y tendremos acceso a ellos.
4. Ahora necesita indicarle al programa la ruta al caché, ya que difiere de la ruta predeterminada. Para este propósito en programa en ejecución entramos Ajustes - Directorio de caché de mapas y utilice el cuadro de diálogo de archivo para especificar la ruta almacenamiento/sdcard1/SAS4Android/cache .La instalación está completa.
#!!! Numerosas comprobaciones han demostrado que con dicha instalación de SAS4Android en dispositivos con Android 4.4.4, con actualizaciones adicionales o incluso eliminación completa y reinstalar el directorio de la aplicación almacenamiento/sdcard0/Datos sigue funcionando, contenidos trabajar no se pierde ni se rompe, acceso a edición trabajar abrir tanto a través del dispositivo como a través de la computadora. Probado en Sony Xperia Z, así como Z3 compact y WinXP/Win7.
#!!! que el directorio de trabajo trabajar se ve obligado a terminar en la memoria interna del dispositivo, hay una ventaja significativa: en caso de un problema técnico/fallo de la tarjeta SD en condiciones de campo, y esto le puede pasar a cualquiera, pierdes (temporalmente) solo el caché, pero el tracklog y otros contenidos trabajar permanecerá intacto y funcionando.
Consejo : siempre es útil tener una reserva extrema - periódicamente, después de la aparición de nuevas pistas y puntos importantes, copio/guardo este trabajo modificado trabajar a la tarjeta SD en la carpeta nativa SAS4Android, al lado de cache . Allá trabajar, por supuesto, no funciona, es solo un archivo guardado. ¿Qué pasa si la bestia falla? Entonces la tarjeta ayudará con la recuperación parcial.

#!!! En Android 4.4.x (si el fabricante no corrigió el firmware durante el montaje) intercambio en línea mapear datos en un caché descomprimido desde servicios de terceros usando scripts escritos en JavaScript, sin raíz posible sólo a la memoria interna. Para cargar caché en línea necesitarás crear adicionalmente una segunda carpeta cache en el directorio de trabajo del programa almacenamiento/sdcard0/Data/SAS4Android/ y coloque de antemano la cantidad requerida de carpetas con los nombres de las fuentes/capas del mapa y los scripts colocados en ellas. Tendrá que acostumbrarse a cambiar entre dos directorios de caché según las necesidades actuales: trabajar sin paginación, con el principal cache , y con paginación - cambie a cache en la memoria interna.

Salga al menú de configuración del programa.

Después de iniciar el programa, salga al menú de configuración haciendo clic en botón del sistema"Menú". Puede ser un botón de hardware o botón de pantalla en la parte inferior de la pantalla ( tres puntos verticales). Dependiendo de su dispositivo y la versión de Android que tenga, puede ser un botón de hardware o un botón en pantalla en la parte inferior de la pantalla. En muchos dispositivos nuevos con versiones de Android 4 y superiores, este botón se combina con el botón de lista ejecutando aplicaciones (dos rectángulos combinados). En este caso, para salir al menú basta presione y mantenga presionado el botón de aplicaciones en ejecución hasta que aparezca el menú de configuración.

Características de encender y apagar SAS4Android

Cuando inicia el programa, todos los modos están habilitados: mostrar mapas, navegación, grabar un registro de ruta (iniciar el servicio). Es posible salir de la aplicación (ponerla en modo de suspensión) sin detener el servicio, es decir. registros de seguimiento. Dependiendo de la configuración (modo de grabación de registro de seguimiento, modo de parada de servicio), si es necesario, inicie cualquier otro programa, realice una llamada o responda una llamada mientras mantiene un servicio en ejecución, debe usar el botón atrás, o el botón de inicio en forma de casa.

Para detener el servicio, según la configuración, haga doble clic en el botón "Atrás" o baje la "cortina" y haga clic en la línea de la lista de aplicaciones en ejecución. SAS4Android, presione el botón Detener.

#!!! En las tabletas, la barra de estado suele estar situada en la parte inferior. En su lado derecho se agrupan los iconos de las aplicaciones en ejecución. Si hace clic en cualquier icono, aparecerá una ventana con una regla con iconos " Configuraciones rápidas"(sonido, brillo de WiFi, BT, red, ubicación, etc.), y a continuación se muestra una lista línea por línea de las aplicaciones en ejecución.

Características de la distribución del programa.

Programa SAS4Android distribuido gratuitamente.

Límite de vida de la aplicación: nota del autor.

Después de repetidas y maliciosas violaciones de los derechos de autor por parte de algunos distribuidores de navegadores deshonestos, el autor tuvo que introducir una restricción: después de la instalación (o la próxima actualización) del programa SAS4Android funciona correctamente durante 1 mes a partir de la fecha de actualización y luego se "rompe" parcialmente - se pudre. Esto se expresa en una reducción en el tiempo de grabación continua del tracklog (generalmente entre 20 y 30 minutos), después de lo cual la grabación se detiene y aparece el mensaje correspondiente en la pantalla. Entonces solo queda reiniciar el programa (cerrar la aplicación y el servicio y ejecutarlos nuevamente). Y así un número impredecible de veces hasta el final del viaje. Las pistas están grabadas, pero con huecos. Una solución simple pero problemática a este problema son las actualizaciones periódicas, una vez al mes. Cada nueva actualización tiene una fecha de vencimiento posterior, así que actualice y continúe...

Pero hay una manera mejor.

El programa contiene un algoritmo para eliminar restricciones: la clave License.dat, que desactiva la "atenuación". El autor entrega las llaves como muestra de agradecimiento a quienes apoyaron el proyecto. Así que no preguntes “cuánto cuesta” o “cómo comprarlo”. Vaya a cualquier página del foro y observe atentamente el encabezado.

¡Las llaves no están a la venta! Las donaciones que mencionen llaves o compras en los comentarios serán devueltas a los remitentes.

Para generar una clave, se requiere un archivo dispositivold.txt . Es generado por el propio programa SAS4Android y colocado en la carpeta trabajar .

Primero, verifique que el archivo esté en su dispositivo. dispositivold.txt Hay.

Si no está allí, no será posible crear una clave para su navegador (por desgracia, hay algunos modelos muy limitados en los que este mecanismo no funciona).

Si tienes un archivo dispositivold.txt vacío o no funciona (permaneció de versión antigua programa antes de restablecer la configuración de fábrica o actualizar el sistema).

1. Eliminar el anterior dispositivold.txt .

2. Inicie el programa.

3. Esperamos hasta que atrape los satélites (la línea de coordenadas se volverá negra).

4. Cierre el programa. Debe aparecer una identificación válida en la carpeta. trabajar .

Por favor tenga en cuenta el hecho que la clave está vinculada a la ID del dispositivo. En Android, al instalar una actualización del sistema, el identificador del dispositivo cambia. A esto también se debe restablecer la configuración de fábrica. (¿Por qué es así? Pregúntale a los fabricantes de tu dispositivo).

Entonces, si actualiza el sistema o realiza un restablecimiento de fábrica, la clave dejará de funcionar.

Sin embargo, esto también se puede solucionar reemplazando la llave. Envíe cualquier pregunta sobre la eliminación de restricciones en un mensaje personal al autor del programa.

¿Dónde está la carpeta raíz de una unidad flash o tarjeta de memoria?

    Si conecta cualquier dispositivo de almacenamiento a su computadora, aparecerá en el Explorador como una unidad con una ubicación asignada. letra inglesa, si abre este disco, esta será la carpeta raíz. Puedes crear otras carpetas en ella, en cada una de esas carpetas puedes a su vez crear otras carpetas, y así sucesivamente, y en cada carpeta hay archivos. Esto se puede imaginar como un árbol con un tronco y ramas ramificadas que se extienden desde él: carpetas, ramas, archivos, hojas, y la raíz de este árbol es precisamente la carpeta raíz, de ahí el nombre.

    Llamamos carpeta raíz simplemente a la carpeta de una unidad flash o tarjeta de memoria específica. Tan pronto como inserte la unidad flash, se mostrará un nuevo dispositivo frente a usted, cuya apertura lo llevará a la carpeta raíz de la unidad (la carpeta raíz, es decir, la inicial), que puede contener muchos otros carpetas.

    La carpeta raíz de cualquier disco es la carpeta principal de este disco.

    Es decir, cuando estás en la carpeta raíz de un disco, te parece como si nunca hubieras entrado en ninguna carpeta.

    Es decir, la dirección de la carpeta raíz es:

    Las unidades A: y B: generalmente están reservadas para unidades de disquete, que son computadoras modernas Muchas veces ni siquiera lo instalan.

    para un disco duro suele ser C:

    D suele estar reservado para el reproductor de DVD:

    El resto se suele utilizar para dispositivos externos conectados.

    Por ejemplo, para una unidad flash.

    Pero, en mi opinión, no necesariamente tienen que estar en ese orden. Alguien en su computadora puede tener un orden diferente en el que los dispositivos corresponden a los nombres de los discos. Ingresa a la sección mi computadora(si tienes Windows) y verás cómo se ubica para ti.

    La carpeta raíz del sitio tiene la siguiente dirección: http://sitename/

    Aunque para el creador del sitio, en su alojamiento, esta misma carpeta suele ser solo una subcarpeta, ya que allí se pueden crear varios sitios y almacenarlos. diferentes configuraciones configuraciones.

    Se considera que la carpeta raíz es la carpeta de la unidad flash, del programa o del disco mismo. Es decir, puede haber otras (subcarpetas) allí. Es decir, raíz significa original. Y si, por ejemplo, se indica que, por ejemplo, es necesario arrastrar un archivo al directorio raíz de una unidad flash, entonces simplemente debe colocarlo en la unidad flash y no en alguna otra carpeta de esta. unidad flash. Y también por analogía con otros recursos.

    ¿Cuál es la carpeta raíz y cómo llegar allí?

    De hecho, todo es muy sencillo, la carpeta raíz es la carpeta que se considera original. Si, por ejemplo, conecta su unidad flash al dispositivo, aparecerá un menú a través del cual puede ir a la carpeta raíz = esta es la unidad flash en sí, que puede contener tanto carpetas como archivos.

    Muy a menudo puedes escuchar o encontrarte con la frase: instalar/mover/copiar archivo específico a la raíz de la tarjeta de memoria o a la carpeta raíz de la tarjeta flash. Pero, ¿qué es y dónde está la carpeta raíz o simplemente la raíz de la unidad flash?

    La respuesta es realmente muy sencilla. Este nombre proviene del directorio raíz. Es decir, cuando hacemos clic en el icono de la tarjeta de memoria/tarjeta flash y se abre una ventana frente a nosotros, esta es la misma carpeta raíz. Aunque en realidad no vemos la carpeta allí. Esta es el área del mapa con otros archivos y otras carpetas ubicadas en ella. Carpeta raíz(o raíz) de una unidad flash se puede comparar con el piso superior en la jerarquía de todas las carpetas que contiene.

Luego apareció Piruleta Android, y con él nuevas funciones para trabajar con una tarjeta SD. Apareció SAF(Storage Acces Framework), ha aparecido un nuevo Intent ACTION_OPEN_DOCUMENT_TREE, con el que puedes seleccionar la raíz de la tarjeta SD y luego usarla según tus necesidades. De hecho, SAF todavía estaba en KitKat, pero sin este Intent era de poca utilidad, porque para acceder a los archivos de la tarjeta era necesario utilizar el Intent ACTION_OPEN_DOCUMENT , que, a juzgar por el nombre, permite al usuario seleccionar el archivo que desea. quiere editar manualmente a través del selector del sistema. Bien, pero si el usuario tiene 5000 archivos, ¿hará esto? No.

Determinar unidades externas en el dispositivo

Comenzaré con el tema más doloroso al trabajar con tarjetas de memoria. Tenemos un método maravilloso en Android

Entorno de archivo.getExternalStorageDirectory()

Como sugiere el nombre, esto es lo que necesitas. “Externo” se traduce como “externo”, ¿verdad? Pero no deberías confiar en este método. Puede devolver la ruta a la memoria interna, tal vez a la tarjeta, pero sucede de manera diferente en cada dispositivo. Esta situación se produjo en gran medida debido a a diferentes fabricantes teléfonos y sus firmware modificado y conchas. Lo que estoy diciendo es que el método getExternalStorage() puede devolver la ruta no a la tarjeta SD real, sino a lo que el fabricante considera una unidad externa. Aquí es donde surge la confusión en las definiciones. Un disco externo no es necesariamente una unidad flash: en algunos dispositivos es memoria interna, algunos incluso tienen una tarjeta SD. Los puntos de montaje de la tarjeta pueden ser cualquiera:

  • /almacenamiento/extSdCard/
  • /almacenamiento/sdcard1/
  • /almacenamiento/sdcard0/
  • /mnt/external_sd/
  • /mnt/externo/
  • /mnt/sdcard2/
  • /almacenamiento/sdcard0/external_sdcard/
  • /almacenamiento/extraíble/sdcard1/
  • /extraíble/microsd
  • /mnt/media_rw/sdcard1
  • /mnt/emmc

Y esto no es algún tipo de gran problema hasta que lo encuentres tú mismo.

Hay muchos temas en StackOverflow con un montón de diferentes opciones definiciones de una unidad flash, comenzando por buscar en todos posibles combinaciones puntos de montaje, intenta obtener Java variables de entorno System.getenv("EXTERNAL_STORAGE"), System.getenv("SECONDARY_STORAGE") y termina con el análisis archivo del sistema/system/etc/vold.fstab. Estos métodos funcionan, pero cada uno sólo en un caso particular. Ningún método cubre todos los dispositivos o no funciona en absoluto. Y si parece que todas las unidades se detectan correctamente, siempre habrá algún dispositivo cuya tarjeta no se detecte mediante estos métodos. He probado casi todos los métodos.

Para comprender la magnitud del problema, diré que lo traté durante unos cuatro meses. Este problema existe desde 2011, pero aún no existe una solución exacta. Durante algún tiempo estuve contento con este código más o menos funcional:

Lista de matrices allPaths = nueva ArrayList<>(); Lista de matrices sdPaths = nueva ArrayList<>(); para ( archivo de archivo: mContext.getExternalFilesDirs("external")) ( if (file == null) ( continuar; ) int index = file.getAbsolutePath().lastIndexOf("/Android/data"); if (index > 0) ( Ruta de cadena = file.getAbsolutePath().substring(0, index); try ( ruta = new File(path).getCanonicalPath(); ) catch (Excepción e) ( e.printStackTrace(); ) allPaths.add(path); !file.equals(mContext.getExternalFilesDir("externo"))) ( sdPaths.add(ruta); ) )

Pero también falló en algunos dispositivos. Y una vez más, habiendo recibido una unidad en el mercado, fui a buscar.

Me perseguía el selector del sistema Android (también administrador de archivos), en el que todas las unidades siempre están correctamente identificadas. Sin pensarlo dos veces, saqué apk del sistema usando Root y lo descompilé.

Conocimiento

Descubrí que el selector usa las clases StorageVolume y StorageManager. Itera a través de todos los elementos StorageVolume obtenidos utilizando el método StorageManger.getVolumeList() y llama a los métodos StorageVolume.getPath() y StorageVolume.getState() en cada uno. El problema es que estos métodos están ocultos. No son privados, pero están marcados con la anotación @hide. Bueno, qué podemos hacer, saquemos nuestra reflexión:

StorageManager getStorageManager() ( return (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); ) /* Use la reflexión para detectar todos los almacenamientos como lo hace Android, probablemente no funcione con USB-OTG solo funciona en API 19+ */ public List getAllPaths() (Lista allPaths = nueva ArrayList<>();intentar (clase< length; ++i) { Object storageVolumeElem = Array.get(getVolumeResult, i); String mountStatus = (String) getState.invoke(storageVolumeElem); if (mountStatus != null && mountStatus.equals("mounted")) { String path = (String) getPath.invoke(storageVolumeElem); if (path != null) { allPaths.add(path); } } } } catch (Exception e) { e.printStackTrace(); } return allPaths; }

StorageVolumeClass = Class.forName("android.os.storage.StorageVolume"); Método getVolumeList = getStorageManager().getClass().getMethod("getVolumeList"); Método getPath = StorageVolumeClass.getMethod("getPath");

Método getState = StorageVolumeClass.getMethod("getState");

Objeto getVolumeResult = getVolumeList.invoke(getStorageManager());

longitud int final = Array.getLength(getVolumeResult); para (int i = 0; i Surge la pregunta de por qué no hay

manera oficial hacer esto? Sí, usar la reflexión en un proyecto de combate no es del todo confiable, pero no hay otras opciones: si el sistema usa este código, entonces funciona en todos los casos. La práctica lo confirma. SAF (marco de acceso al almacenamiento)

Documentación oficial:

La plataforma SAF facilita a los usuarios la búsqueda y apertura de documentos, imágenes y otros archivos en los repositorios de todos los proveedores con los que trabajan. Estándar

interfaz fácil de usar


@TargetApi(Build.VERSION_CODES.LOLLIPOP) void showDocumentTreeDialog() ( Intención intención = nueva Intención(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(Intent.createChooser(intención, getString(R.string.permission_intent)), REQUEST_CODE_SD_CARD); )

Aquí suceden cosas muy importantes: en onActivityResult procesamos la elección del usuario y adquirimos los codiciados derechos para acceder al mapa. En general, los derechos se otorgan hasta que se reinicia el dispositivo y, para no volver a solicitar permiso al usuario después de reiniciar el dispositivo, debe utilizar el método

TakePersistableUriPermission(Uri uri, int modeFlags)

con banderas para escribir y leer. Después de todas estas maquinaciones, debe guardar el Uri recibido de la tarjeta SD en algún lugar para trabajo adicional con él, por ejemplo, en SharedPreferences.

@RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override protected void onActivityResult(int requestCode, int resultCode, datos de intención) ( super.onActivityResult(requestCode, resultCode, datos); if (requestCode == REQUEST_CODE_SD_CARD && resultCode == RESULT_OK && takePermission(getApplicationContext(), data.getData())) ( //haz tus cosas ) ) @RequiresApi(api = Build.VERSION_CODES.KITKAT) privado booleano takePermission(Context context, Uri treeUri) ( /* Sería útil agregue una verificación de que el URI recibido sea el URI del mapa. Dejaré esta tarea como un ejercicio para los lectores */ try ( if (treeUri == null) ( return false; ) context.getContentResolver().takePersistableUriPermission( treeUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);sharedPreferences.putString(SD_CARD_URI,treeUri.toString()); captura (Excepción e2) (e2.printStackTrace(); devuelve falso;)

Interacción con tarjeta SD

El lector probablemente ya adivina que no podremos interactuar con archivos (como file.renameTo(file2)) de forma normal. Si miramos el código del método file.renameTo(File), no veremos nada sospechoso, ni comprobaciones. Y con razón, porque los controles están al nivel sistema de archivos. Y si intentamos cambiar un archivo ubicado en la tarjeta SD por los medios habituales, obtendremos la siguiente excepción:

Java.io.IOException: no se pueden realizar cambios en el archivo your_file.ext

Aquí manera interesante Determine si el archivo se puede modificar:

Público booleano isFileWritable(Archivo) ( booleano grabable; try ( new FileOutputStream(file, true).close(); writable = file.exists() && file.canWrite(); ) catch (IOException e) ( writable = false; ) devolver grabable ;

Si el archivo está en el mapa, recibiremos una IOException.

Para cambiar un archivo en la tarjeta de memoria, necesitamos obtener un DocumentFile que represente nuestro archivo, pero con los permisos de escritura que obtuvimos con SAF.

Al principio del artículo, hablé de dos intenciones para SAF: ACTION_OPEN_DOCUMENT_TREE y ACTION_OPEN_DOCUMENT. Y dije que no usaremos el segundo intento, ya que esto obliga al usuario a buscar el archivo manualmente. Pero tenemos un URI, que recibimos usando la primera intención, y esto significa... No, no existe una API estándar para obtener un DocumentFile, todo se hace manualmente.

El algoritmo es así:

  1. tenemos archivo
  2. Determine el nombre de la unidad en la que se encuentra este archivo
  3. Determinamos la ruta del archivo en relación con la unidad en la que se encuentra. Obtenemos una línea como android/carpeta/archivo.txt
  4. Separar una línea con un símbolo «/»
  5. En el bucle, para cada parte recibida, encontramos el DocumentFile que representa esta ruta, basado en el DocumentFile de la parte anterior.
  6. Si el algoritmo se completó sin errores, el resultado es un DocumentFile que representa nuestro archivo.

Public DocumentFile getDocumentFile(Archivo) ( DocumentFile documento = null; String baseFolder = null; for (Ruta de cadena: getAllPaths()) ( File filePath = new File(ruta); if (filePath.getAbsolutePath().startsWith(file.getAbsolutePath ())) (baseFolder = filePath.getAbsolutePath(); break; ) ) if (baseFolder == null) ( return null; ) try ( String relativaPath = file.getCanonicalPath().substring(baseFolder.length() + 1) ; Uri permisoUri = Uri.parse(sharedPreferences.getString(SD_CARD_URI)); documento = getDocumentFileForUri(permissionUri, relatedPath); catch (Exception e) ( e.printStackTrace(); ) devolver documento; getDocumentFileForUri(Uri treeUri, String relativaPath) ( String parts = relativaPath.split("/"); if (parts.length == 0) ( return null; ) DocumentFile document = DocumentFile.fromTreeUri (mContext, treeUri); for (String parte: partes) ( DocumentFile nextDocument = document.findFile(part);

if (siguienteDocumento! = nulo) (documento = siguienteDocumento;)) devolver documento;

)

CopyFile público vacío (Archivo fuenteFile, documento DocumentFile) ( FileInputStream inputStream = null; FileOutputStream OutputStream = null; try ( inputStream = new FileInputStream(sourceFile); OutputStream = (FileOutputStream) mContentResolver.openOutputStream(document.getUri()); FileChannel fileChannelIn = inputStream.getChannel(); FileChannel fileChannelOut =outputStream.getChannel(); fileChannelIn.transferTo(0, fileChannelIn.size(), fileChannelOut); //noinspección ResultOfMethodCallIgnored(); (); ) finalmente ( intente ( if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); ) catch (IOException e) ( e.printStackTrace(); ) ) )

Y también quiero decir que ahora el código se completará con dichos controles.

Public void writeFile(Archivo) ( boolean fileWritable = isFileWritable(file); boolean hasSdCardUri = !sharedPreferences.getString(SD_CARD_URI).isEmpty(); if (fileWritable || hasSdCardUri) ( /* puedes editar el archivo normalmente, o SAF */ return ) if (Build.VERSION.SDK_INT >= 21) ( /* ¡bienvenido! (pedimos permiso al usuario) */ throw new NoLollipopWritePermissionException(); ` ) else if (Build.VERSION.SDK_INT == 19 ) ( / * ¡adiós! (no se puede editar) */ throw new NoKitkatWritePermissionException() ) )

Conclusión

Espero que mi experiencia descrita en el artículo ayude a aquellos que aún no han trabajado con una tarjeta SD a evitar largas investigaciones y búsquedas.

Se puede almacenar diversa información electrónicamente en un dispositivo especial llamado tarjeta de memoria. Está diseñado para almacenar documentos de texto, grabaciones de audio y video e imágenes. La principal ventaja de este tipo de memoria es la facilidad para registrar información y la compacidad del dispositivo, junto con importantes cantidades de datos almacenados.

La memoria interna está representada por RAM, memoria permanente y memoria caché. Sus ventajas incluyen la velocidad, pero la desventaja es la cantidad limitada de datos almacenados.

Muy a menudo, un usuario moderno de una computadora personal y otros equipos electrónicos tiene que lidiar con la siguiente frase: "instalar en la raíz de la tarjeta de memoria" o "copiar en la raíz de la tarjeta". Se puede encontrar en cualquier lugar, ya que la tecnología moderna comienza cada vez más a admitir tarjetas de terceros para aumentar la memoria interna.

Las tarjetas de memoria están estandarizadas. Tienen ciertas dimensiones generales y ubicación de las almohadillas de contacto según el tipo de dispositivos para los que están destinados a utilizarse.

Esto incluye portátiles, tabletas, teléfonos inteligentes, cámaras digitales e incluso PSP con otras consolas de juegos. Por tanto, para trabajar con ellos correctamente no puedes prescindir de una idea clara de lo que puede significar la expresión “raíz de la tarjeta de memoria” y dónde puede ubicarse.

El nombre del lugar para guardar datos en la tarjeta proviene de la palabra inglesa root: "indígena, raíz", que significa algo prístino, primordial. Se empezó a utilizar desde el principio, cuando empezaron a aparecer las computadoras. En ellos, la raíz se llamaba el contenido mismo del dispositivo, es decir, el lugar desde donde se iniciaba el sistema y donde se podían guardar los datos. De hecho, respecto a las tarjetas de memoria actuales, esta denominación no ha cambiado en absoluto.

directorio raíz

Hoy en día, la raíz de una tarjeta de memoria es el directorio mismo, que se encuentra en la tarjeta. Esta es la misma carpeta que se abre cuando haces clic en el icono de la tarjeta de memoria en tu teléfono inteligente o. Es solo que la palabra raíz se tradujo literalmente y ahora se usa su análogo ruso para referirse a la tarjeta misma. Por lo tanto, si se le solicita que copie datos a la raíz, entonces no necesita crear nada adicional en la tarjeta de memoria, sino que simplemente copie los archivos necesarios en ella misma, en el directorio raíz.




Arriba