diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.java b/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.java index 5a8dfd4b..64754fb0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.java +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/PhoneStateReceiver.java @@ -41,12 +41,23 @@ public class PhoneStateReceiver extends BroadcastReceiver { int state = mTelephonyManager.getCallState(); Log.d(TAG, "来电信息:state=" + state + " phoneNumber = " + phoneNumber); switch (state) { + //包括响铃、第三方来电等待 case TelephonyManager.CALL_STATE_RINGING: + break; + //空闲态(没有通话活动) + case TelephonyManager.CALL_STATE_IDLE: if (!TextUtils.isEmpty(phoneNumber)) { - sendReceiveCallMsg(context, phoneNumber); + try { + //必须休眠才能获取来电记录 + Thread.sleep(1000); + + sendReceiveCallMsg(context, phoneNumber); + } catch (InterruptedException e) { + e.printStackTrace(); + } } break; - case TelephonyManager.CALL_STATE_IDLE: + //包括dialing拨号中、active接通、hold挂起等 case TelephonyManager.CALL_STATE_OFFHOOK: break; } @@ -56,36 +67,34 @@ public class PhoneStateReceiver extends BroadcastReceiver { } private void sendReceiveCallMsg(Context context, String phoneNumber) { - int simId = 0; - String name = ""; - String simInfo = ""; //获取后一条通话记录 - CallInfo callInfo = PhoneUtils.getLastCallInfo(); - if (callInfo != null) { - Log.d(TAG, callInfo.toString()); + CallInfo callInfo = PhoneUtils.getLastCallInfo(phoneNumber); + if (callInfo == null) return; - simId = SimUtil.getSimIdBySubscriptionId(callInfo.getSubscriptionId()); - //自定义备注优先 - simInfo = simId == 2 ? SettingUtil.getAddExtraSim2() : SettingUtil.getAddExtraSim1(); - if (!simInfo.isEmpty()) { - simInfo = "SIM" + simId + "_" + simInfo; - } else { - simInfo = SimUtil.getSimInfo(simId); - } + if (callInfo.getType() != 3) { + Log.d(TAG, "非未接来电不处理!"); + return; + } - name = callInfo.getName(); + String name = callInfo.getName(); + int simId = SimUtil.getSimIdBySubscriptionId(callInfo.getSubscriptionId()); + String simInfo = simId == 2 ? SettingUtil.getAddExtraSim2() : SettingUtil.getAddExtraSim1(); //自定义备注优先 + if (!simInfo.isEmpty()) { + simInfo = "SIM" + simId + "_" + simInfo; } else { + simInfo = SimUtil.getSimInfo(simId); + } + + if (TextUtils.isEmpty(name)) { List contacts = ContactHelper.getInstance().getContactByNumber(context, phoneNumber); if (contacts != null && contacts.size() > 0) { PhoneBookEntity phoneBookEntity = contacts.get(0); name = phoneBookEntity.getName(); } + if (TextUtils.isEmpty(name)) name = context.getString(R.string.unknown_number); } - if (TextUtils.isEmpty(name)) { - name = context.getString(R.string.unknown_number); - } SmsVo smsVo = new SmsVo(phoneNumber, name + context.getString(R.string.calling), new Date(), simInfo); Log.d(TAG, "send_msg" + smsVo.toString()); SendUtil.send_msg(context, smsVo, simId, "call"); diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java index 15c92f11..e777d8ce 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java @@ -533,29 +533,42 @@ public class PhoneUtils { /** * 获取后一条通话记录 */ - public static CallInfo getLastCallInfo() { + public static CallInfo getLastCallInfo(String phoneNumber) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) { return null; } - String[] columns = {CallLog.Calls.CACHED_NAME// 通话记录的联系人 - , CallLog.Calls.NUMBER// 通话记录的电话号码 - , CallLog.Calls.DATE// 通话记录的日期 - , CallLog.Calls.DURATION// 通话时长 - , CallLog.Calls.TYPE// 通话类型 - , CallLog.Calls.PHONE_ACCOUNT_ID - }; - - @SuppressLint("Recycle") Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + " DESC"); - while (cursor.moveToNext()) { - return new CallInfo( - cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)), //姓名 - cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)), //号码 - cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)), //获取通话日期 - cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION)),//获取通话时长,值为多少秒 - cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)), //获取通话类型:1.呼入2.呼出3.未接 - cursor.getInt(cursor.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID)) - ); + try { + String[] columns = {CallLog.Calls.CACHED_NAME// 通话记录的联系人 + , CallLog.Calls.NUMBER// 通话记录的电话号码 + , CallLog.Calls.DATE// 通话记录的日期 + , CallLog.Calls.DURATION// 通话时长 + , CallLog.Calls.TYPE// 通话类型 + , CallLog.Calls.PHONE_ACCOUNT_ID + }; + + CallInfo callInfo; + Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, + CallLog.Calls.NUMBER + " like ?", + new String[]{phoneNumber + "%"}, CallLog.Calls.DEFAULT_SORT_ORDER); + Log.i(TAG, "cursor count:" + cursor.getCount()); + + //noinspection LoopStatementThatDoesntLoop + while (cursor.moveToNext()) { + callInfo = new CallInfo( + cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)), //姓名 + cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)), //号码 + cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)), //获取通话日期 + cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION)),//获取通话时长,值为多少秒 + cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)), //获取通话类型:1.呼入2.呼出3.未接 + cursor.getInt(cursor.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID)) + ); + Log.d(TAG, callInfo.toString()); + cursor.close(); + return callInfo; + } + } catch (Exception e) { + Log.e(TAG, "getLastCallInfo:", e); } return null;