編輯:關於Android編程
具體原理這裡就不說了 我也沒理順 網上有很多文章都說的很清楚 這裡我就直接上重點
主要修改文件
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 HashMapmDevices = new HashMap (); // 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 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 (); 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
ndroid.os.Message的主要功能是進行消息的封裝,並且同時可以指定消息的操作形式。 No. 變量或方法 類型 描述 1 p
看了前面的文章我們知道請求網絡的幾種方式:1.使用TCP協議和URL進行網絡編程 a)基於TCP協議:ServerSocket,Socket b)基於URL:
當我們調試安卓機器時,第一次插上usb線,會彈出一個授權的對話框,(前提是打開了usb調試功能)點擊確認,才會允許調試.如果我們想機器默認就可以調試該怎麼做呢?如果我們想
android6.0源碼分析之Camera API2.0下的Capture流程分析 前面對Camera2的初始化以及預覽的相關流程進行了詳細分析,本文將會對Ca