Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将db中的呼叫日志数据更新到最新版本(java android)_Java_Android_Android Contacts_Greendao - Fatal编程技术网

如何将db中的呼叫日志数据更新到最新版本(java android)

如何将db中的呼叫日志数据更新到最新版本(java android),java,android,android-contacts,greendao,Java,Android,Android Contacts,Greendao,第1部分:当应用程序打开my MainActivity()时,获取所有调用日志并保存在DB中 第2部分:当应用程序关闭,用户拨打多个电话并接听多个电话时,我如何在db中更新它们 可能的解决办法: 解决方案1:每次应用程序打开时,删除所有通话记录并再次将所有通话记录保存在应用程序中 解决方案2:使用广播接收器,当通话结束时,在db中输入save record,即每次通话结束后都会被记录下来 当我使用解决方案2时,它工作正常,但当应用程序关闭时,它不会保存任何数据。它只在应用程序在后台运行时起作用

第1部分:当应用程序打开my MainActivity()时,获取所有调用日志并保存在DB中 第2部分:当应用程序关闭,用户拨打多个电话并接听多个电话时,我如何在db中更新它们

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

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

还有其他办法拯救他们吗??有什么有效的方法吗

下面是listining调用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;
        }
    }

}
@覆盖
公共void onReceive(上下文、意图){
TelephonyManager telephony=(TelephonyManager)context.getSystemService(context.telephony_SERVICE);//TelephonyManager对象
//检查侦听器是否已实例化
if(phoneStateListener==null){
phoneStateListener=新的MyPhoneStateListener();
电话.listen(phoneStateListener,phoneStateListener.listen\u CALL\u STATE);
Bundle=intent.getExtras();
String phoneNr=bundle.getString(“传入的_编号”);
Log.v(“检查人”,“电话号码:”+phoneNr);
mContext=上下文;
}
}
/*自定义PhoneStateListener*/
私有类MyPhoneStateListener扩展了PhoneStateListener{
@凌驾
public void onCallStateChanged(int状态,字符串incomingNumber){
if(incomingNumber!=null&&incomingNumber.length()>0)
进货编号=进货编号;
开关(状态){
case TelephonyManager.CALL_STATE_响铃:
日志d(“检查”、“呼叫状态”铃声);
上一个状态=状态;
打破
case TelephonyManager.CALL_STATE_OFFHOOK:
日志d(“检查者”、“呼叫状态”下钩);
上一个状态=状态;
打破
case TelephonyManager.CALL_STATE_IDLE:
列出通话记录详情;
新处理程序().postDelayed(PhoneStateBroadcastReceiver.this::saveLastCallLogInDb,200);
Log.d(“检查器”,“呼叫状态\u空闲==>”+传入\u号码);
if((prev_state==TelephonyManager.CALL_state_OFFHOOK)){
上一个状态=状态;
//接完的电话
Log.d(“检查者”,“回答结束==>”;
}
if((上一个状态==电话管理器.呼叫状态){
上一个状态=状态;
//拒绝或未接来电
日志d(“检查人”、“被拒绝或遗漏”);
}
打破
}
}
}

获取手机状态事件有两种方法:监听android.intent.action.phone\u state广播和使用
PhoneStateListener

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

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

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


获取手机状态事件有两种方法:监听android.intent.action.phone_state
广播和使用
PhoneStateListener

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

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

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


请发布您用于监听呼叫结束的代码events@marmor我已经编辑了问题并添加了代码。请发布您用于收听呼叫结束的代码events@marmor我已经编辑了问题并添加了代码。