5

在一个应用程序中,我在 textview 中显示了一些电话号码,用户可以点击它们来拨打它们(在 textview 上autoLink设置为phone)。
当我点击号码时,会显示拨打该号码的选项。
我的问题是:有没有办法确定用户是否实际按下拨号盘中的拨号按钮来实际拨打电话?

4

3 回答 3

1

您可以创建一个 GSMBroadcastListener 并接收有关电话呼叫状态的事件(挂断、振铃、已建立等)。

如果您想知道,如果它发生在单击您的电话按钮之后,只需在单击事件中创建此侦听器,这样只有单击您的一个按钮时它才会接收事件。通话结束后在 Hangup-Event 中取消挂钩(取消注册),因此通话结束后不会收到事件。

这是我使用在生产应用程序中正常工作的侦听器接口的实现:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>

代码:

public interface GSMBroadcastListener {
    void onHangUp(
    void onEstablished();
    void onRinging();
}


public class GSMBroadcastReceiver extends BroadcastReceiver {

    private static GSMBroadcastListener handler = null;
    private static PrivateListener privateListener = null;

    public static void registerGSMBroadcastListener(@Nullable GSMBroadcastListener listener) {
        handler = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (privateListener == null) {
            privateListener = new PrivateListener();
            TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            telephonyManager.listen(privateListener, PhoneStateListener.LISTEN_CALL_STATE);
        }

    }

    private class PrivateListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);

            Log.i("PHONE_STATE", String.format("GSM event \"onCallStateChanged\" received: state=%d; incomingNumber=\"%s\";", state, incomingNumber));
            if (handler != null) {
                if (state == TelephonyManager.CALL_STATE_IDLE) {
                    Log.i("PHONE_STATE", "Forwarding event as \"GSM onHangUp\".");
                    handler.onHangUp();
                } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    Log.i("PHONE_STATE", "Forwarding event as \"GSM onEstablished\".");
                    handler.onEstablished();
                } else if (state == TelephonyManager.CALL_STATE_RINGING) {
                    Log.i("PHONE_STATE", "Forwarding event as \"GSM onRinging\".");
                    handler.onRinging();
                }
            }
        }
    }

}

此类将 GSM 事件转发到您添加的侦听器GSMBroadcastReceiver.registerGSMBroadcastListener

要使用它,您需要:

  • 将接收器注册到您的manifest

    <receiver android:name=".handlers.GSMBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"/>
        </intent-filter>
    </receiver>
    
  • 然后,在您的电话号码按钮的点击监听器中,注册一个监听器:(注意,您在 onHangUp() 回调中取消注册它!)

    GSMBroadcastReceiver.registerGSMBroadcastListener(new GSMBroadcastListener() {
    @Override
    public void onRinging() {
        Log.i("GSM", "GSM event \"onRinging\" received.");
    }
    
    @Override
    public void onEstablished() {
        Log.i("GSM", "GSM event \"onEstablished\" received.");
    }
    
    @Override
    public void onHangUp() {
        Log.i("GSM", "GSM event \"onHangUp\" received.");
        GSMBroadcastReceiver.registerGSMBroadcastListener(null); // Unregister the handler!
    }
    });
    

而已!单击按钮后,您现在应该会收到有关 GSM 活动的通知。

希望这会有所帮助,干杯,格里斯

于 2017-05-31T12:53:12.333 回答
0

如果拨号盘打开或未打开,您可以收听事件如果拨号盘未打开,那么您可以从应用程序中说出它......或者其他方式相同。或者您可以通过从您的代码中拨打号码来调用 Web 服务 API。根据响应,您可以从您的应用程序中检测到它,而不是实际上从拨号盘中检测到,反之亦然。

于 2017-05-31T12:09:18.090 回答
-1
public class Outgoing_Call_Receiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {


        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            if(intent.getExtras().getString("android.intent.extra.PHONE_NUMBER").equals(new MyApp(context).getEmergencyNumber()));

        }
    }

}

试试这个代码。它会帮助你。

于 2017-05-31T13:06:34.977 回答