日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android USB

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android USB 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

google 在推出API 3.0后 就增加啦USB通訊這塊

? ?同時為API ?2.3提供啦一個USB通訊吧,這樣也讓2.3有啦USB通訊功能 ?不過只支持USBAccessory模式

? ?USB通訊分為兩種模式:(1)附載模式 USBAccessory ?(2)主機模式 USBHost

? ? ?什么叫主機模式?

? ? ?android官方文檔解釋為?When your Android-powered device is in USB host mode, it acts as the USB host, powers the bus, and enumerates connected USB devices ??

? ? ? 個人理解為誰提供power 誰就USBHost

? ? ? 打個比方 ? ?你手上有臺 音響 可以和 ?android手機 ?進行通訊 ? ?這里手機為USBAccessory模式

? ? ?

?

下面為USB的相關代碼 與 流程 :

?

?1. 首先需要在manifest中添加一些元素和一些過濾器:

? ?<uses-feature android:name="android.hardware.usb.accessory" />

? ? ?如果是2.3時為:

? ? ?<uses-feature?android:name="com.android.future.usb.accessory"?/>

? ? ?同時還要在application 中添加USB庫 ?<uses-library android:name="com.android.future.usb.accessory"/>

? ? 添加過濾器:

<activity ...>...<intent-filter><action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /></intent-filter><meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"android:resource="@xml/accessory_filter" /></activity>

??<?xml version="1.0" encoding="utf-8"?> <resources> <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/></resources>

2 . 獲取一個usb管理者:

?UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

? 2.3 時: ?UsbManager manager = UsbManager.getInstance(this);

?

3. 獲取 USBAccessory ?當我們的設備連接到到另外的一個設備時 ?系統會給我們發送一個系統廣播

? ? 既我們在? manifest里面注冊的 ?當我們接受到這個廣播后就可以獲取連接的設備

? ??UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

??

? ?2.3時 為:UsbAccessory accessory = UsbManager.getAccessory(intent);

?

4. 在這個廣播中我們獲取他的action如果action與UsbManager.EXTRA_ACCESSORY?匹配

? 我們則開啟一個diallog 來提示用戶是否來接設備

? 首先要包裝一個pendingintent來實現提示對話框

? ??mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);

? 接著實現

? ?mUsbManager.requestPermission(usbAccessory, mPermissionIntent);

5.當我們按下確定后, 我們會在次接到系統廣播 ,來打開通信通道

? ??action與??UsbManager.ACTION_USB_ACCESSORY_ATTACHED 匹配

? 我們就可以打開通信通道:

??

? ?注意 :通信通道不能在主線程中開啟

??

?

?

以下為具體代碼:

?

package hk.com.harbourlight.compones;

?

import java.io.FileDescriptor;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import com.android.future.usb.UsbAccessory;

import com.android.future.usb.UsbManager;

import android.app.PendingIntent;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.library.Utility;

import android.os.ParcelFileDescriptor;

?

public class USBController {

// --------------------------------------------------

// ----- enums -----

// --------------------------------------------------

public enum ConnectionState {

Connecting, Connected, Disconnected

}

// --------------------------------------------------

// ----- constants -----

// --------------------------------------------------

public static final String ACTION_CONNECTIONSTATE_CHANGED = "BluetoothControllerConnectionStateChangedAction";

private static final int TIMEOUT_DISCOVERY = 30000;

public final static String ACTION_USB_PERMISSION = "hk.com.harbourlight.USB_PERMISSION";

public final static String ACTION_OPENACCESSORY_FAIL="USBControllerOpenAccessoryFail";

public final static String ACTION_SHOWTOAST="USBControllerShowToast";

// --------------------------------------------------

// ----- properties -----

// --------------------------------------------------

private final Context mContext;

private HarbourLightController mHarbourLightController;

private HarbourLightUpgradeController mHarbourLightUpgradeController;

private ConnectionState mConnectionState;

private Boolean mIsStopped;

private PendingIntent mPendingIntent;

private UsbManager mUsbManager;

private ParcelFileDescriptor mFileDescriptor;

private FileInputStream mInputStream;

private FileOutputStream mOutputStream;

private boolean mIsRequestingPermission;

//---------------------------------------------------

//----- extends --------

//---------------------------------------------------

public USBController(final Context context,final UsbManager usbManager){

this.mContext=context;

this.mUsbManager=usbManager;

mHarbourLightController = new HarbourLightController(mContext, null, null);

mConnectionState = ConnectionState.Disconnected;

mIsStopped = false;

mPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);

mHarbourLightUpgradeController = new HarbourLightUpgradeController(mContext, null, null);

}

public void start(){

IntentFilter filter = new IntentFilter();

filter.addAction(ACTION_USB_PERMISSION);

filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);

filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);

mContext.registerReceiver(mBroadcastReceiver, filter);

mIsStopped=false;

mIsRequestingPermission=false;

}

public void stop(){

mIsRequestingPermission=false;

mIsStopped=true;

mContext.unregisterReceiver(mBroadcastReceiver);

}

public void disConnect(){

mIsStopped=true;

mHarbourLightController.closeSession();

mConnectionState = ConnectionState.Disconnected;

mContext.sendBroadcast(new Intent(ACTION_CONNECTIONSTATE_CHANGED));

}

public HarbourLightController getHarbourLightController(){

if(mHarbourLightController==null){

mHarbourLightController= new HarbourLightController(mContext, null, null);

}

return mHarbourLightController;

}

public HarbourLightUpgradeController getHarbourLightUpgradeController(){

if(mHarbourLightUpgradeController==null){

mHarbourLightUpgradeController = new HarbourLightUpgradeController(mContext, null, null);

}

return mHarbourLightUpgradeController;

}

public ConnectionState getConnectionState(){

return mConnectionState;

}

public boolean getIsRequrstingPermission(){

return mIsRequestingPermission;

}

public void setIsRequrstingPermission(final boolean isRequrstingPermission){

this.mIsRequestingPermission=isRequrstingPermission;

}

public boolean hasPermission(final UsbAccessory accessory){

return mUsbManager.hasPermission(accessory);

}

public void requestPermission(final UsbAccessory accessory){

synchronized (mBroadcastReceiver) {

mUsbManager.requestPermission(accessory, mPendingIntent);

}

}

public UsbAccessory[] getUsbAccessories(){

return mUsbManager.getAccessoryList();

}

//---------------------------------------------------

//----processes------

//---------------------------------------------------

public void openAccessory(final UsbAccessory usbAccessory){

try

{

new Thread(){

public void run(){

mFileDescriptor = mUsbManager.openAccessory(usbAccessory);

if (mFileDescriptor != null)

{

FileDescriptor fd = mFileDescriptor.getFileDescriptor();

if(fd!=null){

mInputStream = new FileInputStream(fd);

mOutputStream = new FileOutputStream(fd);

if(mInputStream!=null && mOutputStream!=null){

mHarbourLightController = new HarbourLightController(mContext, mInputStream, mOutputStream);

mContext.sendBroadcast(Utility.creatBroadCastReceiverIntent(USBAccessoryController.ACTION_USB_UPDATEDATA_FILEOUTPUTSTREAM, "open Accessory"));

// mHarbourLightController.openSession();

// mHarbourLightController.handshake();

mContext.sendBroadcast(Utility.creatBroadCastReceiverIntent(HarbourLightController.ACTION_OPENSESSIONSUCCESS, "open Session success"));

mHarbourLightUpgradeController = new HarbourLightUpgradeController(mContext, mInputStream, mOutputStream);

mHarbourLightUpgradeController.openSession();

int timeOut=0;

while (!mIsStopped && timeOut< 10000) {

mContext.sendBroadcast(Utility.creatBroadCastReceiverIntent(ACTION_CONNECTIONSTATE_CHANGED, "wait connect"));

// if (mHarbourLightController.isConnected()) {

if(mHarbourLightUpgradeController.isConnected()){

mConnectionState = ConnectionState.Connected;

mContext.sendBroadcast(Utility.creatBroadCastReceiverIntent(ACTION_CONNECTIONSTATE_CHANGED, "connect"));

return;

}

try

{

Thread.sleep(500);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

timeOut += 500;

}

}

}

}else {

mContext.sendBroadcast(new Intent(ACTION_OPENACCESSORY_FAIL));

}

}

}.start();

}

catch (Exception e)

{

}

}

private void closeAccessory() {

try {

if (mFileDescriptor != null) {

mFileDescriptor.close();

}

if (mHarbourLightController != null) {

mHarbourLightController.closeSession();

}

if (mInputStream != null) {

mInputStream = null;

}

if (mOutputStream != null) {

mOutputStream = null;

}

mHarbourLightController.closeSession();

disConnect();

setIsRequrstingPermission(false);

mConnectionState=ConnectionState.Disconnected;

mContext.sendBroadcast(new Intent(ACTION_SHOWTOAST));

}

catch (final Exception ex) {

}

}

//--------------------------------------------------

//--------- BroadcastReceiver --------

//--------------------------------------------------

private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

String action=intent.getAction();

if(action.equalsIgnoreCase(ACTION_USB_PERMISSION)){

synchronized (this) {

UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);

if(accessory==null){

accessory=getUsbAccessories()[0];

}

if(accessory!=null){

if(hasPermission(accessory)){

? ?mIsStopped=false;

openAccessory(accessory);

}

}

}

}else if (action.equalsIgnoreCase(UsbManager.ACTION_USB_ACCESSORY_DETACHED)) {

closeAccessory();

}

}

};

}

總結

以上是生活随笔為你收集整理的android USB的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。