我如何更新数据库中的通话记录数据(java android)

Posted

技术标签:

【中文标题】我如何更新数据库中的通话记录数据(java android)【英文标题】:How do i update call log data in db upto date (java android) 【发布时间】:2021-01-12 19:42:07 【问题描述】:

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

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

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

还有其他方法可以保存吗??有什么有效的方法吗?

这里是listing调用end的代码

@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;
        
    


【问题讨论】:

请贴出您用于监听通话结束事件的代码 @marmor 我已经编辑了问题并添加了代码。 【参考方案1】:

有两种方法可以获取电话状态事件:监听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

【讨论】:

以上是关于我如何更新数据库中的通话记录数据(java android)的主要内容,如果未能解决你的问题,请参考以下文章

如何读取和删除通话记录中的消息?

在java中以多线程方式插入或更新数据库中的多条记录

如何遍历 spark 数据集并更新 Java 中的列值?

如何从 Android 系统获取回调到应用程序?

删除短信和通话记录权限后无法更新 APK [重复]

如何解决有关“使用短信或通话记录权限组”的谷歌播放警告