2013-04-15 34 views
8

hi i muốn đăng nhập số điện thoại đến cơ sở dữ liệu. tôi đang sử dụng bộ thu phát sóng để nghe các cuộc gọi điện thoại và sử dụng trình nghe trạng thái điện thoại. đây là mã của tôiTrình nghe trạng thái điện thoại được gọi nhiều lần

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> 

trong ThePhoneStateListener onCallStateChanged() tại sao nó được gọi là nhiều lần . tôi muốn chèn số đầu vào vào cơ sở dữ liệu chỉ một lần.

+0

là những gì sử dụng callactionlistener – stinepike

Trả lời

28

Một số cách, tôi đã giải quyết. vấn đề là khi bao giờ phát sóng của tôi nhận onReceive() đã được gọi, mỗi khi tôi đã cố gắng để nghe một PhoneStateListener mới.Bạn chỉ cần làm điều đó một lần. giống như sau

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


    } 

} 

Sự cố được giải quyết. Chúc mừng

+1

giải pháp lớn với việc sử dụng biến tĩnh này. –

+0

Cảm ơn! Hoạt động tuyệt vời! –

3

Cảm ơn giải pháp của bạn, nhưng nó đã hiệu quả đối với tôi khi tôi triển khai đối tượng đơn lẻ của lớp PhoneStateListener. onReceive trong BroadcastReceiver tôi:

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

và đây là phương thức trong lớp PhoneStateListener tôi:

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

    return callStateInstance; 
} 

hy vọng nó sẽ có ích cho ai đó.

0

Tôi chỉ cần tạo biến tĩnh và kiểm tra

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 = "..."; 
     } 
    } 
Các vấn đề liên quan