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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 插件式架构设计实践:插件式系统架构设计简
- 下一篇: AVS 分像素运动估计优化算法