quando o seu dispositivo alimentado pelo Android está no modo da máquina USB, actua como a máquina USB, alimenta o barramento e enumera os dispositivos USB ligados. O modo USB é suportado no Android 3.1 e superior.
Visão Geral da API
Antes de começar, é importante entender as classes com as quais você precisa trabalhar. A tabela seguinte descreve a APIs USB host no Pacoteandroid.hardware.usb
.Tabela 1., USB Host APIs
Classe | Descrição |
---|---|
UsbManager |
Permite enumerar e se comunicar com dispositivos USB conectados. |
UsbDevice |
Representa um dispositivo USB conectado e contém métodos para acessar as suas informações de identificação, interfaces e pontos de extremidade. |
UsbInterface |
Representa uma interface de um dispositivo USB, que define um conjunto de funcionalidades para o dispositivo., Um dispositivo pode ter uma ou mais interfaces nas quais se comunicar. |
UsbEndpoint |
representa um ponto final de interface, que é um canal de comunicação para esta interface. Uma interface pode ter um ou mais pontos finais, e normalmente tem pontos finais de entrada e saída para comunicação bidirecional com o dispositivo. |
UsbDeviceConnection |
representa uma ligação ao dispositivo, que transfere dados sobre os pontos finais. Esta classe permite-lhe enviar dados para trás e para a frente de forma síncrona ou assíncrona., |
UsbRequest |
representa um pedido assíncrono para comunicar com um dispositivo através de umUsbDeviceConnection . |
UsbConstants
|
define constantes USB que correspondem a Definições em linux/usb / ch9.h do kernel Linux. |
na maioria das situações, é necessário usar todas estas classes (UsbRequest
só é necessário se estiver a fazer comunicação assíncrona) ao comunicar com um dispositivo USB., Em geral, você obtém um UsbManager
para recuperar o desejado UsbDevice
. Quando você tem o dispositivo, você precisa encontrar o ID
e o id
dessa interface para se comunicar. Uma vez obtido o objectivo correcto, abra umUsbDeviceConnection
para comunicar com o dispositivo USB.,
Android manifesto de requisitos
a lista A seguir descreve o que você precisa adicionar ao seu arquivo de manifesto do aplicativo antes de trabalhar com o USB host APIs:
- Porque nem todos os dispositivos Android são garantidos para suporte a USB host APIs, incluem uma
<uses-feature>
elemento que declara que seu aplicativo usa oandroid.hardware.usb.host
recurso. - Defina o SDK mínimo da aplicação para o nível de API 12 ou superior. As APIs USB host não estão presentes nos níveis anteriores da API.,
- Se você quiser que seu aplicativo para ser notificado de um dispositivo USB conectado, especifique um
<intent-filter>
e<meta-data>
elemento do par para oandroid.hardware.usb.action.USB_DEVICE_ATTACHED
intenção em sua atividade principal. O elemento<meta-data>
aponta para um ficheiro de recursos XML externo que declara informações de identificação sobre o dispositivo que deseja detectar.no ficheiro de recursos XML, declare
<usb-device>
elementos para os dispositivos USB que deseja filtrar. A lista seguinte descreve os atributos de<usb-device>
., Em geral, use o fornecedor e ID do produto se você quiser filtrar para um dispositivo específico e usar Classe, subclasse e Protocolo se você quiser filtrar para um grupo de dispositivos USB, como dispositivos de armazenamento de massa ou câmeras digitais. Você pode especificar nenhum ou todos esses atributos., Especificando atributos corresponde a cada dispositivo USB, portanto, só faça isso se o seu aplicativo exige:vendor-id
product-id
class
subclass
-
protocol
(dispositivo ou interface)
Salve o arquivo de recurso
res/xml/
diretório. O nome do ficheiro de recursos (sem o .extensão xml) deve ser o mesmo que o que você especificou no elemento<meta-data>
. O formato para o arquivo de recursos XML está no exemplo abaixo.,
Manifest e o arquivo de recurso exemplos
O exemplo a seguir mostra um exemplo de manifesto e do seu correspondente arquivo de recursos:
neste caso, o recurso seguinte arquivo deve ser salvo no res/xml/device_filter.xml
e especifica que qualquer dispositivo USB com os atributos especificados devem ser filtrados:
Funciona com dispositivos
Quando os usuários se conectar dispositivos USB a um dispositivo Android, o sistema Android pode determinar se o aplicativo está interessado no equipamento conectado. Se assim for, você pode configurar a comunicação com o dispositivo se desejar., Para o fazer, a sua aplicação tem de:
- descobrir dispositivos USB ligados, usando um filtro de intenção a notificar quando o utilizador liga um dispositivo USB ou enumerando dispositivos USB que já estão ligados.
- peça ao utilizador Permissão para se ligar ao dispositivo USB, se não for já obtido.
- comunique com o dispositivo USB lendo e escrevendo dados sobre os pontos finais da interface apropriados.,
descubra um dispositivo
a sua aplicação pode descobrir dispositivos USB usando um filtro de intenção a notificar quando o utilizador liga um dispositivo ou enumerando dispositivos USB que já estão ligados. Usar um filtro de intenção é útil se você quiser ser capaz de fazer com que a sua aplicação detecte automaticamente um dispositivo desejado. Enumerar dispositivos USB conectados é útil se você quiser obter uma lista de todos os dispositivos conectados ou se sua aplicação não filtrou para uma intenção.,
Use um filtro de intenção
para que a sua aplicação descubra um dispositivo USB em particular, poderá indicar um filtro de intenção para filtrar o android.hardware.usb.action.USB_DEVICE_ATTACHED
intenção. Juntamente com este filtro de intenção, você precisa especificar um arquivo de recursos que especifica as propriedades do dispositivo USB, como o ID do produto e do Fornecedor. Quando os utilizadores ligam um dispositivo que corresponde ao seu filtro de dispositivo, o sistema apresenta-lhes uma janela que lhes pergunta se querem iniciar a sua aplicação. Se os usuários aceitarem, sua aplicação automaticamente tem permissão para acessar o dispositivo até que o dispositivo seja desconectado.,
O exemplo a seguir mostra como declarar a intenção de filtro:
O exemplo a seguir mostra como declarar o correspondente arquivo de recurso que especifica os dispositivos USB que você está interessado em:
<?xml version="1.0" encoding="utf-8"?><resources> <usb-device vendor-id="1234" product-id="5678" /></resources>
Em sua atividade, você pode obter o UsbDevice
que representa o dispositivo conectado a partir de uma intenção como este:
Enumerar dispositivos
Se o seu aplicativo está interessado na inspeção de todos os dispositivos USB conectados atualmente, enquanto o aplicativo estiver em execução, ele pode enumerar dispositivos no barramento., Use o método getDeviceList()
para obter um mapa de hash de todos os dispositivos USB que estão conectados. O mapa de hash é riscado pelo nome do dispositivo USB se você quiser obter um dispositivo do mapa.se desejar, você também pode obter um iterador do mapa de hash e processar cada dispositivo um por um:
obtenha permissão para se comunicar com um dispositivo
Antes de se comunicar com o dispositivo USB, seu pedido deve ter permissão de seus usuários.,
Nota: Se a sua aplicação usar um filtro de intenção para descobrir os dispositivos USB à medida que estão ligados, recebe automaticamente Permissão se o UTILIZADOR Permitir que a sua aplicação trate da intenção. Caso contrário, você deve solicitar permissão explicitamente em sua aplicação antes de se conectar ao dispositivo.
pedir explicitamente permissão pode ser neccessário em algumas situações, como quando sua aplicação enumera dispositivos USB que já estão conectados e, em seguida, quer se comunicar com um. Você deve verificar a permissão para acessar um dispositivo antes de tentar se comunicar com ele., Caso contrário, você receberá um erro de tempo de execução se o usuário negou Permissão para acessar o dispositivo.
para obter explicitamente permissão, primeiro crie um receptor de difusão. Este receptor ouve a intenção que é transmitida quando você chama requestPermission()
. A chamada para requestPermission()
mostra uma janela para o utilizador a pedir permissão para se ligar ao dispositivo., O código de exemplo seguinte mostra como criar o receptor de transmissão:
Para registar o receptor de transmissão, adicione isso no seu onCreate()
método em suas atividades:
Para exibir a caixa de diálogo que pede aos usuários permissão para se conectar ao dispositivo, ligue o requestPermission()
método:
Quando os usuários respondem a caixa de diálogo, sua transmissão receptor recebe a intenção que contém o EXTRA_PERMISSION_GRANTED
extra, que é um valor booleano que representa a resposta. Assinale este extra para obter um valor verdadeiro antes de se ligar ao dispositivo.,
comunicar com um dispositivo
A comunicação com um dispositivo USB pode ser síncrona ou assíncrona. Em ambos os casos, você deve criar um novo tópico sobre o qual realizar todas as transmissões de dados, para que você não bloqueie o fio UI. Para configurar correctamente a comunicação com um dispositivo, você precisará obter o adequado UsbInterface
e UsbEndpoint
do dispositivo que você deseja se comunicar e enviar solicitações sobre esse ponto de extremidade com uma UsbDeviceConnection
., Em geral, o seu código deve:
- verificar um
UsbDevice
atributos do objecto, tais como ID do produto, ID do Fornecedor ou classe do dispositivo para descobrir se quer ou não comunicar com o dispositivo. - Quando tiver a certeza de que deseja comunicar com o dispositivo, encontre o
UsbInterface
que deseja usar para comunicar juntamente com oUsbEndpoint
dessa interface. Interfaces podem ter um ou mais endpoints, e geralmente terão um endpoint de entrada e saída para comunicação bidirecional.,quando encontrar o objectivo correcto, abra umUsbDeviceConnection
nesse objectivo. - forneça os dados que deseja transmitir no endpoint com o método
bulkTransfer()
oucontrolTransfer()
. Você deve realizar este passo em outro tópico para evitar bloquear o fio principal UI. Para mais informações sobre o uso de threads no Android, consulte processos e Threads.
o seguinte excerto de código é uma forma trivial de fazer uma transferência de dados síncrona., Seu código deve ter mais lógica corretamente encontrar a interface correta e pontos de extremidade para se comunicar e também deve fazer qualquer transferência de dados em um thread diferente do que o principal thread de INTERFACE de utilizador:
Para enviar dados de forma assíncrona, use o UsbRequest
classe initialize
e queue
uma solicitação assíncrona, em seguida, aguardar o resultado com requestWait()
.,
a Terminar a comunicação com um dispositivo
Quando você realiza a comunicação com um dispositivo ou se o dispositivo foi desligado, fechar o UsbInterface
e UsbDeviceConnection
chamando releaseInterface()
e close()
. Para ouvir eventos separados, crie um receptor de transmissão como abaixo:
criando o receptor de transmissão dentro da aplicação, e não o manifesto, permite que a sua aplicação só lida com eventos separados enquanto estiver em execução., Desta forma, eventos separados só são enviados para a aplicação que está atualmente em execução e não transmitido para todas as aplicações.