【问题标题】:Detect if the user actually dialed a number programmatically检测用户是否真的以编程方式拨打了一个号码
【发布时间】:2017-05-31 11:55:02
【问题描述】:

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

【问题讨论】:

  • 您可以监听电话状态,它应该为您提供当前正在拨打的号码。
  • 在 textview 的点击事件上维护用于检查用户是否点击的标志?我应该提供代码吗?
  • @VladMatvienko:这是怎么做到的?
  • 查看@Grisgram 的答案。

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


【解决方案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 活动的通知。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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()));
      
              }
          }
      
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多