1. 程式人生 > >“USB連線方式”設定介面 (MTP,PTP,UMS)

“USB連線方式”設定介面 (MTP,PTP,UMS)

“USB連線方式”設定介面

選擇MTP,PTP,UMS的選項介面就定義在UsbSettings.java,選擇其中一個選項時會執行以下程式碼。

packages/apps/Settings/src/com/android/settings/deviceinfo/UsbSettings.java

  1. if (preference == mMtp) {            
  2.     mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP, true);  
  3.     updateToggles(UsbManager.USB_FUNCTION_MTP);  
  4. elseif (preference == mPtp) {     
  5.     mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_PTP, true);  
  6.     updateToggles(UsbManager.USB_FUNCTION_PTP);  
  7. elseif(preference == mUms) {      
  8.     mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MASS_STORAGE, true);  
  9.     updateToggles(UsbManager.USB_FUNCTION_MASS_STORAGE);  
  10. }  

updateToggle就是去讓執行某些選項的選中與取消工作。

其中最重要的是mUsbManager.setCurrentFunction(),mUsbManger是這樣得到的:

  1. @Override
  2. publicvoid onCreate(Bundle icicle) {  
  3.     super.onCreate(icicle);  
  4.     mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);  
  5. }     

它的實現在frameworks/base/core/java/android/hardware/usb/UsbManager.java。

它的介面實現在frameworks/base/core/java/android/hardware/usb/IUsbManager.aidl

frameworks/base/services/java/com/android/server/usb/UsbService.java

  1. /**     
  2.  * UsbService manages all USB related state, including both host and device support. 
  3.  * Host related events and calls are delegated to UsbHostManager, and device related 
  4.  * support is delegated to UsbDeviceManager. 
  5.  */
  6. publicclass UsbService extends IUsbManager.Stub {  
  7.     privatefinal Context mContext;  
  8.     private UsbDeviceManager mDeviceManager;  
  9.     private UsbHostManager mHostManager;  
  10.     privatefinal UsbSettingsManager mSettingsManager;  

這個介面就是"com.android.settings.UsbSettings" Activity。在frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java中被呼叫。

如果你選擇了USB除錯功能,還會彈出"com.android.settings.DevelopmentSettings" Activity,也是在UsbDeviceManager.java中被呼叫。關於UsbDevcieManager,我們以後再細看。

如果你選擇了UMS,還會彈出"com.android.systemui.usb.UsbStorageActivity" Activity,就是“開啟USB儲存裝置”的介面。它就義在定義在:
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbStorageActivity.java。

這些介面只有在插入USB時才會有通知顯示。在沒有插USB的情況下,有些介面是沒有入口的。我們就以UsbStorageActivity為例,介紹一下這些通知是怎麼彈出來的。

通知是怎麼彈出來的

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java

  1. // storage
  2. mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);  
  3. mStorageManager.registerListener(  
  4.         new com.android.systemui.usb.StorageNotification(context));  
這裡註冊了監聽函式com.android.systemui.usb.StorageNotification,這個只是針對Phone,對於平板,有tablet/TabletStatusBarPolicy.java

我們來看一下注冊的com.android.systemui.usb.StorageNotification

frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java

  1. publicclass StorageNotification extends StorageEventListener {   
  2.     privatestaticfinal String TAG = "StorageNotification";  
  3.     public StorageNotification(Context context) {  
  4.         mContext = context;  
  5.         mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);  
  6.         finalboolean connected = mStorageManager.isUsbMassStorageConnected();  
  7.         Slog.d(TAG, String.format( "Startup with UMS connection %s (media state %s)", mUmsAvailable,  
  8.                 Environment.getExternalStorageState()));  
  9.         HandlerThread thr = new HandlerThread("SystemUI StorageNotification");  
  10.         thr.start();  
  11.         mAsyncEventHandler = new Handler(thr.getLooper());  
  12.         onUsbMassStorageConnectionChanged(connected);  
  13.     }  

在建構函式裡就呼叫了onUsbMassStorageConnectionChanged函式,它最終會調到updateUsbMassStorageNotification(),

  1. /**  
  2.  * Update the state of the USB mass storage notification 
  3.  */
  4. void updateUsbMassStorageNotification(boolean available) {  
  5.     if (available) {  
  6.         Intent intent = new Intent();  
  7.         intent.setClass(mContext, com.android.systemui.usb.UsbStorageActivity.class);  
  8.         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  9.         PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);   
  10.         setUsbStorageNotification(  
  11.                 com.android.internal.R.string.usb_storage_notification_title,  
  12.                 com.android.internal.R.string.usb_storage_notification_message,  
  13.                 com.android.internal.R.drawable.stat_sys_data_usb,  
  14.                 falsetrue, pi);  
  15.     } else {  
  16.         setUsbStorageNotification(000falsefalsenull);  
  17.     }     
  18. }     

也就是說UsbStorageActivity和StorageNotification繫結在了一起,什麼時候彈出這個通知,就可以進入這個Activity了。

如果連線了USB,就會在通知欄裡顯示USB選項的通知。如果沒有連線,就會把這個通知給取消掉。那我們看一下,這個通知是怎麼彈出來的。

StorageManager

frameworks/base/core/java/android/os/storage/StorageManager.java

  1. publicvoid registerListener(StorageEventListener listener) {  
  2.     if (listener == null) {              
  3.         return;  
  4.     }  
  5.     synchronized (mListeners) {          
  6.         mListeners.add(new ListenerDelegate(listener));  
  7.     }  
  8. }    
mListeners會被私有成員MountServiceBinderListener用到,而MountServiceBinderListener又是繼承自IMountServiceListener.Stub,在建構函式裡被註冊。
  1. public StorageManager(Looper tgtLooper) throws RemoteException {  
  2.     mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));  
  3.     if (mMountService == null) {  
  4.         Log.e(TAG, "Unable to connect to mount service! - is it running yet?");  
  5.         return;  
  6.     }  
  7.     mTgtLooper = tgtLooper;  
  8.     mBinderListener = new MountServiceBinderListener();  
  9.     mMountService.registerListener(mBinderListener);  
  10. }  
所以關鍵還是在mMountService。

相關推薦

USB連線方式設定介面 (MTPPTPUMS)

“USB連線方式”設定介面 選擇MTP,PTP,UMS的選項介面就定義在UsbSettings.java,選擇其中一個選項時會執行以下程式碼。 packages/apps/Settings/src/com/android/settings/deviceinfo/UsbSettings.java

如何修改Android5.1系統USB連線方式預設MTP

本文是基於Android5.1的程式碼 device\mediatek\common\device.mk 關鍵字:persist.sys.usb.config # default usb func

Android中檢查網路連線狀態的變化無網路時跳轉到設定介面

在AndroidManifest.xml中加一個許可權 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <intent-filter>

MySQL資料連線關閉還有設定資料庫的編碼方式

package UserManager; /** * Created by mff on 2017/5/15. */ import java.sql.*; public class MysqlCo

Android Fragment碎片-片段(不同佈局仿手機設定介面

package com.example.android_11; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends App

kickstart自動安裝指令碼;系統延時定時任務的atcrobtab檔案方式設定定時任務;

kickstart自動安裝指令碼 前提條件:掛載好yum,開啟httpd服務,配置dhcp服務 yum install -y system-config-kickstart system-config-kickstart 點Add 點 Add Netwo

restlet 客戶端發起請求連線超時設定

此客戶端建立 是使用restlet 實現。 需要restlet 的基礎jar包,org.restlet.jar,org.restlet.ext.servlet.jar. 這兩個jar 可以實現基本的rest服務。 客戶端發起請求還需要其他相關jar包。如下 * 需要依賴org.res

真正去理解Socket通訊方式手卡與基站連線方式到底是怎麼樣的?

在2018/10/25-2018/11/08專案試執行期間,存在著某種奇怪的現象,現象描述如下:  工人下井時候,基站總是漏了個別人的訊號; 工人下班出井口的時候,大約7個人中總有一兩個人的手卡訊號,基站是收不到訊號的; 注意:只有一個手卡的訊號超過10分鐘沒有收到而且最後的位

python學習之網站的編寫(HTMLCSSJS)(十三)----------CSS字型和對齊方式設定

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行舟不進則退</title> </head> <b

Ubuntu下使用adb和USB連線方式進行android裝置除錯

Ubuntu下使用adb和USB連線的方式進行android裝置除錯 摘要:Ubuntu下使用adb和USB連線的方式進行android裝置除錯1、執行命令:sudovi /etc/udev/rules.d/51-Android.rules ,建立51

MySQL密碼相關,連線方式常用命令

[toc] # MySQL密碼相關,連線方式,常用命令 擴充套件  mysql5.7 root密碼更改(較5.6版本變化大)   http://www.apelearn.com/bbs/thread-7289-1-1.html  myisam 和innodb引擎對比

I2S介面硬體定義及電氣連線方式

I2S介面概述 I2S全稱Inter-IC Sound, Integrated Interchip Sound,或簡寫IIS,是飛利浦在1986年定義(1996年修訂)的數字音訊傳輸標準,用於數字音訊資料在系統內部器件之間傳輸,例如編解碼器CODEC、DSP、數字輸入/輸出

VM VirtualBox設定Host-only網路連線方式

         給虛擬機器配置靜態ip地址,能在主機上連線虛擬機器上的服務,虛擬機器能正常訪問外網 環境:vmbox + centos host-only模式就是在你電腦上弄了個雙網絡卡?多了一個下圖所示網路介面卡(Host-only) 1、首先設定訪問外網,把當前連線的

Mapper介面方式的mybatis的增查實現

4.1、Mapper介面程式設計的命名習慣Mapper介面方式的程式設計,需要先有一個介面。這個介面的命名一般是xxxxMapper。 比如: User模組的Mapper,介面命名為UserMapper。 Book模組的Mapper,介面命名為BookMappe

編輯虛擬機器設定裡面的三種網路連線方式

VMware安裝了centos6.0的一些簡介 一、編輯虛擬機器設定裡面的三種網路連線方式 1、橋接模式: 什麼是橋接模式?橋接模式就是將主機網絡卡與虛擬機器虛擬的網絡卡利用虛擬網橋進行通訊。也就是虛擬機器和主機都可以相互獨立訪問,各自獲取ip地址。(注意是同一網段,下圖為工作模式)

linux下mysql的解除安裝安裝忘記密碼修改密碼允許遠端連線設定

一、linux下mysql的解除安裝        檢視已經安裝了的MySql的包              rpm -qa|grep -i mysql [[email protected] ~]# rpm -qa|grep -i mysql MySQL-c

通訊方式梳理:GPIOI2CSPIUARTUSARTUSB的區別

GPIO,I2C,SPI,UART,USART,USB的區別 1、簡單區別: 1) GPIO(General Purpose Input Output )為通用輸入/輸出,通用埠,匯流排擴充套件器, 利用工業標準I2C、SMBus™或SPI™介面簡化了I/O口的擴充套件。當微控制器或

程式實現對資料排序並按出現次數進行排序 程式實現對資料排序並按出現次數進行排序(注:用面向物件的方式實現用for迴圈進行排序別用comparable介面實現){14213214}作為

程式實現對資料排序並按出現次數進行排序 程式實現對資料排序並按出現次數進行排序(注:用面向物件的方式實現,用for迴圈進行排序,別用comparable介面實現){1,4,2,1,3,2,1,4}作為引數(引數可變)傳入java方法中,控制檯輸出以下結果 1出現了3次 2出現了2次

Virtual Box 設定虛擬機器網路連線方式Host-Only和NAT的混合連線方式

零、目的      NAT方式保證虛擬機器能聯網,Host-Only保證虛擬機器和宿主機能互訪。 一、NAT方式設定      設定完之後,虛擬機器之間可以互相ping通,並且虛擬機器都有了靜態的IP地址。 

PHP連線Oracle設定字符集避免亂碼

資料庫用oracle,當php連線oracle的時候,最好指定字符集。查PHP手冊,oci_connect的第四個引數為charset,這是關鍵。$db可以用“”代替,同事說,Oracle可以按照 客戶端指定的字符集 提供資料。也就是說,如果我本地PHP檔案用UTF-8,那麼