检测用户是否通过程序拨打了号码

5

我在一个应用程序中展示了一些电话号码,用户可以点击它们拨打电话(autoLink在textview上设置为phone)。
当我点击这些数字时,拨打该号码的选项会出现。
我的问题是:有没有办法确定用户是否实际按下了拨号键才进行通话?


你可以监听手机状态,并且它应该为你提供当前正在拨打的号码。 - Vladyslav Matviienko
在TextView的点击事件中,维护一个标志以检查用户是否已经点击。我需要提供代码吗? - Pratik Vyas
@VladMatvienko:这怎么做? - Jim
请查看@Grisgram的答案。 - Vladyslav Matviienko
3个回答

1
您可以创建一个GSMBroadcastListener并接收有关电话呼叫状态的事件(挂断、响铃、已建立等)。
如果您想知道它是在单击电话按钮后发生的,只需在单击事件中创建此侦听器,这样它将仅在单击其中一个按钮时接收事件。 在通话结束后的挂机事件中取消挂钩(注销),这样就不会在通话结束后接收事件。
这是我的实现,使用了一个监听器接口,在生产应用程序中运行良好。
<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();
                }
            }
        }
    }

}

回复内容存在敏感词^**$roadcastListener添加的监听器。

使用它,你需要这个:

  • Register the receiver in your manifest

    <receiver android:name=".handlers.GSMBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"/>
        </intent-filter>
    </receiver>
    
  • Then, in the click listener of your phone number button, register a listener: (Note, that you unregister it in the onHangUp() callback!)

    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活动的情况。

希望这可以帮助您, 干杯, Gris


0

如果拨号键盘已打开或未打开,您都可以监听事件。如果拨号键盘未打开,则可以说它来自应用程序...或者以同样的方式处理其他情况。或者,您可以通过从代码拨打号码来调用Web服务API。在响应后,您可以检测它是来自您的应用程序,而不是实际来自拨号键盘,反之亦然。


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

        }
    }

}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接