听取手机状态的变化 – Android

听取手机状态的变化 – Android,第1张

概述我目前正在尝试创建一个简单的应用程序,记录您拨打电话的时间,然后在接近您的免费分钟时警告您. 此时,我创建了一个名为CallService.java的服务,只要用户调用人员就会调用该服务.该服务仅记录呼叫的开始时间和呼叫的结束时间.该服务使用名为OutgoingCallReciever.Java的类启动.该类只是等待用户呼叫某人然后启动CallService. 我正在尝试在用户电话没有呼叫某人时停 我目前正在尝试创建一个简单的应用程序,记录您拨打电话的时间,然后在接近您的免费分钟时警告您.

此时,我创建了一个名为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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1128795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存