4

我正在构建一个呼叫转移应用程序,并已使用 **21*xxxxxx# ussd 代码通过 ACTION_CALL Intent 激活呼叫转移。但是我还没有找到检查呼叫转移是否处于活动状态的解决方案。

如果呼叫转移处于活动状态,是否有任何解决方案可以从 android 系统检查?

4

4 回答 4

6
 TelephonyManager manager = (TelephonyManager)    
 this.getSystemService(TELEPHONY_SERVICE);     
 manager.listen(new MyPhoneStateListener(), 
 PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR ); 

 class MyPhoneStateListener extends PhoneStateListener{  

  @Override
    public void onCallForwardingIndicatorChanged(boolean cfi) {
      Log.i(TAG,"onCallForwardingIndicatorChanged  CFI ="+cfi);

         preferences.edit().putBoolean("CALL_FORWARD_ACTIVE", cfi).commit();
        super.onCallForwardingIndicatorChanged(cfi);
    }

}

如果 cfi 返回 true 表示设置呼叫转发成功

于 2013-07-01T08:55:17.820 回答
2

注意事项: 以下答案是建议。我没有亲自尝试过,所以您最好尝试一下以检查结果。

从您的 gsm 号码中,您可以通过拨打 *#21# 检查您的呼叫转移选项。因此,您可以尝试从应用程序中拨打此号码并阅读 ussd 响应。

第 1 部分:拨打号码

Intent intentCallForward = new Intent(Intent.ACTION_CALL);                               
Uri uri = Uri.fromParts("tel", "*#21#", "#"); 
intentCallForward.setData(uri);                                
startActivity(intentCallForward);

第 2 部分:阅读 ussd 响应

没有 API 可以做到这一点。但是this SO answer中,它建议了一些您可以尝试的方法。

祝你好运

于 2013-03-21T06:02:02.670 回答
2

你可以让 Brodcast 类注册它,你可以像

public class CallBroadcastReceiver extends BroadcastReceiver
{
    public static String numberToCall;
    public void onReceive(Context context, Intent intent) {
        Log.d("CallRecorder", "CallBroadcastReceiver::onReceive got Intent: " + intent.toString());
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            numberToCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            Log.d("CallRecorder", "CallBroadcastReceiver intent has EXTRA_PHONE_NUMBER: " + numberToCall);
        }

    }
}
于 2013-03-21T06:05:49.073 回答
0

是的,您可以使用 *#21# 以与使用 **21*xxxxxx# 激活 CF 相同的方式检查 CF。顺便说一句,这些是 MMI 代码,而不是 USSD 代码。

于 2013-08-16T02:12:20.853 回答