2014年4月17日 星期四

【Android】UsbManager 的 requestPermission() (UsbHost元件的使用心得2)

在Google官方的Android API中的範例教學裡,有一段如和動態的使用程式碼設定/註冊BroadCastReciever去偵測「Usb插上/拔除」的「事件」。(就是告訴你的程式Usb裝置是否還插在手機上。)

這段程式碼如下........

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);
mPermissionIntent是什麼?要做什麼用的?

下面的文字說明中有說,是要給requestPermission使用。

UsbDevice device;
...
mUsbManager.requestPermission(device, mPermissionIntent);
問題是...何時要使用?



APP啟動後,(或是在使用過程中,)發生了「拔除再插上(不一定是同一部Usb裝置)」時,會發現UsbManager雖然可以正常取得UsbDevice,但這個UsbDevice卻沒有「權限/Permission」。

這個時候就要使用requestPermission。



聽起來好像是很簡單的事情。但是如果是走範例中「XML設定」的人,就很有可能會跳過這一整段程式,而誤以為「XML設定會幫使用者取得穩定可靠的Permission」。

但其實並不是。

至少,如果希望自己寫的APP有「拔除後不用退出就可以切換到下一台Usb裝置」的功能,就需要使用requestPermission()。



另外一個要注意的地方是requestPerssion()可以多次重複進行。每做一次、畫面就會彈出一個徵詢使用者「是否要讓這個裝置連線嗎」的視窗。

一般來說,會因為沒有Permission而出錯的時機,是在「取得UsbConnection」時。

也就是說即使沒有Permission,UsbManager還是可以正常取得UsbDevice。

但是(讀上一篇)取得UsbConnection後,就要按時/定時把它關閉/釋放,如果資料傳輸、溝通的量很大、或次數很頻繁,取得UsbConnection的動作勢必要寫在迴圈/Thread中。

也就是說使用者根本沒有辦法監控每一次的取得動作。

如果迴圈/Thread不停的跑回來查詢UsbDevice的Permission,在使用者按下那個「確認」以前,程式都會一直彈出詢問視窗。

所以?

自己各憑本事想個機制去「只問一次」啦!



最笨的方式就是在迴圈/Thread後面寫個無窮迴圈去「等使用者選擇『同意連線』」,因為...如果使用者不小心點到「不同意」時就GG了!

但這也開啟了另一個問題就是「如果只問一次,但是使用者不小心回答了『不同意』,要怎麼再次建立Usb連線?

...........

這其實不是問題。

1.拔掉再插上就好。

2.在Menu/選單中增加一個「偵測連線」選項,......目的是什麼?如果懂了應該就知道該寫怎樣的功能了......

沒有留言:

張貼留言