Cómo utilizar la clase de auriculares Bluetooth a través de la reflexión
El proceso de configuración en Configuración de anclaje a red
Una ubicación de recursos y un archivo de entrada
USB
Anclaje a red, usb_tethering_button_text
Xml/tether_prefs.xml ------usb_tether_settings, archivo de diseño
paquetes/apps/Settings/AndroidManifest.xml
lt;! -- Mantener la compatibilidad con atajos
antiguos.
lt; alias de actividad
android: nombre=".TetherSettings"
android..TOP_LEVEL_HEADER_ID"
android: recurso= "@id/wireless_settings"
/gt;
lt;meta-data
android: name="com.android.settings.Settings$WirelessSettingsActivity"
/gt;
lt;/activity-aliasgt;
TetherSettings.java
Dos procesos desencadenantes
2.1
TetherSettings.java
paquetes/apps/Settings/src/com/android/settings/TetherSettings.java
onPreferenceTreeClick
SXlog.d(TAG,
"onPreferenceTreeClick - setusbTethering(" newState ")
mUsbTethering: " mUsbTethering);
setUsbTethering(true);< / p>
El siguiente es el registro capturado durante la configuración
D/TetherSettings(543): onPreferenceTreeClick -
setusbTethering(true) mUsbTethering: true
D/Tethering(
271): setUsbTethering(true)
D/UsbDeviceManager( 271):
setCurrentFunction( rndis) Valor predeterminado: falso< / p>
W/UsbDeviceManager( 271): handleMessage:
2
W/UsbDeviceManager( 271): setEnabledFunctions:
funciones = rndis< / p>
Con UsbDeviceManager( 271): setEnabledFunctions,
mDefaultFunctions: mtp, adb
Con UsbDeviceManager( 271).setEnabledFunctions,
mCurrentFunctions : mtp, adb
D/UsbDeviceManager(271): setEnabledFunctions,
mSettingFunction: mtp, adb
W/UsbDeviceManager(271): contieneFunción,< / p>
funciones: rndis
W/UsbDeviceManager(271): contieneFunción,
functio
ns: adb
W/UsbDeviceManager( 271): contieneFunción
índice: -1
W/UsbDeviceManager( 271): addFunction,
funciones: rndis
W/UsbDeviceManager(271): addFunction, función:
adb
W/UsbDeviceManager(271): contieneFunción,
W/UsbDeviceManager(271): contieneFunción,
funciones: rndis
W/UsbDeviceManager(271): contieneFunción,
función: acm
W/UsbDeviceManager( 271).containsFunction
índice: -1
W/UsbDeviceManager( 271): contieneFunción,
funciones: rndis, adb
W/UsbDeviceManager(271): contieneFunción,
función: acm
W/UsbDeviceManager(271): contieneFunción
índice: - 1
D/UsbDeviceManager(271):
setUsbConfig(none)
W/UsbDeviceManager(271): setUsbConfig, configuración:
ninguno
público
booleano onPreferenceTreeClick(PreferenceScreen
pantalla, preferencia de preferencia) {
ConnectivityManager cm =
(ConnectivityManager )getSystemService(Context.CONNECTIVITY_SERVICE);
if
(preferencia == mUsbTether) {
if
(! mUsbTethering) {
booleano
newState = mUsbTether.isChecked();
mUsbTethering = true;
mUsbTetherCheckEnable = false; p>
p>
mUsbTether.setEnabled(false);
SXlog.d(TAG,
"onPreferenceTreeClick - setusbTethering(" newState ")
mUsbTethering: " mUsbTethering);
if
(newState) {
startProv
isioningIfNecessary(USB_TETHERING);
} else
{
setUsbTethering(newState);
}
} else
{
return
verdadero;
}
}
} else if
(preferencia == mBluetoothTether) {
private void
setUsbTethering(boolean
habilitado) {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if
(cm.setUsbTethering(enabled) !=
ConnectivityManager.TETHER_ERROR_NO_ERROR) {
mUsbTether.setChecked(false);
mUsbTether.setSummary(R.string.usb_ tethering_errored_subtext);
return;
}
mUsbTether.setSummary("");
}
2.2
ConnectivityManager.java
frameworks/base/core/java/android/net/ConnectivityManager.java
privado
IConnectivityManager final
mService;
public int
setUsbTethering(boolean
enable) {
intentar
{
regresar
mService.setUsbTethering(enable);
} catch
(RemoteException e) {
return
TETHER_ERROR_SERVICE_UNAVAIL;
}
}
}
}
}
gerente Existen reglas fijas correspondientes a los servicios. El administrador se crea para el SDK para que a los desarrolladores de aplicaciones les resulte más fácil llamarlo. De hecho, puede llamar a los servicios directamente, por ejemplo, mountservice no es mountmanager.
El sistema Android inicia el servicio en el sistema, mientras que el administrador se inicia cuando es necesario crear una instancia más adelante.
El servicio se encuentra en el siguiente directorio: /frameworks/base/services/java/com/android/server/
El administrador se encuentra en el siguiente directorio: frameworks/base /core/java/android
2.3
ConnectivityService.java
frameworks/base/services/java/com/android/server
público
Privado
Anclaje a red mTethering;
público int
setUsbTethering(boolean
enable) {
enforceTetherAccessPermission ();
if
( isTetheringSupported()) {
return
mTethering.setUsbTethering( enable);
} else
{
return
ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
} p>
2.4
Tethering.java
frameworks/base/services/java/com/android/server/connectivity/Tethering.java
public int
setUsbTethering(boolean
enable) {
UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);
........................
más
{
mUsbTetherRequested = true;
usbManager.setCurrentFunction(UsbManager.USB_ FUNCTION_RNDIS,
false
}
Obtener); el administrador a través del servicio y operarlo.
Este constructor tethering.java
público
Tethering(Context contexto,
INetworkManagementService nmService,
INetworkStatsService statsService,
IConnectivityManager connService, Looper looper)
{
El contexto es la interfaz para obtener información global,
2.5 UsbManager.java
/frameworks/base/core/java/android/hardware/usb/UsbManager.java
public void setCurrentFunction(String
función, boolean makeDefault) {
prueba {
mService.setCurrentFunction(function,
makeDefault);
}
catch (RemoteException e) {
Log.e(TAG, "RemoteException en
setCurrentFunction", e);
}
}
2.6
frameworks/ base/services/java/com/android/server/usb$
mengfd1@tablet-C:~/work/A2107/frameworks/ base/services/java/com /android/server$
cd usb
mengfd1@tablet-C:~/work/A2107/frameworks/base/services/java/com/android/server/usb$
ls
UsbDeviceManager.java UsbHostManager.java
UsbService.java UsbSettingsManager.java
/frameworks/base/services/java/com / android/server/usb/UsbService.java
public void setCurrentFunction(función de cadena, boolean
makeDefault) {
mContext.enforceCallingOrSelfPermission(android.Manifest. permiso.MANAGE_USB,
null);
if
(mDeviceManager! = null) {
mDeviceManager.setCurrentFunction(función,
makeDefault);
}
else {
lanzar nuevo enfermo
egalStateException("dispositivo USB
modo no compatible");
}
}
}
/ frameworks/base/services/java/com/android/server /usb/UsbDeviceManager.java
public void setCurrentFunction(String
función, boolean makeDefault) {
si
(DEBUG) Slog.d(TAG, "setCurrentFunction(" función ") predeterminado:
" makeDefault);
mHandler.sendMessage(MSG_SET_CURRENT_FUNCTION ,
función, makeDefault);
}
mensaje de mango público vacío (mensaje de mensaje)
{
caso
MSG_SET_CURRENT_FUNCTION:
Función de cadena =
(String)msg.obj;
booleano makeDefault = (msg.arg1 ==
1);
if (función != null
amp; amp;
function.equals(UsbManager.USB_FUNCTION_CHARGING_ONLY))
{
mSettingUsbCharging = true;
SXlog.d(TAG, "handleMessage -
MSG_SET_CURRENT_FUNCTION - USB_FUNCTION_CHARGING_ONLY -
makeDefault: " makeDefault);
} else {
mSettingUsbCharging = false;
}
setEnabledFunctions(función,
makeDefault);
SXlog.d(TAG, " handleMessage -
MSG_SET_CURRENT_FUNCTION - función: "
función);
romper;
private void setEnabledFunctions( String
funciones, boolean makeDefault) {
private boolean setUsbConfig(String config) {
SystemProperties.set("sys.usb.config",
config);