我希望在断开呼叫后获取已拨电话的电话详情(手机号码,通话时长,日期,时间等)。
到目前为止我做了什么:
我创建了一个广播接收器来检测呼叫断开事件。获取呼叫详细信息后,我从呼叫日志中获取最新拨打的号码并存储在SQLite
数据库中。
问题是什么:
当我从设备拨打任何号码并断开连接时,onReceive()
方法被叫了两次。相同的记录被插入两次。我也通过打印日志来检查它。
我在Google上搜索了这个问题并获得了一些像"仅使用sendBroadcast()
一次,只注册一次广播接收器等#34;。但是我没有在任何地方调用sendBroadcast()
,也没有在两次注册。
我是Android新手所以请说明我做错了什么?
广播接收器:
public class CallReceiver extends BroadcastReceiver {
ContentResolver contentResolver;
Context context;
boolean is_network_roaming = false;
TelephonyManager tm = null;
AppInfo appInfo = null;
ContactHelper contactHelper;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String TAG = getClass().getSimpleName();
this.context = context;
tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
appInfo = new AppInfo(context);
contactHelper = new ContactHelper(context);
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
is_network_roaming = tm.isNetworkRoaming();
/* Method for getting call details from call log */
getAllCallLogs();
}
}
清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.callduration"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.callduration.Splash"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="adjustPan|adjustResize|stateHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.callduration.MainActivity" >
</activity>
<activity android:name="com.callduration.CallHistory" >
</activity>
<receiver android:name="com.callduration.receivers.CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
</application>
</manifest>
答案 0 :(得分:0)
拨打电话时状态更改的顺序为:
CALL_STATE_OFFHOOK ---&gt; ACTION_NEW_OUTGOING_CALL - &gt; ... {来电回答与否 回答} .........--&GT; CALL_STATE_OFFHOOK - &GT; CALL_STATE_IDLE
根据上述状态,你的onReceive应该启动两次,一次是在启动呼叫时,第二次是在呼叫断开时。为了实现您的需要,您需要记录单个呼叫会话的事件。您可以使用以下代码
int state=intent.getStringExtra(TelephonyManager.EXTRA_STATE)
Boolean singlecallstate=false;
switch (state) {
case TelephonyManager.ACTION_NEW_OUTGOING_CALL:
singlecallstate=true;
//any other code you want
case TelephonyManager.CALL_STATE_IDLE:
if(singlecallstate){
getAllCallLogs();
singlecallstate=false;
}