Eu tenho um aplicativo em execução em um tablet Android sem nome enraizado executando o ICS 4.0.3 que controla um dispositivo USB por meio da interface do modo host USB. O arquivo android.hardware.usb.host.xml está presente em / system / etc / Permissions e tudo funciona maravilhosamente. Exceto...
Quando executo o aplicativo pela primeira vez após uma reinicialização e conecto o dispositivo USB, recebo uma janela pop-up dizendo "Permitir que o aplicativo APPNAME acesse o dispositivo USB? [] Use por padrão este dispositivo USB. Cancele OK" e Eu tenho que tocar em OK antes que ele possa começar a usar o dispositivo.
Preciso desativar a confirmação do usuário para que o aplicativo possa usar o dispositivo imediatamente. Como eu faço isso? Pareço algumas sugestões sobre o uso de um gerador de pressionamento de tecla para simular o usuário tocando no botão na tela, mas eu prefiro evitar esse tipo de abordagem e configurar as coisas para que a solicitação de confirmação simplesmente não aconteça.
Provavelmente, não consigo que o fornecedor faça uma compilação personalizada do kernel para mim, mas devo conseguir a chave de assinatura do firmware para poder assinar meu aplicativo como um aplicativo do sistema, se isso ajudar.
Um problema associado: marcar a caixa "Usar por padrão para este dispositivo USB" não parece ajudar - se eu desconectar e reconectar o dispositivo, receberei o prompt de confirmação novamente. Percebi nessa situação que o número do dispositivo em / dev / bus / usb / 001 / muda sempre que eu desconecto e reconecto (001, 002, 003 etc), o que talvez explique esse problema específico.
fonte
Respostas:
Esta pergunta e resposta é basicamente uma duplicata de
/programming//a/15151075/588476
Veja o link acima para um exemplo de programa e uma discussão mais aprofundada.
Até onde eu sei, existem duas maneiras de obter o pop-up da caixa de permissão USB:
No caso de 1, descobri que a caixa de seleção no pop-up para lembrar a permissão não tem efeito.
Para mim, removi todo o código relacionado às permissões do meu software e simplesmente coloquei o filtro de intenção no meu manifesto. Quando o dispositivo USB estiver conectado, se ele ainda não tiver recebido permissão, a caixa de permissão USB será exibida. Se o usuário clicar em OK sem marcar a caixa Lembrar, a caixa será exibida novamente na próxima vez que o dispositivo for conectado. No entanto, se o usuário marcar a caixa e pressionar OK, a caixa nunca deverá ser exibida novamente (a menos que o software seja desinstalado e reinstalado).
Não tenho certeza se há algum bug relacionado ao seu dispositivo aparecendo como / dev / bus / usb / 001 e 002 etc - informe-me se você estiver usando o filtro de intenção, pois sem isso a caixa de seleção lembrar fazer nada.
Não conheço nenhuma maneira de evitar completamente o pop-up de permissão. Eu suspeito que não há como fazer isso sem se aprofundar no código do Android, como você disse.
fonte
Além do meu comentário, dei uma olhada no código Android subjacente.
Eu tenho uma resposta possível, mas com nada menos que quatro grandes ressalvas e obstáculos:
Esqueça isso ao implantar aplicativos comuns de pós-venda!
O primeiro pré-requisito é que você tenha a
MANAGE_USB
permissão. Isso é descrito aqui .No entanto, por sua vez, os pré-requisitos para você assinar com a chave do sistema e instalar o aplicativo em / system / app.
De qualquer forma, se você estiver bem com isso, aqui está um código:
mDevice
é o dispositivo de antes.uid
é o UID do seu próprio aplicativo e você pode pesquisar isso. Um exemplo de como fazer isso é a primeira resposta aqui .Tudo bom? Não.
ServiceManager
Éandroid.os.ServiceManager
e, portanto, não é uma API pública. Nesse exemplo, é o seu caminho para colocar as mãos noIUsbManager
serviço (pode haver outras rotas). Agora, contornar isso está além do escopo da minha resposta; antigamente, você poderia usar a reflexão, mas não sei se ainda pode.Depois de todas essas travessuras, parece que você não precisa mais solicitar permissão e, se o fizer, retornará imediatamente sem nenhum diálogo.
fonte