2013-04-15 12 views
8

Witam chcę zarejestrować przychodzący numer do bazy danych. Używam odbiornika transmisji do słuchania rozmów telefonicznych i korzystania z detektora stanu telefonu. tutaj jest mój kodDetektor stanu zadzwonił wiele razy

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> 

w ThePhoneStateListener onCallStateChanged() dlaczego jest nazywany wiele razy . Chcę wstawić numer przychodzący do bazy danych tylko jeden raz.

+0

co jest stosowanie callactionlistener – stinepike

Odpowiedz

28

Jakoś to rozwiązałem. Problem polega na tym, że kiedy kiedykolwiek wywołano funkcję onReceive() mojego odbiornika, za każdym razem, gdy próbowałem słuchać nowego PhoneStateListener. Wystarczy zrobić to raz. podobnie jak następujące po

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 rozwiązany. Pozdrowienia

+1

doskonałym rozwiązaniem z tej statycznej zmiennej użytkowania. –

+0

Dzięki! Działa świetnie! –

3

Dziękuję za rozwiązanie, ale zadziałało, gdy zaimplementowałem obiekt singleton mojej klasy PhoneStateListener. onReceive w moim 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); 
    } 
} 

i jest to metoda w klasie PhoneStateListener:

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

    return callStateInstance; 
} 

nadzieję, że będzie użyteczny dla kogoś.

0

Ja po prostu utworzyć zmienną statyczną i sprawdź

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 = "..."; 
     } 
    } 
Powiązane problemy