android4.0 hid插入提示
16lz
2021-01-25
具体原理这里就不说了 我也没理顺 网上有很多文章都说的很清楚 这里我就直接上重点
主要修改文件
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);}
更多相关文章
- 升级Android(安卓)Studio 3.6.1 后无法运行 Java 的main函数问题
- Android(安卓)BlueDroid(三):BlueDroid蓝牙开启过程enable
- android仿人人网右边可推出的效果
- android L 的开机动画流程
- Android(安卓)1.5 1.6 2.0 2.1 2.2 2.3 3.0,4.0的区别
- Android(安卓)怎么样调用HAL的
- Android(安卓)Camera 调用流程
- 〖Linux〗Android(安卓)NDK调用已编译好的C/C++动态连接库(so文件
- android 中的一些小case