首页 > 解决方案 > 我如何更新数据库中的通话记录数据最新(java android)

问题描述

第 1 部分:当应用程序打开时,我的 MainActivity() 获取所有通话记录并保存在 DB 第 2 部分:当应用程序关闭并且用户拨打多个电话并收到多个电话时,我如何在 db 中更新它们。

可能的解决方案: 解决方案1:每次打开应用程序时删除所有通话记录并再次将所有通话记录保存在应用程序中。

解决方案2:使用广播接收器,当通话结束时,在数据库中输入保存记录,即当我使用解决方案2时,每次通话都会被记录下来,但当应用程序关闭时,它不会保存任何数据。它仅在应用程序在后台运行时有效。

有没有其他方法可以拯救它们??有什么有效的方法吗?

这是列表调用结束的代码

@Override
public void onReceive(Context context, Intent intent) {
    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object
    //check if listener has already been instantiated
    if(phoneStateListener == null) {
        phoneStateListener = new MyPhoneStateListener();
        telephony.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

        Bundle bundle = intent.getExtras();
        String phoneNr = bundle.getString("incoming_number");
        Log.v("checker", "phoneNr: " + phoneNr);
        mContext = context;
    }
}

/* Custom PhoneStateListener */
private class MyPhoneStateListener extends PhoneStateListener {


    @Override
    public void onCallStateChanged(int state, String incomingNumber) {

        if (incomingNumber != null && incomingNumber.length() > 0)
            incoming_number = incomingNumber;

        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                Log.d("checker", "CALL_STATE_RINGING");
                prev_state = state;
                break;

            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d("checker", "CALL_STATE_OFFHOOK");
                prev_state = state;
                break;

            case TelephonyManager.CALL_STATE_IDLE:
                List<CallModelTable> callLogDetails;
                new Handler().postDelayed(PhoneStateBroadcastReceiver.this::saveLastCallLogInDb, 200);

                Log.d("checker", "CALL_STATE_IDLE==>" + incoming_number);

                if ((prev_state == TelephonyManager.CALL_STATE_OFFHOOK)) {
                    prev_state = state;
                    //Answered Call which is ended
                    Log.d("checker", "answered ended==>");

                }
                if ((prev_state == TelephonyManager.CALL_STATE_RINGING)) {
                    prev_state = state;
                    //Rejected or Missed call
                    Log.d("checker", "rejected or missed: ");
                }
                break;
        }
    }

}

标签: javaandroidandroid-contactsgreendao

解决方案


有两种方法可以获取电话状态事件:监听android.intent.action.PHONE_STATE广播和使用PhoneStateListener.

第二种方法仅在应用程序处于活动状态时才有效,并且侦听器将在应用程序移动到后台后不久被销毁。

对于第一种方法,您只需要在清单中注册一个广播接收器,如下所示:

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

然后在 BroadcastReceiver 类中处理事件,不需要注册任何添加的监听器。

在此处查看教程:https ://medium.com/@saishaddai/how-to-know-when-a-device-is-ringing-in-android-57e516d0ab42


推荐阅读