2013-04-15 19 views
8

Hallo Ich möchte die eingehende Nummer in der Datenbank protokollieren. Ich verwende Broadcast-Empfänger, um auf Telefonanrufe zu hören und Telefonstatus-Listener zu verwenden. hier ist mein CodeTelefonstatus Listener mehrmals aufgerufen

ThePhoneStateListener.java

package com.example.netlogger.Receiver; 
import android.content.Context; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class ThePhoneStateListener extends PhoneStateListener { 
    Context context; 
    public ThePhoneStateListener(Context context) { 
     this.context = context; 
    } 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 
     if (state == TelephonyManager.CALL_STATE_OFFHOOK) { 
      Log.d("TAGG", "Insert: " + incomingNumber); 
     } 

    } 
} 

CallActionReceiver.java

package com.example.netlogger.Receiver; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.Toast; 

public class CallActionsReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     TelephonyManager manager = (TelephonyManager) arg0 
       .getSystemService(arg0.TELEPHONY_SERVICE); 
     manager.listen(new ThePhoneStateListener(arg0), 
       android.telephony.PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 

Menifest.xml

<receiver android:name="com.example.netlogger.Receiver.CallActionsReceiver"> 
    <intent-filter android:priority="2147483647"> 
     <action android:name="android.intent.action.PHONE_STATE"/> 
    </intent-filter> 
    <intent-filter android:priority="2147483647"> 
     <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 
    </intent-filter> 
</receiver> 

in ThePhoneStateListener onCallStateChanged(), warum es mehrmals aufgerufen wird . Ich möchte die eingehende Nummer nur einmal in die Datenbank einfügen.

+0

, was die Verwendung von callactionlistener – stinepike

Antwort

28

Einige wie, löste ich es. Das Problem ist, dass, wann auch immer der Empfänger meines Broadcast-Receivers onReceive() aufgerufen wurde, jedes Mal, wenn ich versuchte, einen neuen PhoneStateListener zu hören. Sie müssen es nur einmal tun. genau wie folgend

package com.example.netlogger.Receiver; 

import java.util.Date; 

import com.example.netlogger.util.LocalDatabase; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.preference.PreferenceManager; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.Toast; 

public class CallActionsReceiver extends BroadcastReceiver { 
    static ThePhoneStateListener phoneStateListener; 



    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     TelephonyManager manager = (TelephonyManager) arg0 
       .getSystemService(arg0.TELEPHONY_SERVICE);  
     if (phoneStateListener == null) { 
      phoneStateListener = new ThePhoneStateListener(arg0); 
      manager.listen(phoneStateListener, 
        android.telephony.PhoneStateListener.LISTEN_CALL_STATE); 
     } 


    } 

} 

Problem gelöst. Prost

+1

Große Lösung mit dieser statischen Variablen verwendet wird. –

+0

Danke! Funktioniert super! –

3

Vielen Dank für Ihre Lösung, aber es funktionierte für mich, als ich Singleton Objekt meiner PhoneStateListener Klasse implementiert. onReceive in meinem BroadcastReceiver:

@Override 
public void onReceive(final Context context, Intent intent) { 
    telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
    if (phoneListener == null) { 
     phoneListener = CallStateListener.getCallStateInstance(context);CallStateListener(context); 
     telephony.listen(phoneListener, android.telephony.PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 

und das ist Methode in meiner PhoneStateListener Klasse:

public static CallStateListener getCallStateInstance(Context ctx) { 
    if (callStateInstance == null) 
     callStateInstance = new CallStateListener(ctx); 

    return callStateInstance; 
} 

hoffen, dass es für jemanden nützlich sein wird.

0

Ich bin einfach statische Variable erstellen und prüfen

public class IncomingCallReceiver extends BroadcastReceiver 
{ 
    private static String canEndCall; 

    @Override 
    public void onReceive(final Context context, Intent intent) 
    { 
     if (canEndCall == null) 
     { 
      TelephonyManager tmgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
      tmgr.listen(new PhoneStateListener() 
      { 
       @Override 
       public void onCallStateChanged(int state, String incomingNumber) 
       { 

       } 
      }, PhoneStateListener.LISTEN_CALL_STATE); 
      canEndCall = "..."; 
     } 
    } 
Verwandte Themen