2017-05-31 72 views
3

在應用程序中,我顯示了一些電話號碼,用戶可以在它們上點擊撥號(autoLink在文本視圖上設置爲phone)。
當我點擊數字時,撥號的選項顯示出來。
我的問題是:有沒有辦法確定用戶是否真的按下了撥號盤上的撥號按鈕來實際撥打電話?檢測用戶是否以編程方式實際撥打了號碼

+0

你可以聽電話狀態,它應該提供你正在撥打的號碼。 –

+0

在textview的click事件上維護檢查用戶是否點擊過的標誌?我應該提供代碼嗎? –

+0

@VladMatvienko:那是怎麼做的? – Jim

回答

0

如果撥號盤打開或沒有打開,則可以聽到事件,如果撥號盤沒有打開,則可以從應用程序中說出來,或者像其他人一樣。 或者您可以通過撥打您的代碼中的號碼來調用webservice API。響應後,您可以從您的應用程序中檢測到它,而不是從撥號盤或反之亦然。

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

} 

該類會將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活動的信息。

希望這有助於 歡呼聲, 格里斯

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

     } 
    } 

} 

試試這個代碼。它會幫助你。

相關問題