[Android]暗码机制

今天客户邮件过来一段代码让我加一下,说是用暗码启动MainActivity。

<intent-filter>
	<action android:name="android.provider.Telephony.SECRET_CODE"/>
	<data android:host="368222" android:scheme="android_secret_code"/>
</intent-filter>

因为之前改过Dialer,定制过相关的暗码功能,所以没多想就直接把intent-filter加在MainActivity中了。然后测试告诉我,输入”*#*#368222#*#*“不起作用。嗯?

后来一想,好像哪里不太一样,Telephony.SECRET_CODE 好像是系统定义的,不是定制的。然后扒拉一下源码:

packages/apps/Dialer/java/com/android/dialer/app/SpecialCharSequenceMgr.java

/**
 * Handles secret codes to launch arbitrary activities in the form of *#*#<code>#*#*.
 *
 * @param context the context to use
 * @param input the text to check for a secret code in
 * @return true if a secret code was encountered and handled
 */
static boolean handleSecretCode(Context context, String input) {
  // Secret codes are accessed by dialing *#*#<code>#*#*

  int len = input.length();
  if (len <= 8 || !input.startsWith("*#*#") || !input.endsWith("#*#*")) {
    return false;
  }
  String secretCode = input.substring(4, len - 4);
  TelephonyManagerCompat.handleSecretCode(context, secretCode);
  return true;
}

packages/apps/Dialer/java/com/android/contacts/common/compat/TelephonyManagerCompat.java

/**
 * Handles secret codes to launch arbitrary activities.
 *
 * @param context the context to use
 * @param secretCode the secret code without the "*#*#" prefix and "#*#*" suffix
 */
public static void handleSecretCode(Context context, String secretCode) {
  // Must use system service on O+ to avoid using broadcasts, which are not allowed on O+.
  if (BuildCompat.isAtLeastO()) {
    context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);
  } else {
    // System service call is not supported pre-O, so must use a broadcast for N-.
    Intent intent =
        new Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://" + secretCode));
    context.sendBroadcast(intent);
  }
}

嗯,原来*#*##*#* 是定义好的暗码前后缀,拿到暗码之后,发送了一个广播。

所以需要创建一个receiver来handle这个广播:

public class SecretCodeReceiver extends BroadcastReceiver {

    private static final String TAG = "SecretCodeReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d(TAG, "Action = " + action);

        Intent i = new Intent(Intent.ACTION_MAIN);
        i.setClass(context, MainActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);

    }
}

然后把intent-filter放在这个receiver中间

<receiver android:name="com.xx.receiver.SecretCodeReceiver">
	<intent-filter>
	<action android:name="android.provider.Telephony.SECRET_CODE"/>
	<data android:host="368222" android:scheme="android_secret_code"/>
	</intent-filter>
</receiver>

emmmm…好了

发现系统这一套暗码机制还挺好用的,也不理解客户之前为何还要定制一套暗码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发者

玩转全新的 Android 8.0 Oreo 后台策略

3334
来自专栏Flutter入门到实战

Android适配全面总结(三)----ROM适配

版权声明:本文为博主原创文章(部分引用他人博文,已加上引用说明),未经博主允许不得转载。https://www.jianshu.com/p/f9c67a4b90...

2511
来自专栏小巫技术博客

Android简单通用数据传输工具

793
来自专栏葬爱家族

Android高德之旅(1)基础地图

这个系列之前在CSDN上就发了,不过刚开始就因为公司项目忙搁置了,现在转移阵地到简书,希望这次能坚持把这个系列做完。

902
来自专栏美丽应用

Google Now Enabler:一键开启Google Now

8734
来自专栏移动端开发

iOS9.0 友盟分享详细过程

一: 申请友盟的AppKey(友盟的Key是根据应用的名称生成的!) 在友盟注册了你自己的开发者账号后就可以申请AppKey了。然后在这个方法里面设置Key -...

20410
来自专栏移动端开发

AVFoundation 框架初探究(一)

夜深时动笔 ----       前面一篇文章写了视频播放的几种基本的方式,算是给这个系列开了一个头,这里面最想说和探究的就是AVFoundation框架,很想...

6775
来自专栏Youngxj

EMLOG博客添加OwO表情教程

2406
来自专栏杨建荣的学习笔记

关于抓取session信息的一个脚本(r3笔记第8天)

关于session的诊断,可以基于动态性能视图,ash,awr.. 自己也写过一些简单的脚本,在平时的工作中也能够完成一些基本的工作。今天在看taner分享的脚...

3456
来自专栏Zchannel

Openload超简单无下载限制免费网盘推荐!支持影片在线播放还能赚钱

Openload有什么特色呢?如果要我以一句话推荐此服务,我会说:它简单到不行,而且几乎没有任何限制!若你有长期关注免费资源网路社群,一定知道Pseric向来喜...

1.1K1

扫码关注云+社区