2009-12-05 6 views
42

Ich möchte den eingehenden Anruf der Telefonnummer abgerufen werden und wie das tun in http://blog.whitepages.com/2009/02/27/caller-id-by-whitepages-a-new-android-app-that-puts-telemarketers-on-alert/in Android abrufen Telefonnummer des eingehenden Anrufs

mit ihm etwas tun Könnten Sie mir bitte helfen, weil ich keine Informationen darüber finden können. Wo fange ich an und woher bekomme ich die Telefonnummer?


Ok, im Moment sieht mein Code wie folgt aus. Wenn ich den Anruf erstelle, fängt der CustomBroadcastReceiver ihn ab und die Protokollnachricht wird ausgedruckt. Ich kann die Telefonnummer aus dem Bündel abrufen. Aber! Ich kann den CustomPhoneStateListener nicht funktionieren lassen. Wie Sie sehen können, habe ich meinen customPhoneState-Listener beim Empfänger registriert, aber die Log-Nachricht wird nie aus der CustomPhoneStateListener-Klasse ausgedruckt. Was vermisse ich hier? Ist mein Denken richtig?


<receiver android:name=".CustomBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
</receiver> 

</application> 
<uses-sdk android:minSdkVersion="5" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

public class CustomPhoneStateListener extends PhoneStateListener { 

private static final String TAG = "CustomPhoneStateListener"; 

public void onCallStateChange(int state, String incomingNumber){ 

    Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!"); 
    Log.v(TAG, incomingNumber); 

    switch(state){ 
     case TelephonyManager.CALL_STATE_RINGING: 
      Log.d(TAG, "RINGING"); 
      break; 
    } 
} 

public class CustomBroadcastReceiver extends BroadcastReceiver { 

private static final String TAG = "CustomBroadcastReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.v(TAG, "WE ARE INSIDE!!!!!!!!!!!"); 
    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
    CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); 

    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 


    Bundle bundle = intent.getExtras(); 
    String phoneNr= bundle.getString("incoming_number"); 
    Log.v(TAG, "phoneNr: "+phoneNr); 

} 

Antwort

25

Verwendung PhoneStateListener. Es hat einen onCallStateChanged Handler; Eines der mitgelieferten Argumente ist ein String mit der eingehenden Telefonnummer.

+0

Können Sie ein Beispiel-Implementierung zur Verfügung stellen bitte? – jakob

+0

Meine Antwort für diese Frage kann helfen [link] (http://stackoverflow.com/questions/10136490/androidget-phone-number-of-present-incoming-and-outgoing-call/11182720#11182720) – Gary

5

Ihre überschriebene Methode in CustomPhoneStateListener sollte onCallStateChanged() heißen (und nicht onCallStateChange()).

Dies wäre vom Java-Compiler entdeckt worden, wenn Sie die @Override Annotation gehabt hätten, wie Sie für onReceive() haben.

+0

Sie sind die Mann! Vielen Dank! Ich habe noch eine Frage zu stellen und das ist, wie füge ich Sachen zu der eingehenden Anrufansicht hinzu? – jakob

+1

Ich bin mir nicht sicher über die Besonderheiten dieses einen. Ihr Tippfehler war einfacher :) Allerdings, ich denke, was Sie suchen, ist ein Toast. Aber es wird wahrscheinlich nicht auf dem Bildschirm für eingehende Anrufe angezeigt, es sei denn, Ihr Code ist ein Dienst (und keine Aktivität). Aber wie gesagt, ich bin noch nicht so weit in der Android-Entwicklung gekommen. http://developer.android.com/guide/topics/ui/notifiers/toasts.html – mikeplate

+0

Ok cool, danke! – jakob

9

Hier ist eine Implementierung, mit der Sie die Telefonnummer abrufen können, wenn es sich um einen eingehenden Anruf handelt als incomingNumber und auch wenn der Anruf FERTIG ist - beachten Sie den Handler() Code.

private class PhoneCallListener extends PhoneStateListener { 

    private boolean isPhoneCalling = false; 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     if (TelephonyManager.CALL_STATE_RINGING == state) { 
      // phone ringing 
      Log.i(LOG_TAG, "RINGING, number: " + incomingNumber); 
     } 

     if (TelephonyManager.CALL_STATE_OFFHOOK == state) { 
      // active 
      Log.i(LOG_TAG, "OFFHOOK"); 

      isPhoneCalling = true; 
     } 

     if (TelephonyManager.CALL_STATE_IDLE == state) { 
      // run when class initial and phone call ended, need detect flag 
      // from CALL_STATE_OFFHOOK 
      Log.i(LOG_TAG, "IDLE number"); 

      if (isPhoneCalling) { 

       Handler handler = new Handler(); 

       //Put in delay because call log is not updated immediately when state changed 
       // The dialler takes a little bit of time to write to it 500ms seems to be enough 
       handler.postDelayed(new Runnable() { 

        @Override 
        public void run() { 
         // get start of cursor 
          Log.i("CallLogDetailsActivity", "Getting Log activity..."); 
          String[] projection = new String[]{Calls.NUMBER}; 
          Cursor cur = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, Calls.DATE +" desc"); 
          cur.moveToFirst(); 
          String lastCallnumber = cur.getString(0); 
        } 
       },500); 

       isPhoneCalling = false; 
      } 

     } 
    } 
} 

Und dann fügen und den Hörer in Ihrem onCreate oder onStartCommand Code initialisiert:

PhoneCallListener phoneListener = new PhoneCallListener(); 
    TelephonyManager telephonyManager = (TelephonyManager) this 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(phoneListener, 
      PhoneStateListener.LISTEN_CALL_STATE);