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

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

    • 分享

      什么是USB配件模式

       昵稱11482448 2013-09-11


      USB配件模式允許用戶連接那些專門搭載Android設(shè)備的USB主機硬件。這些配件必須遵守Android配件開發(fā)工具包文檔中所列出的Android附件協(xié)議。這使得搭載Android系統(tǒng)的設(shè)備在不充當USB主機的情況之下,仍然可以和USB硬件進行交互。當一臺搭載Android系統(tǒng)的設(shè)備處于USB配件模式時,所依附的Android USB配件作為主機為USB總線提供能源以及列舉出相連的設(shè)備。Android3.1(API12級)提供了USB配件模式并且這一特點也繼承了Android2.3.4(API10級)以此來支持更多設(shè)備。

      選擇正確的USB附件APIs

      盡管USB附件API在Android3.1平臺才開始介紹,但是也可以在Android2.3.4API中通過附加類庫使用。因為這些APIs都是通過額外的類庫來使用的,你可以導入兩個包來支持USB配件模式。取決于你想支持什么樣的搭載Android系統(tǒng)的設(shè)備,你也許不得不在一個的基礎(chǔ)上使用另外一個:

      com.android.feature.usb:為了支持Android2.3.4的USB配件模式,Google APIs附加類庫包括了USB外設(shè)APIs并且它們就是包含在這個命名空間的后面。Android3.1還支持導入和調(diào)用這個命名空間的類來支持附加類庫編寫的應用程序。這個附加的類庫只是關(guān)于android.hardware.usb外設(shè)APIs的一個簡單的封裝并且它不支持USB主機模式。如果你希望更大范圍支持USB配件模式的設(shè)備,使用附加類庫并且導入改包就行。需要注意的是,并不是所有搭載Android2.3.4的設(shè)備都需要擁有USB外設(shè)這一特色。每個設(shè)備生產(chǎn)商在決定是否具有這個特色,這也就是為什么你必須要在manifest文件中聲明的原因了。

      android.hardware.usb:這個命名空間包含在Android3.1版本中支持USB附件模式的類。因為這個包是框架APIs中的一部分,所以Android3.1版本可以在不用附加類庫的前提之下支持USB附件模式。使用這個包時,如果你只關(guān)心Android3.1或者更新的支持USB附件模式的硬件的設(shè)備,你可以在mainfest文件中進行聲明。

      安裝谷歌APIs的附加類庫

      如果你想安裝這個附加類庫,你可以通過在SDK管理器上面安裝谷歌APIs中的Android API10包的方式來做。更多關(guān)于安裝附加類庫的信息請參見安裝谷歌APIs附加元件。

      API 概述

      因為附加類庫是一個框架APIs的封裝,和那些支持USB附件功能的類是相似的。即使你在用附加類庫的時候,你也可以用android.hardware.usb參考文檔作為參考。

      * 注意:* 然而,你要注意在附加類庫和框架APIs之間還是有一些細微的使用差別的。

      下面的表格為您描述了那些支持USB外設(shè)APIs的類:
      {|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc
      |-style="background:#DEE8F1; "
      ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 類
      ! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 詳細描述
      |- style=" vertical-align:top;"
      | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
      UsbManager
      | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
      允許您用已連接的USB配件直接進行枚舉和交流
      |- style=" vertical-align:top;"
      | style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
      UsbAccessory
      | style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
      可以表示一個USB配件并且包含來連接識別信息的方法
      |}

      關(guān)于平臺APIs和附加類庫之間的用法差異

      在分別使用谷歌APIs附加類庫和平臺APIs的時候,通常會有兩種差異。

      如果您正在使用附加類庫,則肯定會通過下列方式來創(chuàng)建UsbManager對象:

      1
      UsbManager manager = UsbManager.getInstance(this);
      

      如果您不是用的附加類,則必須通過下列方式來創(chuàng)建UsbManager對象:

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

      當您通過一個意圖過濾器來過濾一個已經(jīng)連接的配件,那么這個UsbAccessory對象就必須包含在傳給您應用的這個意圖中。如果您正在使用附加類庫,您就必須通過下列方式來聲明UsbAccessory對象:

      UsbAccessory accessory = UsbManager.getAccessory(intent);

      如果您不是用的附加類,則必須通過下列方式來聲明UsbAccessory對象:

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

      Android ManiFest 需求


      下面的列表向您描述了在用USB配件APIs工作前需要在您應用中的manifest文件里面添加什么。下面的清單和資源文件例子將教您如何聲明這些項:
      * 因為并不是所有搭載Android系統(tǒng)的設(shè)備都保證支持USB配件APIs,包括一個元素來聲明您的應用具有
      android.hardware.usb.accessory這個特色。
      * 如果你正在使用附加類庫,添加com.android.future.usb.accessory。
      * 如果您使用附加類庫,那么您所設(shè)置的最低SDK版本是10級;如果您使用android.harware.usb這個類的話,您所設(shè)置最低版本的SDK就應該為12級。
      * 如果您希望您的應用帶有一個附加USB配件的通知,在您的主activity中為和元素指向一個額外的聲明關(guān)于你希望探測到的配件的識別信息的XML資源文件。
         在這個XML資源文件中,為您希望過濾的配件聲明都有下面的屬性:

      :* 制造商
      :* 模式
      :* 版本

      在元素指定的一樣。這個XML資源文件的格式在下面的例子中給出。

      清單和資源文件例子

      下面的例子就為您展示了一個簡單的manifest以及與之相關(guān)的資源文件:


       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      <uses-sdk android:minSdkVersion="<version>" />
      ...
      <application>
        <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>
      </application>
      

      在這種情況之下,下面的資源文件保存在res/xml/accessory_filter.xml文件中,并且指定那些只有與其相關(guān)的模式,制造商和版本的配件能夠被選擇。這個配件把這些屬性傳遞給搭載Android系統(tǒng)的設(shè)備:

      <?xml version"utf-8"?>

      用配件工作


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

      您需要通過一個可以過濾配件附加事件的意圖過濾器或者枚舉已連接的配件來發(fā)現(xiàn)連接的配件來找到合適的接口。

      尚未獲得許可的用戶在適用配件操作時需要驗證權(quán)限。

      通過在接入的端點進行讀寫數(shù)據(jù)的操作達到和配件交互的目的。

      發(fā)現(xiàn)配件

      您的應用可以通過兩種方式來發(fā)現(xiàn)配件,一種是用一個意圖過濾器在用戶連接一個配件時對其進行通知,另一種則是通過枚舉您已經(jīng)連接的所有配件。如果您希望您的應用能夠自動的探測到你想要的配件,請使用一個意圖過濾器來做。但是,如果您希望得到一個已連接配件的列表或者您不希望過濾意圖,枚舉所有的配件會是一個更好的選擇。

      使用一個意圖過濾器

      為了讓您的應用可以發(fā)現(xiàn)一個特定的USB配件,您可以為android.hardware.usb.action.USB_ACCESSORY_ATTACHED這個意圖指定一個意圖來進行過濾。伴隨著這個意圖過濾器,您需要指定一個資源文件來特別說明這個USB配件的屬性,例如制造商,模式和版本。當用戶連接到一個符合您配件過濾條件的配件時,

      下面的例子告訴您該如何聲明這個意圖過濾器:


      ...


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

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

      <?xml version"utf-8"?>

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

      UsbAccessory accessory = UsbManager.getAccessory(intent);

      或者像這樣(用平臺APIs的):

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

      枚舉所有配件

      您可以使您的應用在運行時列舉出所有能夠被識別的配件。

      通過getAccessoryList()方法來獲得一個包含所有已連接USB配件的數(shù)組:

      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
      UsbAccessory[] accessoryList = manager.getAcccessoryList();


      * 注意:* 現(xiàn)在,只能一次連接一個USB配件操作,但是在以后的API中會支持多配件的操作的。

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

      在您使用一個配件前,您的應用必須從用戶那里獲得權(quán)限。

      * 注意:* 如果您的應用在連接配件時通過一個意圖過濾器來發(fā)現(xiàn)它們,如果用戶允許您的應用來處理這個意圖,它將自動接收這個權(quán)限。如果用戶不允許,那么您就必須在連接配件之前詳細在您的應用中寫明需要請求的權(quán)限。

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

      為了確切地獲得權(quán)限,首先需要創(chuàng)建個廣播接收器。這個接收器在您調(diào)用requestPermission()這個方法時從您得到的廣播中艦艇這個意圖。通過調(diào)用requestPermission()這個方法為用戶跳出一個是否連接配件的對話框。下面的例子告訴您如何創(chuàng)建一個廣播接收器:

      private static final String ACTION_USB_PERMISSION =
      "com.android.example.USB_PERMISSION";
      private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      public void onReceive(Context context, Intent intent) {
          String action = intent.getAction();
          if (ACTION_USB_PERMISSION.equals(action)) {
              synchronized (this) {
                  UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
      
                  if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                      if(accessory != null){
                          //call method to set up accessory communication
                      }
                  }
                  else {
                      Log.d(TAG, "permission denied for accessory " + accessory);
                  }
              }
          }
      }
      

      };

      為了注冊您的廣播接收器,將其放在您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);

      當您需要展示征求用戶同意連接這個配件的權(quán)限的對話框時,調(diào)用requestPermission()這個方法:

      UsbAccessory accessory;
      ...
      mUsbManager.requestPermission(accessory, mPermissionIntent);

      當用戶回應這個對話框時,你的廣播接收器就會收到一個包含用一個boolean值來表示結(jié)果的EXTRA_PERMISSION_GRANTED字段的意圖。在您連接配件之前檢查這個字段的值是否為true。

      和配件之間的“交流”

      您可以通過使用UsbManager這個類和配件進行“交流”,通過這個類可以獲得一個文件描述符,然后您可以利用這個描述符來設(shè)置輸入和輸出流來讀取和寫入數(shù)據(jù)。這些流用來代表輸入和輸出的批量端點。您最好另起一個線程來讓您的設(shè)備和配件進行“交流”,因為這樣您就可以不需要將主線程鎖起來了。下面的例子告訴您該如何和一個配件進行“交流”:

      UsbAccessory mAccessory;
      ParcelFileDescriptor mFileDescriptor;
      FileInputStream mInputStream;
      FileOutputStream mOutputStream;

      ...

      private void openAccessory() {
      Log.d(TAG, "openAccessory: " + accessory);
      mFileDescriptor = mUsbManager.openAccessory(mAccessory);
      if (mFileDescriptor != null) {
      FileDescriptor fd = mFileDescriptor.getFileDescriptor();
      mInputStream = new FileInputStream(fd);
      mOutputStream = new FileOutputStream(fd);
      Thread thread = new Thread(null, this, "AccessoryThread");
      thread.start();
      }
      }

      在這個線程的run()方法中,您可以通過FileInputStream或者FileOutputStream對象來對配件進行讀取和寫出數(shù)據(jù)操作。當您通過FileInputStream對象讀取配件中的數(shù)據(jù)時,請確保您所使用的緩存能夠存儲下USB數(shù)據(jù)包數(shù)據(jù)。Android配件協(xié)議支持數(shù)據(jù)包支持高達16384字節(jié)的數(shù)據(jù)包緩存區(qū),所以您可以選擇一直讓您的緩存區(qū)是這個簡單的大小。

      * 注意:* 在一個比較低的水平下,64字節(jié)的數(shù)據(jù)包是全速配件以及512字節(jié)的數(shù)據(jù)包是高速配件。Android配件協(xié)議將這兩種速度捆綁成一個簡單的邏輯數(shù)據(jù)包。

      想要知道更多如何使用Android中多線程的信息,請參見進程和線程。

      中止和配件的“交流”

      當您在完成和配件的“交流”之后,又或者該配件被移除了,通過調(diào)用close()方法來關(guān)閉你已經(jīng)打開的文件描述符。為了監(jiān)聽分離這樣的事件,您需要創(chuàng)建一個如下的廣播接收器:

      BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
      public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();

      1
      2
      3
      4
      5
      6
      7
          if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
              UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
              if (accessory != null) {
                  // call your method that cleans up and closes communication with the accessory
              }
          }
      }
      

      };

      在您的應用中創(chuàng)建這個廣播接收器,不是在manifest文件中,允許您的應用只能在它運行的時候處理這樣的配件分離事件。這樣的話,配件分離這個事件就只向正在運行的應用廣播,而不是向所有的應用進行廣播。


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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多