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

如何实现用户在手机拨号盘输入号码时通过Broadcast Receivers接收通知?

能否通过Broadcast Receivers监听拨号盘输入并接收通知

是的,但Android版本差异会直接影响实现方式——系统在高版本中收紧了隐私权限限制:

1. Android 10(API 29)及以下版本

可以通过监听ACTION_NEW_OUTGOING_CALL广播实现:

  • 先在Manifest中注册广播接收器并声明权限:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

<receiver android:name=".DialerInputReceiver">
    <intent-filter>
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    </intent-filter>
</receiver>
  • 实现广播接收器类,在onReceive中获取并判断拨号号码:
public class DialerInputReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) {
            String dialedNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            // 匹配目标号码(如"531")
            if ("531".equals(dialedNumber)) {
                // 触发通知或自定义操作
                Toast.makeText(context, "检测到输入号码531", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

2. Android 10(API 29)及以上版本

ACTION_NEW_OUTGOING_CALL广播不再对第三方应用开放,此时无法通过Broadcast Receiver实现监听,必须改用AccessibilityService:

  • 创建AccessibilityService子类,重写onAccessibilityEvent监听输入事件:
public class DialerAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) {
            AccessibilityNodeInfo source = event.getSource();
            // 针对系统拨号应用做适配(不同厂商包名可能有差异)
            if (source != null && "com.android.dialer".equals(source.getPackageName())) {
                String inputText = source.getText().toString();
                if ("531".equals(inputText)) {
                    // 发送通知
                    NotificationManager notificationManager = 
                        (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                    Notification notification = new NotificationCompat.Builder(this, "DIALER_CHANNEL")
                        .setContentTitle("拨号盘输入检测")
                        .setContentText("检测到输入号码531")
                        .setSmallIcon(R.drawable.ic_notify)
                        .build();
                    notificationManager.notify(1, notification);
                }
            }
        }
    }

    @Override
    public void onInterrupt() {}
}
  • 在Manifest中注册服务:
<service android:name=".DialerAccessibilityService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_config" />
</service>
  • 创建res/xml/accessibility_config.xml配置文件:
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewTextChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true"
    android:packageNames="com.android.dialer" />
  • 注意:用户必须手动在系统「辅助功能」设置中启用该服务,应用才能获取拨号盘输入事件。

核心注意事项

  • 高版本系统隐私管控严格,广播方案已被废弃,辅助服务是当前唯一可行路径;
  • 涉及通话相关操作时,需额外申请READ_CALL_LOG权限并引导用户授权;
  • 不同厂商拨号应用的控件结构可能不同,AccessibilityService需要针对性适配。

内容的提问来源于stack exchange,提问作者Nadeem Aslam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:15:56