You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置ACTION_PROCESS_TEXT过滤规则 使应用仅选手机号时出现在文本处理菜单

解决Android文本选择菜单仅手机号场景展示应用入口的方案

你当前使用的PROCESS_TEXT意图的原生intent-filter仅支持匹配通用属性(action、category、mimeType等),无法读取选中的文本内容做自定义校验,所以默认会在所有纯文本选择场景展示。要实现仅手机号场景展示,可按以下方案操作:


方案1:动态注册文本选择快捷方式(推荐,适配Android 10及以上)

Android 10及以上系统支持通过ShortcutManager注册带内容匹配规则的文本选择快捷方式,可以精准控制仅在选中文本匹配手机号正则时展示入口:

  1. 移除清单文件中原有的PROCESS_TEXT intent-filter配置
  2. 在应用启动时(例如Application的onCreate中)调用以下代码注册快捷方式:
// 仅Android 10及以上支持
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    val shortcutManager = getSystemService(ShortcutManager::class.java)
    // 手机号正则,可根据需求调整匹配规则
    val phoneRegex = "^1[3-9]\\d{9}$"
    
    val shortcut = ShortcutInfo.Builder(this, "process_phone_text")
        .setShortLabel("你的应用名称") // 菜单上显示的文字
        .setLongLabel("使用XX应用处理手机号")
        .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))
        .setIntent(Intent(this, YourTargetActivity::class.java).apply {
            action = Intent.ACTION_PROCESS_TEXT
            categories.add(Intent.CATEGORY_DEFAULT)
            type = "text/plain"
        })
        // 配置内容匹配规则:仅选中内容匹配手机号正则时展示
        .addCapabilityBinding(
            "actions.intent.PROCESS_TEXT",
            "text",
            listOf(PatternMatcher(phoneRegex, PatternMatcher.PATTERN_REGEX))
        )
        .build()
    
    shortcutManager.addDynamicShortcuts(listOf(shortcut))
}
  1. 在目标Activity中获取选中的文本即可:
val selectedText = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT)

方案2:兼容低版本的折中方案

如果需要适配Android 9及以下系统,没有官方的内容过滤能力,可以用以下方式优化体验:

  1. 保留你原有的PROCESS_TEXT intent-filter配置
  2. 在目标Activity的onCreate方法中优先校验文本内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String selectedText = getIntent().getStringExtra(Intent.EXTRA_PROCESS_TEXT);
    // 校验是否为手机号
    if (!isPhoneNumber(selectedText)) {
        Toast.makeText(this, "仅支持处理手机号", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }
    // 后续正常处理逻辑
}

// 手机号校验方法
private boolean isPhoneNumber(String text) {
    if (text == null || text.trim().isEmpty()) return false;
    String trimText = text.trim().replace(" ", "").replace("-", "");
    return trimText.matches("^1[3-9]\\d{9}$");
}

这种方式虽然还是会在所有纯文本选择场景展示应用入口,但用户点击非手机号内容时会直接退出,不会进入业务页面。


额外优化:匹配带tel协议的链接

如果需要同时适配用户点击手机号链接的场景,可以在清单中额外添加以下intent-filter:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="tel" />
</intent-filter>

内容的提问来源于stack exchange,提问作者J Morrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:54:07