具体原理这里就不说了 我也没理顺 网上有很多文章都说的很清楚 这里我就直接上重点

主要修改文件

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

frameworks/base/service/java/com/android/server/usb/UsbHostManager.java

首先将UsbService.java中的public UsbService(Context context)改为这样

    public UsbService(Context context) {        mContext = context;        mSettingsManager = new UsbSettingsManager(context);        PackageManager pm = mContext.getPackageManager();        //if (pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {//modify by hclydao            mHostManager = new UsbHostManager(context, mSettingsManager);        //}        if (new File("/sys/class/android_usb").exists()) {            mDeviceManager = new UsbDeviceManager(context, mSettingsManager);        }    }
不然usbhostmanager不会执行

接下来主要就是修改usbhostmanager了 当硬件usb host插入里会执行usbhostmanager里的usbDeviceAdded函数 拔掉时会执行usbDeviceRemoved

当设备插入时在usb jni里会回调usbDeviceAdded函数 此时会传回这个usb设备的相关信息 但是发现class都是0 还好 在int [] interfaceValues传回了整个usb相关信息interfaceValues[1] 对应的就是相应的class 3对应的是usb hid 8对应的是mass storage 9对就的是usb hub 提示图片和信息直接使用系统自带的

最后修改为如下

/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions an * limitations under the License. */package com.android.server.usb;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.hardware.usb.IUsbManager;import android.hardware.usb.UsbConstants;import android.hardware.usb.UsbDevice;import android.hardware.usb.UsbEndpoint;import android.hardware.usb.UsbInterface;import android.hardware.usb.UsbManager;import android.net.Uri;import android.os.Binder;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Parcelable;import android.os.ParcelFileDescriptor;import android.os.UEventObserver;import android.provider.Settings;import android.util.Slog;import java.io.File;import java.io.FileDescriptor;import java.io.FileReader;import java.io.PrintWriter;import java.util.HashMap;import java.util.List;import android.app.Notification;import android.app.NotificationManager;import android.content.res.Resources;import java.util.ArrayList;/** * UsbHostManager manages USB state in host mode. */public class UsbHostManager {    private static final String TAG = UsbHostManager.class.getSimpleName();    private static final boolean LOG = false;    // contains all connected USB devices    private final HashMap<String,UsbDevice> mDevices = new HashMap<String,UsbDevice>();    // USB busses to exclude from USB host support    private final String[] mHostBlacklist;    private final Context mContext;    private final Object mLock = new Object();    private final UsbSettingsManager mSettingsManager;private Notification mUsbHostNotification;private ArrayList<String> dlist;    public UsbHostManager(Context context, UsbSettingsManager settingsManager) {        mContext = context;        mSettingsManager = settingsManager;        mHostBlacklist = context.getResources().getStringArray(                com.android.internal.R.array.config_usbHostBlacklist);    }    private boolean isBlackListed(String deviceName) {        int count = mHostBlacklist.length;        for (int i = 0; i < count; i++) {            if (deviceName.startsWith(mHostBlacklist[i])) {                return true;            }        }        return false;    }    /* returns true if the USB device should not be accessible by applications */    private boolean isBlackListed(int clazz, int subClass, int protocol) {        // blacklist hubs        if (clazz == UsbConstants.USB_CLASS_HUB) return true;        // blacklist HID boot devices (mouse and keyboard)        if (clazz == UsbConstants.USB_CLASS_HID &&                subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT) {            return true;        }        return false;    }    /* Called from JNI in monitorUsbHostBus() to report new USB devices */    private void usbDeviceAdded(String deviceName, int vendorID, int productID,            int deviceClass, int deviceSubclass, int deviceProtocol,            /* array of quintuples containing id, class, subclass, protocol               and number of endpoints for each interface */            int[] interfaceValues,           /* array of quadruples containing address, attributes, max packet size              and interval for each endpoint */            int[] endpointValues) {if((interfaceValues != null) && (interfaceValues[1] == UsbConstants.USB_CLASS_HID)) {//add by hclydao            setUsbHostNotification(                    com.android.internal.R.string.usb_storage_notification_title,                    com.android.internal.R.string.usb_storage_notification_title,                    com.android.internal.R.drawable.stat_sys_tether_usb, true, true, null);if(dlist == null)dlist = new ArrayList<String>();dlist.add(deviceName);}        if (isBlackListed(deviceName) ||                isBlackListed(deviceClass, deviceSubclass, deviceProtocol)) {            return;        }        synchronized (mLock) {            if (mDevices.get(deviceName) != null) {                Slog.w(TAG, "device already on mDevices list: " + deviceName);                return;            }            int numInterfaces = interfaceValues.length / 5;            Parcelable[] interfaces = new UsbInterface[numInterfaces];            try {                // repackage interfaceValues as an array of UsbInterface                int intf, endp, ival = 0, eval = 0;                for (intf = 0; intf < numInterfaces; intf++) {                    int interfaceId = interfaceValues[ival++];                    int interfaceClass = interfaceValues[ival++];                    int interfaceSubclass = interfaceValues[ival++];                    int interfaceProtocol = interfaceValues[ival++];                    int numEndpoints = interfaceValues[ival++];                    Parcelable[] endpoints = new UsbEndpoint[numEndpoints];                    for (endp = 0; endp < numEndpoints; endp++) {                        int address = endpointValues[eval++];                        int attributes = endpointValues[eval++];                        int maxPacketSize = endpointValues[eval++];                        int interval = endpointValues[eval++];                        endpoints[endp] = new UsbEndpoint(address, attributes,                                maxPacketSize, interval);                    }                    // don't allow if any interfaces are blacklisted                    if (isBlackListed(interfaceClass, interfaceSubclass, interfaceProtocol)) {                        return;                    }                    interfaces[intf] = new UsbInterface(interfaceId, interfaceClass,                            interfaceSubclass, interfaceProtocol, endpoints);                }            } catch (Exception e) {                // beware of index out of bound exceptions, which might happen if                // a device does not set bNumEndpoints correctly                Slog.e(TAG, "error parsing USB descriptors", e);                return;            }            UsbDevice device = new UsbDevice(deviceName, vendorID, productID,                    deviceClass, deviceSubclass, deviceProtocol, interfaces);            mDevices.put(deviceName, device);            mSettingsManager.deviceAttached(device);        }    }    /* Called from JNI in monitorUsbHostBus to report USB device removal */    private void usbDeviceRemoved(String deviceName) {if(dlist != null) {for(int i = 0;i<dlist.size();i++) {if(dlist.get(i).equals(deviceName)) {dlist.remove(i);/*    setUsbHostNotification(            com.android.internal.R.string.ext_media_nomedia_notification_title,            com.android.internal.R.string.ext_media_nomedia_notification_message,            com.android.internal.R.drawable.stat_sys_tether_usb,            false, false, null);*/setUsbHostNotification(0, 0, 0, false, false, null);break;}}}        synchronized (mLock) {            UsbDevice device = mDevices.remove(deviceName);            if (device != null) {                mSettingsManager.deviceDetached(device);            }        }    }    public void systemReady() {        synchronized (mLock) {            // Create a thread to call into native code to wait for USB host events.            // This thread will call us back on usbDeviceAdded and usbDeviceRemoved.            Runnable runnable = new Runnable() {                public void run() {                    monitorUsbHostBus();                }            };            new Thread(null, runnable, "UsbService host thread").start();        }    }    /* Returns a list of all currently attached USB devices */    public void getDeviceList(Bundle devices) {        synchronized (mLock) {            for (String name : mDevices.keySet()) {                devices.putParcelable(name, mDevices.get(name));            }        }    }    /* Opens the specified USB device */    public ParcelFileDescriptor openDevice(String deviceName) {        synchronized (mLock) {            if (isBlackListed(deviceName)) {                throw new SecurityException("USB device is on a restricted bus");            }            UsbDevice device = mDevices.get(deviceName);            if (device == null) {                // if it is not in mDevices, it either does not exist or is blacklisted                throw new IllegalArgumentException(                        "device " + deviceName + " does not exist or is restricted");            }            mSettingsManager.checkPermission(device);            return nativeOpenDevice(deviceName);        }    }    public void dump(FileDescriptor fd, PrintWriter pw) {        synchronized (mLock) {            pw.println("  USB Host State:");            for (String name : mDevices.keySet()) {                pw.println("    " + name + ": " + mDevices.get(name));            }        }    }    private synchronized void setUsbHostNotification(int titleId, int messageId, int icon, boolean visible,                                                          boolean dismissable, PendingIntent pi) {        if (!visible && mUsbHostNotification == null) {            return;        }        NotificationManager notificationManager = (NotificationManager) mContext                .getSystemService(Context.NOTIFICATION_SERVICE);        if (notificationManager == null) {            return;        }        if (mUsbHostNotification != null && visible) {            /*             * Dismiss the previous notification - we're about to             * re-use it.             */            final int notificationId = mUsbHostNotification.icon;            notificationManager.cancel(notificationId);        }                if (visible) {            Resources r = Resources.getSystem();            CharSequence title = r.getText(titleId);            CharSequence message = r.getText(messageId);            if (mUsbHostNotification == null) {                mUsbHostNotification = new Notification();                mUsbHostNotification.when = 0;            }            mUsbHostNotification.defaults &= ~Notification.DEFAULT_SOUND;            if (dismissable) {                mUsbHostNotification.flags = Notification.FLAG_AUTO_CANCEL;            } else {                mUsbHostNotification.flags = Notification.FLAG_ONGOING_EVENT;            }            mUsbHostNotification.tickerText = title;            if (pi == null) {                Intent intent = new Intent();                pi = PendingIntent.getBroadcast(mContext, 0, intent, 0);            }            mUsbHostNotification.icon = icon;            mUsbHostNotification.setLatestEventInfo(mContext, title, message, pi);        }            final int notificationId = mUsbHostNotification.icon;        if (visible) {            notificationManager.notify(notificationId, mUsbHostNotification);        } else {            notificationManager.cancel(notificationId);        }    }    private native void monitorUsbHostBus();    private native ParcelFileDescriptor nativeOpenDevice(String deviceName);}




更多相关文章

  1. 升级Android(安卓)Studio 3.6.1 后无法运行 Java 的main函数问题
  2. Android(安卓)BlueDroid(三):BlueDroid蓝牙开启过程enable
  3. android仿人人网右边可推出的效果
  4. android L 的开机动画流程
  5. Android(安卓)1.5 1.6 2.0 2.1 2.2 2.3 3.0,4.0的区别
  6. Android(安卓)怎么样调用HAL的
  7. Android(安卓)Camera 调用流程
  8. 〖Linux〗Android(安卓)NDK调用已编译好的C/C++动态连接库(so文件
  9. android 中的一些小case

随机推荐

  1. Android中“分享”功能的实现
  2. Android的init过程详解(一)
  3. Android百度地图之位置定位和附近查找代
  4. Android(安卓)Socket 发送广播包的那些坑
  5. Android内存溢出
  6. 谈谈Android个人开发者的现状
  7. Android(安卓)线程优先级设置方法
  8. Android基础备忘(android中的分享功能)
  9. Android(安卓)Studio 基础 之 如何取消使
  10. [Android] Android应用启动后自动创建桌