關於安卓(Android)手機,安卓(Android)平板電腦,是否支持USB主機(USB Host)功能

背景

1:公司開發一個項目要讀取U盤數據。

2:首先搞清楚,什麼樣的android設備才能讀取U盤。

3:能讀取U盤數據的android設備必須支持usb host(即android設備爲主機)也就是俗話說的otg功能。

總結安卓Android手機能夠使用USB Host的必備條件

官網的解釋更清楚:

USB Host and Accessory


參考之前別人的解釋,和後來看到的官網的解釋,總結如下:

Android中,USB方面,分兩種模式:

  • USB accessory== USB Device == Android手機作爲一個Device設備
    • 把手機連到電腦上,電腦就是Host,手機就是Device,手機就是類似於U盤,可以從主機電腦中操作U盤,拷貝U盤資料了
    • 此種模式,可以說所有手機都支持,就像都可以當做一個U盤接到電腦上一樣
  • USB host == Android手機作爲一個Host主機
    • Android手機就是主控制器,可以外接/外掛,USB鼠標,USB鍵盤,U盤,USB攝像頭,遊戲手柄等被控制的設備
    • 此種USB Host模式,需要軟硬件都支持才能工作:
      • 硬件:確保手機本身的USB模塊是OTG的,即USB的硬件是那種,既可以被配置爲Device的,也可以被配置爲Host的
        • 與此相對應的是,有些USB的硬件模塊,是固定的USB Device,或者是USB Host
          • 比如普通的U盤中的USB模塊,就是固定的USB Device
          • 比如你把U盤接到電腦上的那個USB接口,就是主板上的USB Host的接口,可以掛載你的U盤
        • 與此類似的是,有些數碼相機,就是USB OTG的
          • 即可以當做U盤接到電腦上,電腦上就可以把相機裏面照片拷貝出來了
          • 也可以當做USB 主機,連接USB的打印機,把照片傳輸到打印機上,打印出來
      • 軟件
        • Android系統,必須是Android 3.1(API Level 12)
        • 本身手機常見給你預裝的Android系統,本身是有對應的USB(OTG)的驅動
4:經項目結束後得到的經驗可知,電視盒子(例如小米,百度,開博爾),智能電視肯定都支持。

  手機價格在2000元以上的絕大部分都支持(因爲這些手機不會節約成本把那個芯片去掉)。平板電腦(三星,小米可以。)

5:安卓(Android)支持otg功能設備列表圖


6:既然是搞開發的,先提供一段android代碼用來測試,該設備是否支持otg

a,運行該程序到手機

b,關閉程序,插上U盤,打開程序,看Toast中的vid是否爲空,不爲空則支持。


@SuppressLint("NewApi")
public class MainActivity extends Activity {
	private static UsbManager mUsbManager;
	private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
	private Context context;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mUsbManager = (UsbManager) this.getSystemService(this.USB_SERVICE);
		setContentView(R.layout.activity_main);
		openUsbDevice(MainActivity.this);
	}

	/**
	 * 初始化獲取U盤信息
	 */
	public void openUsbDevice(Context context) {
		this.context = context;
		// 打開U盤的device前必須申請權限
		tryGetUsbPermission();
	}

	/**
	 * 獲得讀取U盤設備信息權限。
	 */
	private void tryGetUsbPermission() {

		IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
		context.registerReceiver(mUsbPermissionActionReceiver, filter);
		PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context,
				0, new Intent(ACTION_USB_PERMISSION), 0);
		Toast.makeText(context, "U盤設備個數" + mUsbManager.getDeviceList().size(),
				Toast.LENGTH_SHORT).show();
		for (final UsbDevice usbDevice : mUsbManager.getDeviceList().values()) {
			if (mUsbManager.hasPermission(usbDevice)) {
				Toast.makeText(context, "得到授權", Toast.LENGTH_SHORT).show();
				UsbDeviceConnection connection = mUsbManager
						.openDevice(usbDevice);
				String upanidString = connection.getSerial();
				if (null != upanidString && upanidString.length() > 4) {
					// 得到權限
				  afterGetUsbPermission(usbDevice);
				}

			} else {
				// 是否勾選所有usb設備都用這個app打開
				mUsbManager.requestPermission(usbDevice, mPermissionIntent);
			}
		}
	}

	/**
	 * 監聽我的U盤插入廣播
	 */
	private final BroadcastReceiver mUsbPermissionActionReceiver = new BroadcastReceiver() {
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (ACTION_USB_PERMISSION.equals(action)) {
				synchronized (this) {
					UsbDevice usbDevice = (UsbDevice) intent
							.getParcelableExtra(UsbManager.EXTRA_DEVICE);
					if (intent.getBooleanExtra(
							UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
						if (null != usbDevice) {
						  afterGetUsbPermission(usbDevice);
						}
					} else {
						Toast.makeText(context, String.valueOf("沒有得到授權!"),
								Toast.LENGTH_LONG).show();
					}
				}
			}
			 
		}
	};

	/**
	 * 得到U盤信息,並存儲
	 */
	private void afterGetUsbPermission(UsbDevice usbDevice) {
		Log.v("ceshi", "++" + usbDevice.getVendorId());
		Log.v("ceshi", "--" + usbDevice.getProductId());
		UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
		Toast.makeText(context,
				"" + "USB_VID爲:" + "\t" + usbDevice.getVendorId(),
				Toast.LENGTH_SHORT).show();

	}
}

發佈了13 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章