Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android usb相關知識總結

android usb相關知識總結

編輯:關於Android編程

 

1、android背景介紹

UsbService,在系統啟動時創建,在該文件中,和usb狀態息息相關的操作類是UsbDeviceManager,大部分的usb以及adb相關的邏輯,在這個類中做處理。UsbDeviceManager中,我們需要關注三部分內容。一、配置文件。二、 private final UEventObserver mUEventObserver = new UEventObserver() ,接受UEvent事件。三、UsbHandler。

其中配置文件,保存當前usb狀態。UEventObserver接受usb事件,push給UsbHandler來處理。UsbHandler是用來處理Usb事件的關鍵類。

2、Usb默認狀態從哪裡獲取,當前的默認狀態又是什麼?

Usb的當前狀態保存在mCurrentFunctions成員變量中,該變量在UsbHandler的構造中進行初始化。

 

mDefaultFunctions = SystemProperties.get(persist.sys.usb.config, adb);

                // Check if USB mode needs to be overridden depending on OEM specific bootmode.
                mDefaultFunctions = processOemUsbOverride(mDefaultFunctions);

                // sanity check the sys.usb.config system property
                // this may be necessary if we crashed while switching USB configurations
                String config = SystemProperties.get(sys.usb.config, none);
                if (!config.equals(mDefaultFunctions)) {
                    Slog.w(TAG, resetting config to persistent property:  + mDefaultFunctions);
                    SystemProperties.set(sys.usb.config, mDefaultFunctions);
                }

                mCurrentFunctions = mDefaultFunctions;

3、插入usb時,彈出adb以及Notification通知的大體流程是什麼?

插入usb時,我們的UEventObserver會收到信息,最終push給UsbHandler。

UEvent信息:

 

04-17 14:20:03.352 V/UsbDeviceManager(  759): USB UEVENT: {USB_STATE=DISCONNECTED, SUBSYSTEM=android_usb, SEQNUM=7528, ACTION=change, DEVPATH=/devices/virtual/android_usb/android0}
然後執行UsbHandler的updateState方法。
private final UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            if (DEBUG) Slog.v(TAG, USB UEVENT:  + event.toString());

            String state = event.get(USB_STATE);
            String accessory = event.get(ACCESSORY);
            if (state != null) {
                mHandler.updateState(state);
            } else if (START.equals(accessory)) {
                if (DEBUG) Slog.d(TAG, got accessory start);
                startAccessoryMode();
            }
        }
    };

 

updateState方法:更新mConnection狀態。

 

public void updateState(String state) {
            int connected, configured;

            if (DISCONNECTED.equals(state)) {
                connected = 0;
                configured = 0;
            } else if (CONNECTED.equals(state)) {
                connected = 1;
                configured = 0;
            } else if (CONFIGURED.equals(state)) {
                connected = 1;
                configured = 1;
            } else {
                Slog.e(TAG, unknown state  + state);
                return;
            }
            removeMessages(MSG_UPDATE_STATE);
            Message msg = Message.obtain(this, MSG_UPDATE_STATE);
            msg.arg1 = connected;
            msg.arg2 = configured;
            // debounce disconnects to avoid problems bringing up USB tethering
            sendMessageDelayed(msg, (connected == 0) ? UPDATE_DELAY : 0);
        }
最後在UsbHandler中進行更新狀態,進而彈出adb以及usb的Notification

 

 

case MSG_UPDATE_STATE:
                    mConnected = (msg.arg1 == 1);
                    mConfigured = (msg.arg2 == 1);
                    updateUsbNotification();
                    updateAdbNotification();
                    if (containsFunction(mCurrentFunctions,
                            UsbManager.USB_FUNCTION_ACCESSORY)) {
                        updateCurrentAccessory();
                    } else if (!mConnected) {
                        // restore defaults when USB is disconnected
                        setEnabledFunctions(mDefaultFunctions, false);
                    }
                    if (mBootCompleted) {
                        updateUsbState();
                        updateAudioSourceFunction();
                    }
                    break;
4、可設置的usb類型有哪些?
public static final String USB_FUNCTION_MASS_STORAGE = mass_storage;

    /**
     * Name of the adb USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_ADB = adb;

    /**
     * Name of the RNDIS ethernet USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_RNDIS = rndis;

    /**
     * Name of the MTP USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_MTP = mtp;

    /**
     * Name of the PTP USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_PTP = ptp;

    /**
     * Name of the CHARGING USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_CHARGING = charging;

    /**
     * Name of the audio source USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_AUDIO_SOURCE = audio_source;

    /**
     * Name of the Accessory USB function.
     * Used in extras for the {@link #ACTION_USB_STATE} broadcast
     *
     * {@hide}
     */
    public static final String USB_FUNCTION_ACCESSORY = accessory;
這些是其定義。其中adb與charging不能同時兼容。

5、設置usb的流程是什麼?

 

上層能夠設定usb類型的類名叫做:UsbSettings,在其中,用戶可以設定當前UsbSettings狀態為mtp、ptp以及廠商定義的其他usb狀態。

在用戶操作時,會調用mUsbManager.setCurrentFunction(function, true);

 

tring function = USB_FUNCTION_DEFAULT;
        if (preference == mMtp && mMtp.isChecked()) {
            function = UsbManager.USB_FUNCTION_MTP;
        } else if (preference == mPtp && mPtp.isChecked()) {
            function = UsbManager.USB_FUNCTION_PTP;
        } else if (preference == mCharging && mCharging.isChecked()) {
            function = UsbManager.USB_FUNCTION_CHARGING;
        } else if (preference == mSDCard && mSDCard.isChecked()) {
            function = UsbManager.USB_FUNCTION_MASS_STORAGE;
        }

        operateInprogress = true;
        mUsbManager.setCurrentFunction(function, true);
        updateToggles(function);
USBManager會繼而調用UsbService的setCurrentFunction

 

UsbService.java

 

@Override
    public void setCurrentFunction(String function, boolean makeDefault) {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);

        // If attempt to change USB function while file transfer is restricted, ensure that
        // the current function is set to none, and return.
        UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        if (userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) {
            if (mDeviceManager != null) mDeviceManager.setCurrentFunctions(none, false);
            return;
        }

        if (mDeviceManager != null) {
            mDeviceManager.setCurrentFunctions(function, makeDefault);
        } else {
            throw new IllegalStateException(USB device mode not supported);
        }
    }
最終還是會調用UsbDeviceManager中的setCurrentFunction。

 

 

 


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved