J'ai une application exécutée sur une tablette Android rootée sans nom exécutant ICS 4.0.3 qui contrôle un périphérique USB via l'interface du mode hôte USB. Le fichier android.hardware.usb.host.xml est présent dans / system / etc / permissions et tout fonctionne à merveille. Sauf...
Lorsque j'exécute l'application pour la première fois après un redémarrage puis que je branche le périphérique USB, j'obtiens une fenêtre contextuelle disant "Autoriser l'application APPNAME à accéder au périphérique USB? [] Utiliser par défaut pour ce périphérique USB. Annuler OK" et Je dois appuyer sur OK avant de pouvoir commencer à utiliser l'appareil.
Je dois désactiver la confirmation de l'utilisateur pour que l'application puisse utiliser l'appareil immédiatement. Comment puis-je faire cela? J'ai semblé quelques suggestions sur l'utilisation d'un générateur de touches pour simuler l'utilisateur en appuyant sur le bouton à l'écran, mais je préférerais éviter ce genre d'approche et configurer les choses afin que la demande de confirmation ne se produise tout simplement pas.
Je ne peux probablement pas demander au fournisseur de créer un noyau personnalisé pour moi, mais je devrais pouvoir obtenir la clé de signature du micrologiciel pour que je puisse signer mon application en tant qu'application système, si cela peut aider.
Un problème associé: cocher la case "Utiliser par défaut pour ce périphérique USB" ne semble pas aider - si je débranche et rebranche le périphérique, je reçois à nouveau l'invite de confirmation. J'ai remarqué dans cette situation que le numéro de périphérique dans / dev / bus / usb / 001 / change chaque fois que je débranche et rebranche (001, 002, 003, etc.), ce qui explique peut-être cette problème particulier.
la source
Réponses:
Cette question et réponse est essentiellement un doublon de
/programming//a/15151075/588476
Voir le lien ci-dessus pour un exemple de programme et une discussion plus approfondie.
Pour autant que je sache, il existe deux façons d'obtenir la fenêtre contextuelle de la permission USB:
Dans le cas de 1, j'ai constaté que la case à cocher dans la fenêtre contextuelle pour mémoriser l'autorisation n'a aucun effet.
Pour moi, j'ai supprimé tout le code lié aux autorisations de mon logiciel et j'ai simplement mis le filtre d'intention dans mon manifeste. Lorsque le périphérique USB est branché, s'il n'a pas déjà reçu l'autorisation, la boîte d'autorisation USB apparaîtra. Si l'utilisateur clique sur OK sans cocher la case à retenir, la boîte apparaîtra à nouveau la prochaine fois que l'appareil sera connecté. Cependant, si l'utilisateur coche la case et appuie sur OK, la boîte ne doit plus jamais s'afficher (sauf si le logiciel est désinstallé puis réinstallé).
Je ne sais pas s'il y a un bug quelque part lié à votre appareil qui apparaît comme / dev / bus / usb / 001, puis 002 etc - faites-moi savoir si vous utilisez le filtre d'intention, car sans cela la case à cocher souvenir ne fais rien.
Je ne connais aucun moyen d’éviter complètement la fenêtre d’autorisation. Je soupçonne qu'il n'y a aucun moyen de le faire sans creuser dans le code Android comme vous l'avez dit.
la source
Suite à mon commentaire, j'ai jeté un œil au code Android sous-jacent.
J'ai une réponse possible, mais avec pas moins de quatre mises en garde et obstacles majeurs:
Oubliez cela si vous déployez des applications après-vente ordinaires!
La première condition préalable est que vous ayez l'
MANAGE_USB
autorisation. Cela est décrit ici .Cependant, à son tour, les conditions préalables à cela sont que vous vous connectez avec la clé système et que vous installez votre application dans / system / app.
Quoi qu'il en soit, si cela vous convient, voici un code:
mDevice
est l'appareil d'avant.uid
est l'UID de votre propre application et vous pouvez le rechercher. Un exemple de la façon de procéder est la première réponse ici .Tout bon? No.
ServiceManager
estandroid.os.ServiceManager
et n'est donc pas une API publique. C'est, dans cet exemple, votre moyen de mettre la main sur leIUsbManager
service (il peut y avoir d'autres itinéraires). Maintenant, contourner cela dépasse la portée de ma réponse; Autrefois, vous pouviez utiliser la réflexion, mais je ne sais pas si vous le pouvez toujours.Après tous ces manigances, il semble que vous n'ayez plus besoin de demander la permission, et si vous le faites, il reviendra immédiatement sans dialogue.
la source