乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      AndroidUSBHost

       迎著風(fēng)兒看星星 2015-03-18

      目錄

       [隱藏

      USB主機(jī)

      當(dāng)您搭載Android系統(tǒng)的設(shè)備處于USB主機(jī)模式時(shí),它就像一個(gè)USB主機(jī),為總線提供能源,并且列舉出所有已經(jīng)連接上的設(shè)備。在Android 3.1或者更高的版本中支持USB主機(jī)模式。

      API概述

      在您開(kāi)始之前,有個(gè)很重要的一點(diǎn)就是您必須對(duì)將要用到的類有個(gè)了解。下面的表格就向您描述了在android.hardware.usb這個(gè)包下USB主機(jī)APIs的一些特點(diǎn)。

      表1.USB主機(jī)APIs

      Class/InterfaceDescription

      UsbManager

      允許您枚舉已連接的USB設(shè)備并且與其進(jìn)行“交流”。

      UsbDevice

      代表了一個(gè)已連接的USB的設(shè)備并且包含具有該設(shè)備驗(yàn)證信息,接口和接入點(diǎn)的方法。

      UsbInterface

      代表了一個(gè)USB設(shè)備的一個(gè)接口,該接口定義了一系列關(guān)于設(shè)備的函數(shù)。一個(gè)設(shè)備在進(jìn)行“交流”的時(shí)候可以有一個(gè)或者多個(gè)接口。

      UsbEndpoint

      代表一個(gè)接口的接入點(diǎn),該接入點(diǎn)就是這個(gè)接口的通信信道。一個(gè)接口可以有一個(gè)或者多個(gè)這樣的接入點(diǎn),而且一般都是有輸入和輸出雙向通信的接入點(diǎn)。

      UsbDeviceConnection

      代表該設(shè)備的一個(gè)連接,用來(lái)在接入點(diǎn)上傳輸數(shù)據(jù)。這個(gè)類允許您能用同步或者異步的方式發(fā)送和返回?cái)?shù)據(jù)。

      UsbRequest

      在通過(guò)UsbDeviceConnection和設(shè)備進(jìn)行“交流”的一個(gè)異步請(qǐng)求。

      UsbConstants

      關(guān)于在linux內(nèi)核中l(wèi)inux/usb/ch9.h的相關(guān)定義的USB常量。

      在大多數(shù)的情況之下,在和一個(gè)USB設(shè)備進(jìn)行“交流”時(shí),上面這些類都需要用到(UsbRequest這個(gè)類只有在您做異步通信的時(shí)候才會(huì)用到)。一般來(lái)說(shuō),您可以通過(guò)查詢要操作的UsbDevice來(lái)獲得一個(gè)UsbManager。當(dāng)您有這個(gè)設(shè)備時(shí),您需要找到正確的UsbInterface以及和這個(gè)接口所對(duì)應(yīng)的UsbEndpoint來(lái)進(jìn)行和設(shè)備的“交流”。一旦您獲得了正確的接入點(diǎn),打開(kāi)UsbDeviceConnection來(lái)和該USB設(shè)備進(jìn)行“交流”。

      Android中manifest文件的需求

      下面的列表就是描述您應(yīng)該在用USB主機(jī)APIs之前應(yīng)該在您的應(yīng)用中的manifest文件中添加些什么:

      • 因?yàn)椴皇撬械拇钶dAndroid系統(tǒng)的設(shè)備都能保證支持USB主機(jī)的APIs,不能包含那個(gè)聲明您的應(yīng)用使用android.hardware.usb.host這一特點(diǎn)的android.hardware.usb.host的這一元素。
      • 設(shè)置您的應(yīng)用的最低的SDK版本在12級(jí)或者更高。這個(gè)USB主機(jī)APIs不在更前面的版本之中。
      • 如果您希望您的應(yīng)用能夠被連接的USB設(shè)備所提示,只要在您的主activity中在<intent-filter><meta-data>元素對(duì)中添加一個(gè)android.hardware.usb.action.USB_DEVICE_ATTACHED意圖。<meta-data>元素指向一個(gè)額外的XML資源文件,該文件是用來(lái)聲明驗(yàn)證您希望探測(cè)到的設(shè)備的驗(yàn)證信息。

         在這個(gè)XML資源文件中,為您希望過(guò)濾的USB設(shè)備聲明<usb-device>元素。下面的列表描述<usb-device>的屬性。一般來(lái)說(shuō),如果您想為一個(gè)特定的設(shè)備過(guò)濾就使用該產(chǎn)品的供應(yīng)商和產(chǎn)品ID,如果您希望為一組USB設(shè)備,例如大量存儲(chǔ)設(shè)備或者是數(shù)碼相機(jī)來(lái)進(jìn)行過(guò)濾那么就應(yīng)該用類,子類和協(xié)議。您可以不指定這些屬性,也可以指定所有的屬性。不為每個(gè)設(shè)備指定屬性,只有在您的應(yīng)用需要它時(shí)才這么做(這句話翻譯的一點(diǎn)問(wèn)題^_^):

      • 供應(yīng)商ID
      • 產(chǎn)品ID
      • 子類
      • 協(xié)議(設(shè)備或者借口)

         將您的資源文件保存到res/xml/目錄下。資源文件名(不包含.xml的擴(kuò)展名)必須和您在<meta-data>元素中指明的那個(gè)名字。在下面的例子中是這個(gè)XML資源文件的格式。

      Manifest文件和資源文件的例子

      下面的例子告訴您一個(gè)manifest文件以及與它相關(guān)資源文件的例子:

       <manifest ...>    <uses-feature android:name='android.hardware.usb.host' />    <uses-sdk android:minSdkVersion='12' />    ...    <application>        <activity ...>            ...            <intent-filter>                <action android:name='android.hardware.usb.action.USB_DEVICE_ATTACHED' />            </intent-filter>             <meta-data android:name='android.hardware.usb.action.USB_DEVICE_ATTACHED'                android:resource='@xml/device_filter' />        </activity>    </application></manifest> 

      在這種情況下,下面的資源文件應(yīng)該被保存在res/xml/device_filter.xml來(lái)確保找到那些特定符合您要求屬性的USB設(shè)備:

       <?xml version='1.0' encoding='utf-8'?> <resources>    <usb-device vendor-id='1234' product-id='5678' class='255' subclass='66' protocol='1' /></resources> 

      用配件工作

      當(dāng)用戶將USB配件連接到搭載Android系統(tǒng)的設(shè)備上面時(shí),Android系統(tǒng)會(huì)判斷您的應(yīng)用是否適用于已連接的該配件。如果適用,您就可以根據(jù)您的喜好為該設(shè)備建立連接。要這么做,您的應(yīng)用必須做下面這些動(dòng)作:

      1. 您需要通過(guò)一個(gè)可以過(guò)濾USB設(shè)備附加事件的意圖過(guò)濾器或者枚舉已連接的USB設(shè)備來(lái)發(fā)現(xiàn)連接的配件來(lái)找到合適的接口。
      2. 尚未獲得許可的用戶在適用USB設(shè)備操作時(shí)需要驗(yàn)證權(quán)限。
      3. 通過(guò)在接入的端點(diǎn)進(jìn)行讀寫數(shù)據(jù)的操作達(dá)到和USB設(shè)備交互的目的。

      發(fā)現(xiàn)設(shè)備

      您的應(yīng)用可以通過(guò)兩種方式來(lái)發(fā)現(xiàn)USB設(shè)備,一種是用一個(gè)意圖過(guò)濾器在用戶連接一個(gè)設(shè)備時(shí)對(duì)其進(jìn)行通知,另一種則是通過(guò)枚舉您已經(jīng)連接的所有USB設(shè)備。如果您希望您的應(yīng)用能夠自動(dòng)的探測(cè)到你想要的設(shè)備,請(qǐng)使用一個(gè)意圖過(guò)濾器來(lái)做。但是,如果您希望得到一個(gè)已連接設(shè)備的列表或者您不希望過(guò)濾意圖,枚舉所有的設(shè)備會(huì)是一個(gè)更好的選擇。

      使用一個(gè)意圖過(guò)濾器

      為了讓您的應(yīng)用可以發(fā)現(xiàn)一個(gè)特定的USB設(shè)備,您可以為android.hardware.usb.action.USB_DEVICE_ATTACHED這個(gè)意圖指定一個(gè)意圖來(lái)進(jìn)行過(guò)濾。伴隨著這個(gè)意圖過(guò)濾器,您需要指定一個(gè)資源文件來(lái)特別說(shuō)明這個(gè)USB設(shè)備的屬性,例如供應(yīng)商和產(chǎn)品ID。當(dāng)用戶連接到一個(gè)符合您配件過(guò)濾條件的配件時(shí),這個(gè)系統(tǒng)會(huì)談出一個(gè)對(duì)話框詢問(wèn)他們是否希望開(kāi)始您的應(yīng)用。如果用戶同意,那么您的應(yīng)用在失去連接之前會(huì)自動(dòng)獲取和設(shè)備連接的權(quán)限。

      下面的例子告訴您該如何聲明這個(gè)意圖過(guò)濾器:

       <activity ...>...    <intent-filter>        <action android:name='android.hardware.usb.action.USB_DEVICE_ATTACHED' />    </intent-filter>     <meta-data android:name='android.hardware.usb.action.USB_DEVICE_ATTACHED'        android:resource='@xml/device_filter' /></activity> 

      下面的例子告訴您怎么樣聲明指定您希望連接的USB設(shè)備的相關(guān)資源文件:

       <?xml version='1.0' encoding='utf-8'?> <resources>    <usb-device vendor-id='1234' product-id='5678' /></resources> 

      在您的activity文件中,您可以從像這樣的意圖(有附加類的)中獲取UsbDevice來(lái)代表這個(gè)相關(guān)的配件:

       UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)

      枚舉所有配件

      您可以使您的應(yīng)用在運(yùn)行時(shí)列舉出所有能夠被識(shí)別的USB設(shè)備。通過(guò)getDeviceList()方法來(lái)獲得一個(gè)包含所有已連接USB配件的數(shù)組:

       UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);...  HashMap<String, UsbDevice> deviceList = manager.getDeviceList();UsbDevice device = deviceList.get('deviceName')

      如果您喜歡,您也可以一個(gè)接一個(gè)的從每一個(gè)設(shè)備的哈希圖和過(guò)程中獲取一個(gè)迭代器:

       UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);...HashMap<String, UsbDevice> deviceList = manager.getDeviceList();Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();while(deviceIterator.hasNext()){    UsbDevice device = deviceIterator.next()    //your code} 

      獲得使用一個(gè)配件的權(quán)限

      在您使用一個(gè)USB設(shè)備前,您的應(yīng)用必須從用戶那里獲得權(quán)限。

      注意:如果您的應(yīng)用在連接USB設(shè)備時(shí)通過(guò)一個(gè)意圖過(guò)濾器來(lái)發(fā)現(xiàn)它們,如果用戶允許您的應(yīng)用來(lái)處理這個(gè)意圖,它將自動(dòng)接收這個(gè)權(quán)限。如果用戶不允許,那么您就必須在連接設(shè)備之前詳細(xì)在您的應(yīng)用中寫明需要請(qǐng)求的權(quán)限。

      在某些情況下很有必要明確權(quán)限的許可要求,例如當(dāng)您的應(yīng)用枚舉出所有已經(jīng)連接的USB設(shè)備并且您希望和其中的一個(gè)進(jìn)行“交流”。您必須在和該設(shè)備“交流”前檢查是否有連接該設(shè)備的權(quán)限。如果不是這樣,您的應(yīng)用將在用戶拒絕您連接該設(shè)備的權(quán)限之后收到個(gè)運(yùn)行錯(cuò)誤。

      為了確切地獲得權(quán)限,首先需要?jiǎng)?chuàng)建個(gè)廣播接收器。這個(gè)接收器在您調(diào)用requestPermission()這個(gè)方法時(shí)從您得到的廣播中監(jiān)聽(tīng)這個(gè)意圖。通過(guò)調(diào)用requestPermission()這個(gè)方法為用戶跳出一個(gè)是否連接該設(shè)備的對(duì)話框。下面的例子告訴您如何創(chuàng)建一個(gè)廣播接收器:

       private static final String ACTION_USB_PERMISSION =    'com.android.example.USB_PERMISSION';private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {     public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        if (ACTION_USB_PERMISSION.equals(action)) {            synchronized (this) {                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {                    if(device != null){                      //call method to set up device communication                   }                }                 else {                    Log.d(TAG, 'permission denied for device ' + device);                }            }        }    }}

      為了注冊(cè)您的廣播接收器,將其放在您activity中的onCreate()方法中去:

       UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);private static final String ACTION_USB_PERMISSION =    'com.android.example.USB_PERMISSION';...mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);registerReceiver(mUsbReceiver, filter)

      當(dāng)您需要展示征求用戶同意連接這個(gè)設(shè)備的權(quán)限的對(duì)話框時(shí),調(diào)用requestPermission()這個(gè)方法:

       UsbDevice device;...mUsbManager.requestPermission(device, mPermissionIntent)

      當(dāng)用戶回應(yīng)這個(gè)對(duì)話框時(shí),你的廣播接收器就會(huì)收到一個(gè)包含用一個(gè)boolean值來(lái)表示結(jié)果的EXTRA_PERMISSION_GRANTED字段的意圖。在您連接設(shè)備之前檢查這個(gè)字段的值是否為true。

      和設(shè)備之間的“交流”

      我們可以同步或者異步的和USB設(shè)備進(jìn)行“交流”。在任意一種情況之下,您都應(yīng)該創(chuàng)建一個(gè)新的線程來(lái)進(jìn)行數(shù)據(jù)傳輸,這樣就不會(huì)阻塞您的主線程了。要想正確的設(shè)置好和一個(gè)設(shè)備之間的連接,您需要獲得該設(shè)備正確的UsbInterfaceUsbEndpoint來(lái)和您進(jìn)行“交流”以及通過(guò)UsbDeviceConnection在這個(gè)接入點(diǎn)上發(fā)送請(qǐng)求。一般來(lái)說(shuō),您的代碼應(yīng)該這樣:

      • 檢查一個(gè)UsbDevice對(duì)象的屬性,例如產(chǎn)品ID,供應(yīng)商ID,或者是關(guān)于設(shè)備的類,以此來(lái)確認(rèn)您是否希望和該設(shè)備進(jìn)行“交流”。
      • 當(dāng)您確信您希望和該設(shè)備進(jìn)行“交流”時(shí),找到關(guān)于該設(shè)備正確的UsbInterface以及和該接口所對(duì)應(yīng)的UsbEndpoint。接口可以有一個(gè)或者多個(gè)接入點(diǎn),而且一般都會(huì)有一個(gè)雙向通信的輸入和輸出接入點(diǎn)。
      • 當(dāng)您找到正確的接入點(diǎn)時(shí),在該接入點(diǎn)時(shí)打開(kāi)一個(gè)UsbDeviceConnection
      • 您可以通過(guò)bulkTransfer()和controlTransfer()這兩個(gè)方法在接入點(diǎn)上傳輸您所需要傳遞的數(shù)據(jù)。您最好在另起一個(gè)新的線程來(lái)進(jìn)行這個(gè)步驟以避免阻塞主線程。想要詳細(xì)地了解關(guān)于Android中使用線程的信息,詳見(jiàn)線程和進(jìn)程。

      下面的代碼段是做同步數(shù)據(jù)傳輸?shù)囊粋€(gè)簡(jiǎn)單方式。您的代碼應(yīng)該有更多的邏輯來(lái)準(zhǔn)確地找到和設(shè)備“交流”的接口和接入點(diǎn),而且應(yīng)該能夠在不同于主線程的線程中能夠傳輸任何的數(shù)據(jù)傳輸。

       private Byte[] bytesprivate static int TIMEOUT = 0;private boolean forceClaim = true; ... UsbInterface intf = device.getInterface(0);UsbEndpoint endpoint = intf.getEndpoint(0);UsbDeviceConnection connection = mUsbManager.openDevice(device); connection.claimInterface(intf, forceClaim);connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread 

      為了能夠異步傳輸數(shù)據(jù),使用UsbRequest類來(lái)初始隊(duì)列化一個(gè)異步請(qǐng)求,然后等待requestWait()方法的結(jié)果。

      想要了解更多地信息,請(qǐng)您參考Adb Test sample,這個(gè)參考將會(huì)告訴您如何進(jìn)行異步批量傳輸,還有MissleLauncher sample將會(huì)告訴您如何異步監(jiān)聽(tīng)一個(gè)中斷端點(diǎn)。

      中止和設(shè)備的“交流”

      當(dāng)您在完成和設(shè)備的“交流”之后,又或者該設(shè)備被移除了,通過(guò)調(diào)用releaseInterface()close()的方法來(lái)關(guān)閉UseInterfaceUsbDeviceConnection。為了監(jiān)聽(tīng)分離這樣的事件,您需要?jiǎng)?chuàng)建一個(gè)如下的廣播接收器:

       BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {            UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);            if (device != null) {                // call your method that cleans up and closes communication with the device            }        }    }}

      在您的應(yīng)用中創(chuàng)建這個(gè)廣播接收器,不是在manifest文件中,允許您的應(yīng)用只能在它運(yùn)行的時(shí)候處理這樣的設(shè)備分離事件。這樣的話,設(shè)備分離這個(gè)事件就只向正在運(yùn)行的應(yīng)用廣播,而不是向所有的應(yīng)用進(jìn)行廣播。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多