3 votos

¿Conceder a una aplicación acceso de escritura al almacenamiento externo que no lo solicita?

Me gustaría conceder la Sincronización acceso de escritura de la app al almacenamiento externo en Marshmallow. La app no lo solicita explícitamente (a diferencia de otras apps que parecen utilizar el Storage Access Framework para hacerlo).

En la pantalla de permisos de la aplicación, no aparece ningún permiso para el almacenamiento externo, sólo para el "almacenamiento" (que parece significar el almacenamiento interno). Así que no parece haber ninguna forma directa de conceder este permiso.

Mi teléfono está rooteado y podría ejecutar Syncthing como Root - pero esta opción crea muchos problemas y a veces hace que la aplicación se cuelgue indefinidamente.

¿Hay alguna otra forma de evitar este problema?

0 votos

Esto parece ser un problema XY. Tu problema es X y crees que Y es la solución, por lo que toda la pregunta parece referirse a hacer Y en lugar de resolver X. // Si tu aplicación se cuelga, ponte en contacto con el desarrollador y pídele ayuda. Ten en cuenta que no puedes conceder un permiso que no ha sido solicitado (en realidad puedes pero no conseguirías nada) por una aplicación.

0 votos

Aprecio su punto de vista. Sin embargo, "lograría" algo en el sentido de que la aplicación es perfectamente capaz de escribir en estas carpetas y, de hecho, está intentando hacerlo. Android se lo impide.

0 votos

Otros permisos se pueden conceder sin ser solicitados - por ejemplo, el uso de las aplicaciones anteriores en versiones anteriores de Android (cuando se rootea), o la concesión de permisos en la pantalla de configuración actual. El problema es que este permiso no aparece en la lista.

2voto

Podrías añadir manualmente el permiso relacionado con la escritura en el almacenamiento externo a AndroidManifest.xml pero no funcionará.

Me encontré en una situación similar a la tuya, y también intenté descompilar la aplicación, añadir el WRITE_EXTERNAL_STORAGE permiso al AndroidManifest.xml y recompilar el paquete, pero no funcionó.

Desde Lollipop, la nueva política de Android respecto a la SD externa exige que cualquier app que necesite acceder a lo anterior utilice la interfaz DocumentProvider. A menos que prefieras trabajar en Smali, no hay manera de implementarlo sin el código fuente de Java. No basta con editar el Manifiesto.

Así que no. No hay manera de añadir manualmente un trabajo WRITE_EXTERNAL_STORAGE permiso, ni en Lollipop ni en Marshmallow. Tu única opción es pedir al dev que lo implemente.

0voto

Ali Puntos 553

Hago esto por la asombrosa aplicación del terminal Termux que para razones que no entiendo tampoco solicita este permiso.

El procedimiento es bastante complicado, ya que implica copiar y editar un archivo xml manualmente, y corre el riesgo de impedir que el sistema arranque. Además, tendrás que volver a hacerlo cada vez que la aplicación se actualice. Supongo que si usas un editor que tenga acceso Root no tendrías que preocuparte por la parte de la copia. Hmm. Tal vez debería hacerlo así también, en realidad.

Los siguientes son los pasos que utilizo para arreglar las permanentes de Termux. Tendrás que adaptarlos para que funcionen con tu aplicación. Probablemente deberían ser los mismos excepto por el nombre completo de la aplicación.

Si no estás familiarizado con XML deberías dudar mucho en intentar esto ya que probablemente harás que tu teléfono no pueda arrancar si cometes un error.

  • Asegúrate de que no estás actualizando aplicaciones (desactiva la actualización automática) o haciendo cualquier otra cosa que pueda provocar modificaciones en el archivo xml de los paquetes mientras lo estás editando.
  • Inicie una sesión en el emulador de terminal. su - en esta sesión para otorgarte permisos de Root.
  • cd /data/system
  • ls -l packages.xml
    • anotar los permisos y la propiedad de packages.xml . Serán esenciales más adelante.
    • Cuando hice esto hace diez minutos, estos valores todavía estaban -rw-rw---- system:system como lo han sido durante todos los años que he estado haciendo esto. Podría ser diferente en un tipo diferente de teléfono.
  • cp packages.xml packages.xml.orig para hacer una copia de seguridad de este archivo de sistema tan importante
  • cp packages.xml /storage/emulated/0/tmp o alguna otra ubicación, dependiendo de cómo esté distribuido el sistema de archivos de tu teléfono. Si ese directorio no existe, simplemente créalo.

Ahora edita el archivo de la manera que prefieras (yo uso vim en Termux pero utilice cualquier editor de texto) para realizar el siguiente cambio:

  • Encuentre la segunda línea que contiene /name="com.termux"/ . Debería ser un shared-user (es decir, una línea que comienza con <shared-user )
    • En el caso de su aplicación, esto podría terminar siendo una línea diferente que contenga el nombre completo de su aplicación, dependiendo de si su aplicación tiene una entrada en la sección anterior de este archivo. También es posible que no haya una entrada de permisos para tu aplicación, en cuyo caso tendrás que hacer una desde cero, supongo. Creo que esto probablemente estaría bien, pero realmente no lo sé; podrías causar problemas en el sistema al hacerlo. Caveat emptor. Pero sí, si encuentras este nodo para Termux y lo copias y pegas la copia debajo de la entrada de Termux, probablemente funcione.
  • Copiar el último <item ... /> y pegarlo justo debajo.
  • Edite la línea pegada para cambiar el permiso (actualmente el mío tiene WAKE_LOCK ) para leer WRITE_MEDIA_STORAGE .
  • por lo que el último nodo dentro del <perms> El nodo debe ser
    • <item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />

Guarde el archivo y salga de su editor y vuelva a su ventana de Terminal (donde todavía tiene una sesión Root ejecutándose en /data/system ).

  • cp /storage/emulated/0/tmp/packages.xml .
    • Utilice cp aquí y NO mv como mv no establece los permisos correctamente.
  • VERIFICAR que los permisos sean los mismos que cuando se inició. Esto es MUY IMPORTANTE porque el teléfono no arrancará si los permisos están mal. Esto lo hice una vez y logré rescatarlo de alguna manera, se me olvida cómo.

En este punto deberías estar bien para reiniciar. Probablemente sea prudente hacer un diff packages.xml packages.xml.orig1 o lo que sea para verificar que has hecho el cambio correctamente.

Después de reiniciar la aplicación debería tener acceso de escritura a la tarjeta SD externa. Buena suerte.

Si alguien conoce una forma más limpia de hacer esto, por favor, hágamelo saber. Esto es torpe AF y conlleva no poco riesgo de tener que pasar otra hora después de la fijación de mi teléfono.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X