gpt4 book ai didi

android - 监听电话状态的变化 - Android

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:22 25 4
gpt4 key购买 nike

我目前正在尝试创建一个简单的应用程序来记录您通话的分钟数,然后在您接近空闲时间时提醒您。

此时,我已经创建了一个名为 CallService.java 的服务,每当用户调用他人时都会调用该服务。该服务只是记录通话的开始时间和通话的结束时间。该服务使用名为 OutgoingCallReciever.Java 的类启动。此类只是等待用户调用某人,然后启动 CallService。

我现在正试图在用户电话未调用某人时停止 CallService。即(电话状态为空闲、摘机或其他人正在调用用户)但我不知道该怎么做(我是 Java/Android 的新手)。我是否使用 PhoneStateListener 的 onCallStateChanged 方法? (我不确定如何使用它..)

希望对您有所帮助!

类如下:

主 Activity .java

package com.fouadalnoor.callcounter;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.telephony.TelephonyManager;
import android.telephony.PhoneStateListener;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
PhoneStateListener ps =(PhoneStateListener) getSystemService(TELEPHONY_SERVICE);

Toast.makeText(this, "Phone State = " + tm.getCallState() , Toast.LENGTH_LONG).show();


CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if(isChecked){
stopService (new Intent(buttonView.getContext(),CallService.class));
}
}
});

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}

OutgoingCallReciever.java

package com.fouadalnoor.callcounter;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;


public class OutgoingCallReciever extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, CallService.class));
}

}

调用服务.java

package com.fouadalnoor.callcounter;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import java.lang.String;


public class CallService extends Service {

public long startTime,endTime, totalTime;

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onDestroy() {

Toast.makeText(this, "Call Service stopped", Toast.LENGTH_LONG).show();

endTime = System.currentTimeMillis()/1000;
Toast.makeText(this, "endTime = " + endTime, Toast.LENGTH_LONG).show();
totalTime = endTime-startTime;
Toast.makeText(this, "totalTime = " + totalTime , Toast.LENGTH_LONG).show();

}

@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "Call Service started by user.", Toast.LENGTH_LONG).show();

startTime = System.currentTimeMillis()/1000;
Toast.makeText(this, "startTime = "+ startTime, Toast.LENGTH_LONG).show();
}


}

最佳答案

是的,您需要使用 onCallStateChanged 方法。

将此行放入您的onCreate() 方法中,它将初始化TelephonyManager 的对象并为您设置监听器。

TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
ListenToPhoneState listener = new ListenToPhoneState()
tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);

内部类 ListenToPhoneState 的类定义如下所示,

    private class ListenToPhoneState extends PhoneStateListener {

boolean callEnded=false;
public void onCallStateChanged(int state, String incomingNumber) {

switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
UTILS.Log_e("State changed: " , state+"Idle");


if(callEnded)
{
//you will be here at **STEP 4**
//you should stop service again over here
}
else
{
//you will be here at **STEP 1**
//stop your service over here,
//i.e. stopService (new Intent(`your_context`,`CallService.class`));
//NOTE: `your_context` with appropriate context and `CallService.class` with appropriate class name of your service which you want to stop.

}


break;
case TelephonyManager.CALL_STATE_OFFHOOK:
UTILS.Log_e("State changed: " , state+"Offhook");
//you will be here at **STEP 3**
// you will be here when you cut call
callEnded=true;
break;
case TelephonyManager.CALL_STATE_RINGING:
UTILS.Log_e("State changed: " , state+"Ringing");
//you will be here at **STEP 2**

break;


default:
break;
}
}

}

解释:通话时,您的听众将经历以下状态,

第 1 步:TelephonyManager.CALL_STATE_IDLE

最初您的调用状态将是空闲的,这就是变量 callEnded 的值为 false 的原因。

第 2 步:TelephonyManager.CALL_STATE_RINGING

现在您正在等待接听电话的人接听您的电话

第 3 步:TelephonyManager.CALL_STATE_OFFHOOK

你挂断了电话

第 4 步:TelephonyManager.CALL_STATE_IDLE

再次闲置

注意:如果您不想知道通话何时结束以及通话结束后应该做什么,则只需删除 callEnded 变量并在任何时候停止服务您在 TelephonyManager.CALL_STATE_IDLE

block 中输入

希望对您有所帮助!!

关于android - 监听电话状态的变化 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14537403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com