我目前正在尝试创建一个简单的应用程序,该应用程序会记录您通话的时间,然后在您接近空闲时间时向您发出警告。
在这一点上,我创建了一个名为 CallService.java 的服务,每当用户呼叫人员时都会调用该服务。该服务只是记录通话的开始时间和通话的结束时间。该服务是使用名为 OutgoingCallReciever.Java 的类启动的。此类只是等待用户呼叫某人,然后启动 CallService。
我现在试图在用户电话未呼叫某人时停止 CallService。即(电话状态为空闲、摘机或其他人正在呼叫用户)但我不知道该怎么做(我是 Java/Android 新手)。我是否使用 PhoneStateListener 的 onCallStateChanged 方法?(我不确定如何使用它..)
希望你能帮上忙!
课程如下:
主活动.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;
}
}
Run Code Online (Sandbox Code Playgroud)
呼出呼叫接收器.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));
}
}
Run Code Online (Sandbox Code Playgroud)
调用服务程序
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();
}
}
Run Code Online (Sandbox Code Playgroud)
是的,你需要使用 onCallStateChanged方法。
将此行放在您的onCreate()方法中,它将初始化对象TelephonyManager并为您设置侦听器。
TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
ListenToPhoneState listener = new ListenToPhoneState()
tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
Run Code Online (Sandbox Code Playgroud)
内部类的类定义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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
说明: 在通话过程中,您的听众将经历以下状态,
第 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
我希望它会有所帮助!!
| 归档时间: |
|
| 查看次数: |
6886 次 |
| 最近记录: |