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

Me gustaría otorgar a la aplicación Syncthing acceso de escritura al almacenamiento externo en Marshmallow. La aplicación no lo solicita explícitamente (a diferencia de otras aplicaciones que parecen usar Storage Access Framework para hacerlo).

En la pantalla de permisos de la aplicación, no aparece ningún permiso para el almacenamiento externo, solo para el "almacenamiento" (que parece significar almacenamiento interno). Por lo tanto, no parece haber ninguna forma directa de otorgar 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?

Esto parece ser un problema XY. Su problema es X y cree que Y es la solución, por lo que toda la pregunta parece ser hacer Y en lugar de resolver X. // Si sus aplicaciones se bloquean, comuníquese con el desarrollador y pídale ayuda. Tenga en cuenta que no puede otorgar un permiso que no haya sido solicitado (en realidad, puede, pero no lograría nada) por una aplicación.
Aprecio tu punto. 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 lo está bloqueando para que no lo haga.
Se pueden otorgar otros permisos sin que se soliciten, por ejemplo, usar las aplicaciones de operaciones de aplicaciones anteriores en versiones anteriores de Android (cuando está rooteado) u otorgar permisos en la pantalla de configuración actual. El problema es que este permiso no aparece en la lista.
@ShankarG Los permisos para los que una aplicación solicitará acceso cuando se instale se definen en su androidmanifest.xmlarchivo que se almacena en el base.apkarchivo que se puede encontrar en/data/app/<app's package name>
No estoy seguro si el enlace que proporcionó es para Android, pero si lo que está usando es Wrapper de sincronización para Android , entonces ya está solicitando permiso para escribir en almacenamiento externo

Respuestas (2)

Puede agregar manualmente el permiso relacionado para escribir en el almacenamiento externo, AndroidManifest.xmlpero no funcionará.

Me encontré en una situación similar a la suya y también intenté descompilar la aplicación, agregar la solicitud de permiso WRITE_EXTERNAL_STORAGE al AndroidManifest.xml y volver a compilar el paquete, pero no funcionó.

Desde Lollipop, la nueva política de Android con respecto a la SD externa requiere que cualquier aplicación que necesite acceso a la mencionada anteriormente use la interfaz de DocumentProvider. A menos que prefiera trabajar en Smali, no hay forma de implementarlo sin el código fuente de Java. No basta con editar el Manifiesto.

Entonces, no. No hay forma de agregar manualmente un permiso de WRITE_EXTERNAL_STORAGE que funcione , ni en Lollipop ni en Marshmallow. Su única opción es pedirle al desarrollador que lo implemente.

Hago esto para la INCREÍBLE aplicación de terminal Termux que, por razones que no entiendo, tampoco solicita este permiso.

El procedimiento es bastante complicado, implica copiar y editar un archivo xml manualmente y lo pone en riesgo de evitar que su sistema arranque. También deberá volver a hacerlo cada vez que se actualice la aplicación. Supongo que si usa un editor que tiene acceso de root, no tendría que preocuparse por la parte de copia. Mmm. Tal vez debería hacerlo de esa manera también, en realidad.

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

Si no está familiarizado con XML, debe dudar mucho en probar esto, ya que probablemente hará que su teléfono no se pueda iniciar si comete un error.

  • Asegúrese de no estar actualizando aplicaciones (desactive la actualización automática) o haciendo cualquier otra cosa que pueda resultar en modificaciones al archivo xml de paquetes mientras lo está editando.
  • Inicie una sesión en Terminal Emulator. su -en esta sesión para darse permisos de root.
  • cd /data/system
  • ls -l packages.xml
    • anote los permisos y la propiedad de packages.xml. Serán imprescindibles más adelante.
    • Cuando hice esto hace diez minutos, estos valores seguían -rw-rw---- system:systemsiendo los mismos durante los años que llevo haciendo esto. Puede ser diferente en un tipo diferente de teléfono.
  • cp packages.xml packages.xml.origpara 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é dispuesto el sistema de archivos de su teléfono. Si ese directorio no existe, simplemente créelo.

Ahora edite el archivo de la forma que prefiera (yo uso vimunder Termux, pero uso cualquier editor de texto) para realizar el siguiente cambio:

  • Encuentra la segunda línea que contiene /name="com.termux"/. Debería ser una shared-useretiqueta (es decir, una línea que comience con <shared-user)
    • Para su aplicación, esto podría terminar siendo una línea diferente que contiene el nombre completo de su aplicación, dependiendo de si su aplicación tiene una entrada en la sección anterior de este archivo. Es posible que tampoco haya una entrada de permisos para su aplicación, en cuyo caso tendrá que crear una desde cero, supongo. Pensaría que esto probablemente estaría bien, pero realmente no lo sé; puede causar problemas en el sistema al hacerlo. Emptor de advertencia. Pero sí, si encuentra este nodo para Termux y lo copia y pega la copia debajo de la entrada de Termux, probablemente funcione.
  • Copie la última <item ... />línea y péguela 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>nodo debe ser
    • <item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />

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

  • cp /storage/emulated/0/tmp/packages.xml .
    • Usar cpaquí y NO mvya que mvno establece los permisos correctamente.
  • VERIFIQUE que los permisos sean los mismos que cuando comenzó. Esto es MUY IMPORTANTE porque el teléfono no arrancará si los permisos no son correctos. Hice esto una vez y logré rescatarlo de alguna manera, no recuerdo cómo.

En este punto deberías estar listo para reiniciar. Probablemente sea prudente hacer una diff packages.xml packages.xml.orig1o lo que sea para verificar que realizó el cambio correctamente.

Después de reiniciar, su 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, ¡hágamelo saber! Este es un AF torpe y conlleva un riesgo no pequeño de tener que pasar otra hora después de arreglar mi teléfono.