检测用户是否以编程方式实际拨打了号码

时间:2017-05-31 11:55:03

标签: android android-intent android-phone-call

在应用中,我在文字视图中显示了一些电话号码,用户可以点按这些电话号码进行拨号(autoLink在文本视图中设置为phone。) 当我点击数字时,会显示拨打该号码的选项 我的问题是:有没有办法弄清楚用户是否按下拨号盘中的拨号键实际进行通话?

3 个答案:

答案 0 :(得分:1)

您可以创建GSMBroadcastListener并接收有关电话呼叫状态的事件(Hangup,Ringing,Established等)。

如果您想知道,如果它是在点击您的手机按钮后发生的,只需在点击事件中创建此侦听器,这样只有在您单击其中一个按钮时它才会收到事件。 在通话结束后取消挂起(取消注册)挂断事件,因此在通话结束后不会收到事件。

这是我的一个监听器接口实现,它在生产应用程序中运行良好:

<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活动。

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

答案 1 :(得分:0)

如果拨号盘未打开,你可以听到事件,如果拨号盘没有打开,那么你可以从应用程序中说出来......或者像其他人一样。 或者您可以通过拨打代码中的号码来呼叫Web服务API。在响应时,您可以从您的应用程序中检测到它实际上不是来自拨号盘或反之亦然。

答案 2 :(得分:0)

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()));

        }
    }

}

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