서비스를 사용하여 캘플로 로그에서 마지막 전화를 받으십시오
-
23-12-2019 - |
문제
전화를 걸어 서버로 콜로그를 보내려면 다음과 같은 방법으로 전화 상태를 폴링하는 서비스를 만들었습니다. 이 방법을 OnCreate라고합니다.
private void pollForCallStatus() {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.d("Poll", Integer.toString(telephonyManager.getCallState()));
switch (telephonyManager.getCallState()){
case TelephonyManager.CALL_STATE_RINGING:
Log.d("CallService", "ringing");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callStart();
break;
case TelephonyManager.CALL_STATE_IDLE:
callEnd();
break;
}
}
}, 0, 1000);
}
.
메서드 콜 엔드, 통화가 시작되었는지 확인하고,이 케이스가 콜로그 의이 호출 기간을 가져 오는 경우, 발신 호출이 시작될 때 결정할 수 없기 때문에 calllog를 사용합니다.
private void callEnd() {
if (isStart) {
Log.d("CallService", "callEnd");
Integer duration = getDuration();
Log.d("CallService", duration.toString());
Command sender = new SendCall(this.phoneNumber, duration);
isStart = false;
this.stopSelf();
}
}
.
메소드 게시 쿼터리를 붙여 넣었습니다. Calllog에서 통화 기간을 가져 오기 위해 사용했습니다.
private Integer getDuration(){
Integer duration = 0;
callLogCursor.moveToFirst();
if ( phoneNumber.equalsIgnoreCase(callLogCursor.getString(callLogCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
duration = callLogCursor.getInt(callLogCursor.getColumnIndex(CallLog.Calls.DURATION));
return duration;
}
.
내 문제는 이전 호출을 받아 들일 때에도 불구하고 getduration이 마지막 전화 지속 시간을 가져 오지 않는다는 것입니다. 나는 더 많은 시간을 기다리려고했지만, 나는 같은 결과를 받는다.
--- 편집 ---
ContentBserver를 사용하도록 코드를 변경했지만 동일한 결과가 있습니다. BroadCastReceiver
에 관찰자를 만듭니다.public class CallsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
ContentResolver cr = context.getContentResolver();
Cursor callLogCursor = cr.query(android.provider.CallLog.Calls.CONTENT_URI,
null,
null,
null,
android.provider.CallLog.Calls.DEFAULT_SORT_ORDER /*sort by*/);
Command sender = new SendCall(phoneNumber, callLogCursor);
context.getContentResolver().
registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
true, new CallObserver(context, sender));
}
}
.
Calllog Change가 메소드 GetDuration을 실행하면 새 게재}은
입니다.private Integer getDuration(){
Integer duration = 0;
callCursor.moveToFirst();
if ( phoneNumber.equalsIgnoreCase(callCursor.getString(callCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
duration = callCursor.getInt(callCursor.getColumnIndex(CallLog.Calls.DURATION));
Log.d("SendCall.getDuration", duration.toString());
return duration;
}
.
및 마지막 통화 기간이 계속 되므로이 기간은 이전 호출입니다. 나는 그것을 할 수 있다는 것을 모른다.
해결책
Calllog I.E.에 대한 모든 것이 변경 될 때 알림을 통화하는 통화 로그에 ContentObserver를 추가합니다. 새 통화가 호출 로그에 추가되거나 통화 로그를 제거한 경우
편집
이 코드가 완료되면이 코드로 올바른 결과를 얻는 후 새 통화 로그 가져 오기
콜 마감 후 3-4 초 동안 기다린 다음
CursorLoader cursorLoader = new CursorLoader(mActivity,
CallLog.Calls.CONTENT_URI, null, null, null, null);
managedCursor = cursorLoader.loadInBackground();
int durationIndex = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
managedCursor.moveToFirst();
String duration =managedCursor.getString(duration)
. 제휴하지 않습니다 StackOverflow