此时,我创建了一个名为CallService.java的服务,只要用户调用人员就会调用该服务.该服务仅记录呼叫的开始时间和呼叫的结束时间.该服务使用名为OutgoingcallrecIEver.Java的类启动.该类只是等待用户呼叫某人然后启动CallService.
我正在尝试在用户电话没有呼叫某人时停止CallService.即(手机状态闲置,摘机或其他人正在呼叫用户)但我不知道该怎么做(我是Java / Android的新手).我是否使用PhonestateListener的onCallStateChanged方法? (我不确定如何使用它..)
希望你能帮忙!
课程如下:
MainActivity.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)); }}
CallService.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块时停止服务
我希望它会有所帮助!!
总结以上是内存溢出为你收集整理的听取手机状态的变化 – Android全部内容,希望文章能够帮你解决听取手机状态的变化 – Android所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)