如何配置ACTION_PROCESS_TEXT过滤规则 使应用仅选手机号时出现在文本处理菜单
解决Android文本选择菜单仅手机号场景展示应用入口的方案
你当前使用的PROCESS_TEXT意图的原生intent-filter仅支持匹配通用属性(action、category、mimeType等),无法读取选中的文本内容做自定义校验,所以默认会在所有纯文本选择场景展示。要实现仅手机号场景展示,可按以下方案操作:
方案1:动态注册文本选择快捷方式(推荐,适配Android 10及以上)
Android 10及以上系统支持通过ShortcutManager注册带内容匹配规则的文本选择快捷方式,可以精准控制仅在选中文本匹配手机号正则时展示入口:
- 移除清单文件中原有的
PROCESS_TEXTintent-filter配置 - 在应用启动时(例如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)) }
- 在目标Activity中获取选中的文本即可:
val selectedText = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT)
方案2:兼容低版本的折中方案
如果需要适配Android 9及以下系统,没有官方的内容过滤能力,可以用以下方式优化体验:
- 保留你原有的
PROCESS_TEXTintent-filter配置 - 在目标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
相关产品推荐
相关产品推荐

