在Google官方的Android API中的範例教學裡,有一段如和動態的使用程式碼設定/註冊BroadCastReciever去偵測「Usb插上/拔除」的「事件」。(就是告訴你的程式Usb裝置是否還插在手機上。)
這段程式碼如下........
下面的文字說明中有說,是要給requestPermission使用。
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/選單中增加一個「偵測連線」選項,......目的是什麼?如果懂了應該就知道該寫怎樣的功能了......
這段程式碼如下........
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/選單中增加一個「偵測連線」選項,......目的是什麼?如果懂了應該就知道該寫怎樣的功能了......
沒有留言:
張貼留言