当前位置: 首页 > news >正文

android 反射执行方法,Android中怎么通过反射调用setUsbTethering()方法

Usb

setting 中tethering 设置流程

一 资源位置及入口文件

USB

tethering, usb_tethering_button_text

Xml/tether_prefs.xml------usb_tether_settings,布局文件

packages/apps/Settings/AndroidManifest.xml

android:name=".TetherSettings"

android:label="@string/tether_settings_title_all"

android:clearTaskOnLaunch="true"

android:exported="true"

android:targetActivity="Settings$TetherSettingsActivity">

android:name="com.android.settings.FRAGMENT_CLASS"

android:value="com.android.settings.TetherSettings"

/>

android:name="com.android.settings.TOP_LEVEL_HEADER_ID"

android:resource="@id/wireless_settings"

/>

android:name="com.android.settings.PARENT_FRAGMENT_TITLE"

android:resource="@string/wireless_networks_settings_title"

/>

android:name="com.android.settings.PARENT_FRAGMENT_CLASS"

android:value="com.android.settings.Settings$WirelessSettingsActivity"

/>

TetherSettings.java

二 触发流程

2.1

TetherSettings.java

packages/apps/Settings/src/com/android/settings/TetherSettings.java

onPreferenceTreeClick

SXlog.d(TAG,

"onPreferenceTreeClick - setusbTethering(" + newState + ")

mUsbTethering: " + mUsbTethering);

setUsbTethering(true);

下面是设置时抓取的log日志

D/TetherSettings( 543): onPreferenceTreeClick -

setusbTethering(true) mUsbTethering: true

D/Tethering(

271): setUsbTethering(true)

D/UsbDeviceManager( 271):

setCurrentFunction(rndis) default: false

W/UsbDeviceManager( 271): handleMessage:

2

W/UsbDeviceManager( 271): setEnabledFunctions:

functions = rndis

W/UsbDeviceManager( 271): setEnabledFunctions,

mDefaultFunctions: mtp,adb

W/UsbDeviceManager( 271): setEnabledFunctions,

mCurrentFunctions: mtp,adb

D/UsbDeviceManager( 271): setEnabledFunctions,

mSettingFunction: mtp,adb

W/UsbDeviceManager( 271): containsFunction,

functions: rndis

W/UsbDeviceManager( 271): containsFunction,

function: adb

W/UsbDeviceManager( 271): containsFunction

index: -1

W/UsbDeviceManager( 271): addFunction,

functions: rndis

W/UsbDeviceManager( 271): addFunction, function:

adb

W/UsbDeviceManager( 271): containsFunction,

functions: rndis

W/UsbDeviceManager( 271): containsFunction,

function: acm

W/UsbDeviceManager( 271): containsFunction

index: -1

W/UsbDeviceManager( 271): containsFunction,

functions: rndis,adb

W/UsbDeviceManager( 271): containsFunction,

function: acm

W/UsbDeviceManager( 271): containsFunction

index: -1

D/UsbDeviceManager( 271):

setUsbConfig(none)

W/UsbDeviceManager( 271): setUsbConfig, config:

none

public

boolean onPreferenceTreeClick(PreferenceScreen

screen, Preference preference) {

ConnectivityManager cm =

(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if

(preference == mUsbTether) {

if

(!mUsbTethering) {

boolean

newState = mUsbTether.isChecked();

mUsbTethering = true;

mUsbTetherCheckEnable = false;

mUsbTether.setEnabled(false);

SXlog.d(TAG,

"onPreferenceTreeClick - setusbTethering(" + newState + ")

mUsbTethering: " + mUsbTethering);

if

(newState) {

startProvisioningIfNecessary(USB_TETHERING);

} else

{

setUsbTethering(newState);

}

} else

{

return

true;

}

} else if

(preference == mBluetoothTether) {

private void

setUsbTethering(boolean

enabled) {

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

private

final IConnectivityManager

mService;

public int

setUsbTethering(boolean

enable) {

try

{

return

mService.setUsbTethering(enable);

} catch

(RemoteException e) {

return

TETHER_ERROR_SERVICE_UNAVAIL;

}

}

manager 和service有一个对应关系,固定的规则。 manager是为了sdk诞生的,方便app开发者调用。其实可以直接调用service,如mountservice是没有mountmanager的。

service是在系统起来是就被android系统启动的,而manager是后期有需要时实例化起来的。

Service的目录在:/frameworks/base/services/java/com/android/server/

manager的目录在:frameworks/base/core/java/android

2.3

ConnectivityService.java

frameworks/base/services/java/com/android/server

private

Tethering mTethering;

public int

setUsbTethering(boolean

enable) {

enforceTetherAccessPermission();

if

(isTetheringSupported()) {

return

mTethering.setUsbTethering(enable);

} else

{

return

ConnectivityManager.TETHER_ERROR_UNSUPPORTED;

}

}

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);

………………

else

{

mUsbTetherRequested = true;

usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS,

false);

}

通过service,来获取manager,进行操作。这个tethering.java的构造函数

public

Tethering(Context context,

INetworkManagementService nmService,

INetworkStatsService statsService,

IConnectivityManager connService, Looper looper)

{

Context是获取全局信息的接口,

2.5 UsbManager.java

/frameworks/base/core/java/android/hardware/usb/UsbManager.java

public void setCurrentFunction(String

function, boolean makeDefault) {

try {

mService.setCurrentFunction(function,

makeDefault);

}

catch (RemoteException e) {

Log.e(TAG, "RemoteException in

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(String function, boolean

makeDefault) {

mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB,

null);

if

(mDeviceManager != null) {

mDeviceManager.setCurrentFunction(function,

makeDefault);

}

else {

throw new IllegalStateException("USB device

mode not supported");

}

}

/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java

public void setCurrentFunction(String

function, boolean makeDefault) {

if

(DEBUG) Slog.d(TAG, "setCurrentFunction(" + function + ") default:

" + makeDefault);

mHandler.sendMessage(MSG_SET_CURRENT_FUNCTION,

function, makeDefault);

}

public void handleMessage(Message msg)

{

case

MSG_SET_CURRENT_FUNCTION:

String function =

(String)msg.obj;

boolean makeDefault = (msg.arg1 ==

1);

if (function != null

&&

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(function,

makeDefault);

SXlog.d(TAG, "handleMessage -

MSG_SET_CURRENT_FUNCTION - function: " +

function);

break;

private void setEnabledFunctions(String

functions, boolean makeDefault) {

private boolean setUsbConfig(String config) {

SystemProperties.set("sys.usb.config",

config);

取消

评论

相关文章:

  • iphone没有android安全,Android安全性与iPhone一样吗
  • android listview checkbox 选中状态,Android ListView专题之十  checkbox选中的值在翻屏时会跳来跳去...
  • 鸿蒙系统翻车了,鸿蒙系统翻车了?任正非承认忽视了关键问题,称华为犯下大错误...
  • android10侧滑返回黑屏,Android实现类似IOS右滑返回的效果(原因分析及解决办法)
  • 华为 android 安全,华为 EMUI/Magic UI 安全更新 2020-3
  • 华为mate50麒麟处理器鸿蒙系统,华为Mate50Pro概念图:有鸿蒙OS,处理器你选择麒麟还是高通?...
  • html右侧箭头是什么控件,html实现右箭头
  • html免费教程在线,免费HTML5在线教程 - 踏得网
  • android 单例设计模式,Android设计模式之单例模式
  • html5媒体查询的特点,HTML5 的媒体查询用多了好么?
  • html 数据校验,表单数据校验
  • 回收站有html文件,怎么找回回收站删除的文件 强烈推荐互盾专家上线支招
  • 计算机专业班级网站,计算机专业班级标语
  • 南昌计算机网络技术好的学校,南昌五制大专计算机网络技术
  • illustrator cc 导出html,提取 CSS | Illustrator
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【面试系列】之二:关于js原型
  • Angularjs之国际化
  • echarts的各种常用效果展示
  • Golang-长连接-状态推送
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js中forEach回调同异步问题
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue小说阅读器(仿追书神器)
  • Vultr 教程目录
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 高性能JavaScript阅读简记(三)
  • 入门级的git使用指北
  • 使用 Docker 部署 Spring Boot项目
  • 树莓派 - 使用须知
  • 微信小程序开发问题汇总
  • 系统认识JavaScript正则表达式
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 阿里云服务器购买完整流程
  • 仓管云——企业云erp功能有哪些?
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #### go map 底层结构 ####
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (libusb) usb口自动刷新
  • (八)Spring源码解析:Spring MVC
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法)前K大的和
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core和.Net Standard直观理解
  • .NET Standard 的管理策略
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)