We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
否(No)
无法判断呼叫转移来电,号码比较多,带几个手机又不方便,所以会设置一下呼叫转接,转到某个号码上。有类型判断的话就能知道这个电话是来自哪个号码的。
内容来自 AI 不知道可不可行
AI
在Android开发中,要判断来电是否为呼叫转接(Call Forwarding)过来的,可以通过监听系统广播并解析来电的附加信息。以下是具体实现步骤:
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <!-- 可选,用于读取通话记录 --> <application> <receiver android:name=".CallStateReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiver> </application>
public class CallStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { // 判断是否为呼叫转接 boolean isForwarded = isCallForwarded(intent); if (isForwarded) { Log.d("CallState", "转接来电: " + incomingNumber); } } } } // 核心方法:判断是否为转接来电 private boolean isCallForwarded(Intent intent) { Bundle extras = intent.getExtras(); if (extras == null) return false; // 方法1:通过通话记录类型判断(需要READ_CALL_LOG权限) Cursor cursor = context.getContentResolver().query( CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.TYPE}, CallLog.Calls.NUMBER + " = ?", new String[]{incomingNumber}, CallLog.Calls.DATE + " DESC LIMIT 1" ); if (cursor != null && cursor.moveToFirst()) { int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); if (type == CallLog.Calls.FORWARDED_CALL_TYPE) { cursor.close(); return true; } cursor.close(); } // 方法2:通过系统隐藏字段(非官方API,部分设备可能支持) if (extras.containsKey("forwarded_call")) { return extras.getBoolean("forwarded_call", false); } return false; } }
关键点说明 权限要求: READ_PHONE_STATE :监听电话状态。 READ_CALL_LOG (可选):读取通话记录中的呼叫类型。 方法1(推荐) : 通过查询最近一条通话记录的类型是否为 CallLog.Calls.FORWARDED_CALL_TYPE (值通常为 7 )。此方法需要动态申请 READ_CALL_LOG 权限。 方法2(非官方) : 某些设备(如三星、华为)可能在广播Intent的 extras 中携带 forwarded_call 字段,但此方法不具备普适性。
兼容性注意事项 系统限制: Android 10+ 对后台访问通话记录有严格限制,需确保应用在前台运行。 部分国产ROM可能阉割了相关API。 替代方案: 如果无法直接判断,可通过分析来电号码的通话记录(例如:短时间内连续来电可能为转接)。
扩展思路 结合运营商信息(如通过 TelephonyManager.getNetworkOperatorName() )判断是否支持呼叫转接。 使用 PhoneStateListener 实时监听电话状态变化。
The text was updated successfully, but these errors were encountered:
pppscn
No branches or pull requests
是否有人曾提过类似的问题?
否(No)
你觉得APP有什么不足之处?
无法判断呼叫转移来电,号码比较多,带几个手机又不方便,所以会设置一下呼叫转接,转到某个号码上。有类型判断的话就能知道这个电话是来自哪个号码的。
你觉得该怎么去完善会比较好?【非必答】
在Android开发中,要判断来电是否为呼叫转接(Call Forwarding)过来的,可以通过监听系统广播并解析来电的附加信息。以下是具体实现步骤:
在 AndroidManifest.xml 中声明权限和广播接收器:
在 CallStateReceiver.java 中处理来电状态:
关键点说明
权限要求:
READ_PHONE_STATE :监听电话状态。
READ_CALL_LOG (可选):读取通话记录中的呼叫类型。
方法1(推荐) :
通过查询最近一条通话记录的类型是否为 CallLog.Calls.FORWARDED_CALL_TYPE (值通常为 7 )。此方法需要动态申请 READ_CALL_LOG 权限。
方法2(非官方) :
某些设备(如三星、华为)可能在广播Intent的 extras 中携带 forwarded_call 字段,但此方法不具备普适性。
兼容性注意事项
系统限制:
Android 10+ 对后台访问通话记录有严格限制,需确保应用在前台运行。
部分国产ROM可能阉割了相关API。
替代方案:
如果无法直接判断,可通过分析来电号码的通话记录(例如:短时间内连续来电可能为转接)。
扩展思路
结合运营商信息(如通过 TelephonyManager.getNetworkOperatorName() )判断是否支持呼叫转接。
使用 PhoneStateListener 实时监听电话状态变化。
The text was updated successfully, but these errors were encountered: