3 votes

Accorder un accès en écriture à un stockage externe à une application qui ne le demande pas ?

Je voudrais accorder le Syncthing Accès en écriture de l'application au stockage externe dans Marshmallow. L'application ne le demande pas explicitement (contrairement à d'autres applications qui semblent utiliser le Storage Access Framework pour le faire).

Dans l'écran des autorisations de l'application, il n'y a pas d'autorisation pour le stockage externe, seulement pour le "stockage" (ce qui semble signifier le stockage interne). Il ne semble donc pas y avoir de moyen direct d'accorder cette autorisation.

Mon téléphone est enraciné et je pourrais simplement exécuter Syncthing en tant que Root - mais cette option crée de nombreux problèmes et entraîne parfois la suspension de l'application indéfiniment.

Existe-t-il un autre moyen de contourner ce problème ?

2voto

Grimoire Points 2908

Vous pouvez ajouter manuellement l'autorisation d'écrire sur le stockage externe à l'adresse suivante AndroidManifest.xml mais ça ne marchera pas.

Je me suis trouvé dans une situation similaire à la vôtre, et j'ai également essayé de décompiler l'application, d'ajouter l'option ÉCRITURE_MÉMOIRE_EXTERNE demande de permission au AndroidManifest.xml et recompiler le paquet, mais cela n'a pas fonctionné.

Depuis Lollipop, la nouvelle politique d'Android concernant le SD externe exige que toute application qui a besoin d'accéder à ce qui précède utilise l'interface DocumentProvider. À moins que vous ne préfériez travailler en Smali, il n'y a aucun moyen de l'implémenter sans le code source Java. La simple modification du Manifest ne suffit pas.

Donc, non. Il n'y a aucun moyen d'ajouter manuellement un travail ÉCRITURE_MÉMOIRE_EXTERNE permission, ni dans Lollipop ni dans Marshmallow. Votre seul choix est de demander au dev de l'implémenter.

0voto

Ali Points 553

Je le fais pour l'application Terminal AMAZING. Termux qui pour pour des raisons que je ne comprends pas ne demande pas non plus cette permission.

La procédure est plutôt compliquée, impliquant la copie et la modification manuelle d'un fichier xml, et vous fait courir le risque d'empêcher le démarrage de votre système. Vous devrez également le refaire à chaque mise à jour de l'application. Je suppose que si vous utilisez un éditeur qui a un accès Root, vous n'aurez pas à vous soucier de la partie copie. Hmm. Peut-être que je devrais le faire de cette façon aussi, en fait.

Voici les étapes que j'utilise pour fixer les perms pour Termux. Vous devrez les adapter pour qu'elles fonctionnent pour votre application. Elles devraient probablement être les mêmes, à l'exception du nom complet de l'application.

Si vous n'êtes pas familier avec le XML, vous devriez être très hésitant à essayer car vous rendrez probablement votre téléphone non amorçable si vous faites une erreur.

  • Assurez-vous que vous ne mettez pas à jour les applications (désactivez la mise à jour automatique) ou que vous ne faites rien d'autre qui pourrait entraîner des modifications du fichier xml des paquets pendant que vous le modifiez.
  • Démarrez une session dans l'émulateur de terminal. su - dans cette session pour vous donner des autorisations Root.
  • cd /data/system
  • ls -l packages.xml
    • écrire les permissions et la propriété de packages.xml . Ils seront essentiels plus tard.
    • Quand j'ai fait ça il y a dix minutes, ces valeurs étaient encore -rw-rw---- system:system comme ils l'ont été pendant toutes les années où j'ai fait ça. Cela peut être différent sur un autre type de téléphone.
  • cp packages.xml packages.xml.orig pour faire une copie de sauvegarde de ce fichier système très important
  • cp packages.xml /storage/emulated/0/tmp ou à un autre endroit, selon la façon dont le système de fichiers de votre téléphone est organisé. Si ce répertoire n'existe pas, il suffit de le créer.

Maintenant, éditez le fichier de la manière que vous préférez (j'utilise vim sous Termux mais utilisez n'importe quel éditeur de texte) pour effectuer la modification suivante :

  • Trouvez la deuxième ligne contenant /name="com.termux"/ . Il devrait s'agir d'un shared-user (c'est-à-dire une ligne commençant par <shared-user )
    • Pour votre application, il peut s'agir d'une ligne différente contenant le nom complet de votre application, selon que votre application a une entrée dans la section précédente de ce fichier. Il se peut également qu'il n'y ait pas d'entrée de permissions pour votre application, auquel cas vous devrez en créer une de toutes pièces, je suppose. J'aurais tendance à penser que cela ne pose pas de problème, mais je n'en sais rien ; vous pourriez causer des problèmes de système en faisant cela. Caveat emptor. Mais oui, si vous trouvez ce noeud pour Termux, que vous le copiez et collez la copie sous l'entrée de Termux, cela devrait probablement fonctionner.
  • Copiez le dernier <item ... /> et le coller juste en dessous.
  • Modifiez la ligne collée pour changer la permission (actuellement la mienne a WAKE_LOCK ) pour lire WRITE_MEDIA_STORAGE .
  • de sorte que le dernier nœud dans le <perms> Le nœud doit être
    • <item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />

Sauvegardez le fichier, quittez votre éditeur et retournez à votre fenêtre Terminal (où vous avez toujours une session Root en cours d'exécution dans /data/system ).

  • cp /storage/emulated/0/tmp/packages.xml .
    • Utilice cp ici et PAS mv como mv ne définit pas les permissions correctement.
  • VERIFY que les permissions sont les mêmes qu'au début. C'est TRÈS IMPORTANT car le téléphone ne démarrera pas si les permissions sont incorrectes. J'ai fait cela une fois et j'ai réussi à le sauver d'une manière ou d'une autre, j'ai oublié comment.

A ce stade, vous devriez être prêt à redémarrer. Il est probablement prudent de faire un diff packages.xml packages.xml.orig1 ou autre pour vérifier que vous avez effectué le changement correctement.

Après le redémarrage, votre application devrait avoir un accès en écriture à la carte SD externe. Bonne chance !

Si quelqu'un connaît un moyen plus propre de faire cela, faites-le moi savoir ! Cette méthode est très compliquée et comporte le risque de devoir passer une heure de plus à réparer mon téléphone.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X