具体原理这里就不说了 我也没理顺 网上有很多文章都说的很清楚 这里我就直接上重点
主要修改文件
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);
}