使用broadcastReceiver检测android中的传入和传出调用

时间:2013-01-08 07:58:18

标签: android

我长期以来一直面临这个问题,无法解决以下问题。 我正在使用广播接收器来检测来电和去电详情。 现在调用持续时间的问题。对于来电,它显示正确的持续时间,但对于拨出电话,它显示错误的持续时间......

帮助我解决问题。提前感谢您将宝贵的时间花在我的问题上。

这是我的代码..

public class IncomingCallReceiver extends BroadcastReceiver {
// db instance variables
DBAdapter dba;

// instance variables of sharedpreferences
SharedPreferences mSharedPrefernce;
Editor e;

// String variables for number,date,time,calltype
String number, date, time, calltype;
long startTime, endTime;

@Override
public void onReceive(Context context, Intent intent) {
    Log.v("info", "calls info....");

    // initialising the sharedpreferences
    mSharedPrefernce = context.getSharedPreferences("MyPref", 0);
    e = mSharedPrefernce.edit();

    // Creating object for the DBAdapter
    dba = new DBAdapter(context);
    Bundle bundle = intent.getExtras();

    // Log.v("info", bundle.toString());
    if (bundle == null)
        return;

    // initialising the variables
    number = null;
    startTime = 0;
    endTime = 0;

    // getting incoming call details
    String state = bundle.getString(TelephonyManager.EXTRA_STATE);
    if ((state != null)
            && (state
                    .equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))) {

        Log.v("info", "Phone Ringing..");

        number = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Log.v("info", "Incomng Number: " + number);

        calltype = "Incoming";

        Time today = new Time(Time.getCurrentTimezone());
        today.setToNow();

        date = today.monthDay + "-" + (today.month + 1) + "-" + today.year;
        time = today.format("%k:%M:%S");

        // putting the values into the SharedPreferences
        e.putString("number", number);
        e.putString("Type", calltype);
        e.putString("date", date);
        e.putString("time", time);
        e.commit();

        Toast.makeText(
                context,
                "Detect Calls sample application\nIncoming number: "
                        + number, Toast.LENGTH_SHORT).show();

    }
    // getting outgoing call details
    else if (state == null) {
        number = bundle.getString(Intent.EXTRA_PHONE_NUMBER);
        Log.v("info", "Outgoing Number: " + number);

        calltype = "Outgoing";

        Time today = new Time(Time.getCurrentTimezone());
        today.setToNow();

        date = today.monthDay + "-" + (today.month + 1) + "-" + today.year;
        time = today.format("%k:%M:%S");

        // putting the values into the SharedPreferences
        e.putString("number", number);
        e.putString("Type", calltype);
        e.putString("date", date);
        e.putString("time", time);
        e.commit();

        Toast.makeText(
                context,
                "Detect Calls sample application\nOutgoing number: "
                        + number, Toast.LENGTH_SHORT).show();

    }
    // called when the call is answered
    else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
        Log.v("info", "Call Ansered..");

        startTime = System.currentTimeMillis();
        e.putLong("start", startTime);
        e.commit();

    } 
    // called when the call is ended
    else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
        Log.v("info", "Call Ended..");

        String phonenumber=null, type=null, date1=null, time1=null,  duration=null;

        // getting the values from the SharedPreferences
        phonenumber = mSharedPrefernce.getString("number", "");
        type = mSharedPrefernce.getString("Type", "");
        date1 = mSharedPrefernce.getString("date", "");
        time1 = mSharedPrefernce.getString("time", "");
        long start=0;
        start = mSharedPrefernce.getLong("start", 0);
        Log.v("info", "startTime=" + start);

        // clearing the SharedPreferences
        mSharedPrefernce.edit().clear();

        endTime = System.currentTimeMillis();
        Log.v("info", "endTime=" + endTime);
        long totalTime =0;
        totalTime = endTime - start;

        DateFormat df = new SimpleDateFormat("HH':'mm':'ss");
        df.setTimeZone(TimeZone.getTimeZone("GMT+0"));

        duration = df.format(new Date(totalTime));

        // inserting the call details into sqlite db
        dba.insertDetails(phonenumber, date1, time1, duration, type);


    }

}
     }

我还在清单文件中添加了这样的权限..

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

3 个答案:

答案 0 :(得分:1)

无论是双人卡还是单人卡,这都会为您提供来电号码:

Bundle bundle = intent.getExtras();
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if (state != null){
    callFromSecondSimNo = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
}

答案 1 :(得分:0)

显示错误的持续时间,因为拨打号码后状态将变为OFF_HOOk。但实际上它不应该。一旦另一方的用户接听了您的电话,它就会变为OFF_HOOk。

不幸的是,设备不会为Android中的拨出呼叫启用振铃状态。它直接切换到OFF_Hook !!

答案 2 :(得分:0)

此代码可在Android 4或5 Android Sdk上使用:-  您将从以下行中获得订阅ID:-whichSIM = intent.getExtras()。getInt(“ subscription”);

标题

如果(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP){             捆绑包bundle = intent.getExtras();

        if (bundle != null) {
            Set<String> keys = bundle.keySet();
            Iterator<String> it = keys.iterator();
            while (it.hasNext()) {
                String key = it.next();
                Log.e("BUNDEL-VALUE","[" + key + "=" + bundle.get(key)+"]");
            }
        }
        if (intent.getExtras().containsKey("subscription")) {
            whichSIM = intent.getExtras().getInt("subscription");
            HelperFunctions.theLogger("WhichSim", "before value: " + whichSIM);
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putLong("ChooseSim", whichSIM);
            editor.commit();
        }
    }

    //Working code For 4.4 Phones KitKat
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        whichSIM = intent.getExtras().getInt("subscription");
        if (whichSIM == 0) {
            whichSIM = 1;
            editor.putLong("ChooseSim", whichSIM);
            editor.commit();
            // Incoming call for SIM1
            // Toast.makeText(context,"Getting Sim Id  "+whichSIM,Toast.LENGTH_LONG).show();
        } else if (whichSIM == 1) {
            whichSIM = 2;
            editor.putLong("ChooseSim", whichSIM);
            editor.commit();
            // Toast.makeText(context,"Getting Sim Id  "+whichSIM,Toast.LENGTH_LONG).show();

        }
    }
  1. 列表项