通过暗码去打开/关闭usb debug开关

1. Description

通过在dialer输入暗码,打开/关闭usb debug开关。

其实这个功能本来在settings下面就有的,如果是正式版的设备需要连续点击几次版本号才能将usb debug开关显示出来,通过暗码来打开估计是为了更加方便后续的操作吧。

2. Analysis

  1. 首先在dialer处进行逻辑判断,如果接收到的是usb debug开关的暗码,则发送对应的广播。在mtk自带的dialer就有相关的逻辑了,如handleSecretCode方法就会接收*#*#<code>#*#*格式的暗码,然后发送广播,其相关代码如下所示:

    1. static boolean handleSecretCode(Context context, String input) {
    2. // Secret codes are accessed by dialing *#*#<code>#*#*
    3. /// M: add for handle reboot meta secret code @{
    4. if (FK_SUPPORTED.equals(SystemProperties.get(FK_REBOOT_META_SUPPORT))) {
    5. if (handleRebootMetaSecretCode(context, input)) {
    6. return true;
    7. }
    8. }
    9. /// @}
    10. int len = input.length();
    11. if (len <= 8 || !input.startsWith("*#*#") || !input.endsWith("#*#*")) {
    12. return false;
    13. }
    14. String secretCode = input.substring(4, len - 4);
    15. TelephonyManagerCompat.handleSecretCode(context, secretCode);
    16. return true;
    17. }
    18. /*handleSecretCode这个方法在TelephonyManagerCompat.java文件中,它会将输入的暗码以广播的形式发送出去*/
    19. public static void handleSecretCode(Context context, String secretCode) {
    20. // Must use system service on O+ to avoid using broadcasts, which are not allowed on O+.
    21. if (BuildCompat.isAtLeastO()) {
    22. if (!TelecomUtil.isDefaultDialer(context)) {
    23. LogUtil.e(
    24. "TelephonyManagerCompat.handleSecretCode",
    25. "not default dialer, cannot send special code");
    26. return;
    27. }
    28. context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);
    29. } else {
    30. // System service call is not supported pre-O, so must use a broadcast for N-.
    31. Intent intent =
    32. new Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://" + secretCode));
    33. context.sendBroadcast(intent);
    34. }
    35. }
  2. 在广播接收器中进行对应的逻辑处理:

    usb debug的状态信息是存储在ContentProvider中的,对应的标识:

    1. /**
    2. * Whether ADB is enabled.
    3. */
    4. public static final String ADB_ENABLED = "adb_enabled";

    只要将存储在ContentProvider的状态值拿出来,然后进行判断,如果为0则表示当前usb debug是关闭的,如果为1则表示当前usb debug是打开的。只需要将状态值取反后再存入ContentProvider就可以改变usb debug状态。

3. Solution

  • 添加USB接收器USBDebugBroadcastReceiver,具体代码如下:
  1. package com.android.settings;
  2. import android.content.BroadcastReceiver;
  3. import android.content.ContentResolver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.res.Resources;
  7. import android.provider.Settings;
  8. import android.util.Log;
  9. import android.widget.Toast;
  10. import com.android.internal.telephony.TelephonyIntents;
  11. public class USBDebugBroadcastReceiver extends BroadcastReceiver {
  12. private static final String TAG="USBDebugBroadcastReceiver";
  13. private Toast debugOpenToast;
  14. @Override
  15. public void onReceive(Context context, Intent intent) {
  16. if(TelephonyIntents.SECRET_CODE_ACTION.equals(intent.getAction()) && "0000".equals(intent.getData().getHost())){
  17. boolean mEnableAdb = false;
  18. final ContentResolver mContentResolver = context.getContentResolver();
  19. mEnableAdb = Settings.Global.getInt(mContentResolver,
  20. Settings.Global.ADB_ENABLED, 0) > 0;
  21. Resources resources=context.getResources();
  22. if (debugOpenToast != null) {
  23. debugOpenToast.cancel();
  24. }
  25. if(!mEnableAdb){
  26. // make sure the ADB_ENABLED setting value matches the current state
  27. try {
  28. Settings.Global.putInt(mContentResolver,
  29. Settings.Global.ADB_ENABLED, 1 );
  30. debugOpenToast = Toast.makeText(context,resources.getString(R.string.enable_adb)+" "+resources.getString(R.string.gadget_state_on)
  31. +" "+resources.getString(R.string.band_mode_succeeded),
  32. Toast.LENGTH_SHORT);
  33. debugOpenToast.show();
  34. } catch (SecurityException e) {
  35. // If UserManager.DISALLOW_DEBUGGING_FEATURES is on, that this setting can't be changed.
  36. Log.d(TAG, "ADB_ENABLED is restricted.");
  37. debugOpenToast = Toast.makeText(context,resources.getString(R.string.enable_adb)+" "+resources.getString(R.string.gadget_state_on)
  38. +" "+resources.getString(R.string.band_mode_failed),
  39. Toast.LENGTH_SHORT);
  40. debugOpenToast.show();
  41. }
  42. }else{
  43. try {
  44. Settings.Global.putInt(mContentResolver,
  45. Settings.Global.ADB_ENABLED, 0 );
  46. debugOpenToast = Toast.makeText(context,resources.getString(R.string.enable_adb)+" "+resources.getString(R.string.gadget_state_off)
  47. +" "+resources.getString(R.string.band_mode_succeeded),
  48. Toast.LENGTH_SHORT);
  49. debugOpenToast.show();
  50. } catch (SecurityException e) {
  51. // If UserManager.DISALLOW_DEBUGGING_FEATURES is on, that this setting can't be changed.
  52. Log.d(TAG, "ADB_DISENABLED is restricted.");
  53. debugOpenToast = Toast.makeText(context,resources.getString(R.string.enable_adb)+" "+resources.getString(R.string.gadget_state_off)
  54. +" "+resources.getString(R.string.band_mode_failed),
  55. Toast.LENGTH_SHORT);
  56. debugOpenToast.show();
  57. }
  58. }
  59. }
  60. }
  61. }
  • 在对应的AndroidManifest.xml中为该接收器进行注册,具体如下:
  1. <receiver android:name=".USBDebugBroadcastReceiver">
  2. <intent-filter>
  3. <action android:name="android.provider.Telephony.SECRET_CODE"/>
  4. <data android:scheme="android_secret_code" android:host="33284"/>
  5. </intent-filter>
  6. </receiver>

4. Summary

这个问题相对简单,只要将期望的状态只存入对应的ContentProvider中就可与改变usb debug状态。之所以通过广播来处理,是因为与activity相比,通过intent启动指定activity组件时,如果没有找到合适的activity组件,会导致程序异常中止,但是通过intent启动BroadcastReceiver组件时不会有该问题出现。

通过暗码去打开/关闭usb debug开关的更多相关文章

  1. [FAQ04776]如何默认打开user版本 debug 选项, 默认打开adb 连接【转】

    本文转载自:http://blog.csdn.net/thinkinwm/article/details/24865933 Description] 如何默认打开user 版本的USB debug 选 ...

  2. Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

    今天有个用户对[设置]有个特殊的要求,即: 1.开机的时候默认显示[开发者选项]并打开[USB调试]开关    ([Developer options]-->[USB debugging]) 2 ...

  3. Android关闭USB的ADB调试和文件传输功能(禁用USB)【转】

    本文转载自:https://blog.csdn.net/jun4331247/article/details/51201825 通过设置系统属性(System Property)[persist.sy ...

  4. CentOS7使用firewalld打开关闭防火墙与端口(转载)

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disabl ...

  5. 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类

    今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...

  6. Android开发——通过扫描二维码,打开或者下载Android应用

    Android开发——通过扫描二维码,打开或者下载Android应用   在实现这个功能的时候,被不同的浏览器折磨的胃疼,最后实现了勉强能用,也查考了一下其他人的博客 android实现通过浏览器点击 ...

  7. fopen(),fclose() 打开/关闭文件

    打开/关闭/刷新流 1. fopen() 打开流 功能: 1)fopen()打开由 path指定的一个文件. 2)fdopen()获取一个先有的文件描述符,并使一个标准的I/O流与该描述相结合.此函数 ...

  8. activity的打开关闭动画

    Activity的打开关闭或者说相互跳转之间可以设置动画的.默认的打开关闭直接消失或出现,比较不优美,但是有的手机Rom对这个默认做了修改,比如红米HM1,默认的就是新页面自右向左滑动出现,自左向右滑 ...

  9. 关于学习CentOS7使用firewalld打开关闭防火墙和端口

    1.firewalld简介 firewalld是centos7的一大特点,主要有两个优点:一是支持动态更新,不需要重启服务:二就是加入了防火墙的“zone”概念. firewalld有图形界面和工具界 ...

随机推荐

  1. CTF靶场

    CTF靶场测试报告 一.跨站脚本攻击(XSS) 实验原理:跨站脚本攻击( Cross Site Script),本来的缩写应为CSS,但是为了与层叠样式表(Cascading Style CSS)区分 ...

  2. 自己实现一个Electron跨进程消息组件

    我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...

  3. java 输入输出IO流 字符流 FileWriter FileReader

    为什么要使用字符流 当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写 ...

  4. mail如何在linux中发送邮件,使用163邮箱发信。

    如何在linux中发送邮件,使用163邮箱发信.   linux中,可以使用mail命令往外发送邮件,在使用前,只需要指定如下简单配置即可,这里演示用  163.com    邮箱发送至 qq.com ...

  5. 云小课|DGC数据开发之基础入门篇

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...

  6. 谷歌浏览器请求返回JSON内容自动格式化

    我们使用谷歌浏览器的扩展插件 下载插件 官方网址:https://github.com/gildas-lormeau/JSONView-for-Chrome 我也上传了 一份:https://yvio ...

  7. UDP&串口调试助手用法(4)

    接收配置用法 概览 保存文件 可将数据保存到文件和文件夹 如果选择的时文件,则需要自己手动选择保存的文件. 如果选择的时文件夹,则需要指定文件夹的类型和文件的后缀 支持保存文件类型: 文本文件和二进制 ...

  8. 【LeetCode】323. Number of Connected Components in an Undirected Graph 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 并查集 日期 题目地址:https://leetcod ...

  9. LeetCode 第三大的数414. Third Maximum Number

    题目 描述:给定数组中求第三大的数字:如果没有,返回最大的:时间复杂度O(n) 记得<剑指offer>才看到过这样的求第k大的题目.但是忘记具体怎么做了.只好先自己想了. 因为时间复杂度的 ...

  10. Vue总结第六天:Vuex (全局变量管理~多个页面共享数据)

    Vue总结第六天:Vuex (全局变量管理~多个页面共享数据) 目录 一.Vuex (全局变量管理~~多个页面共享数据) ✿ 更详细的可以看官网:开始 | Vuex 1.什么是Vuex? 2.核心概念 ...