【问题标题】:Listen to Change of Phone State State - Android收听电话状态状态的变化 - Android
【发布时间】:2013-01-26 22:35:29
【问题描述】:

我目前正在尝试创建一个简单的应用程序,该应用程序会记录您通话的分钟数,然后在您接近空闲时间时向您发出警告。

此时,我创建了一个名为 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();
        }


}

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

    innerclass 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;
                }
            }
    
        }
    

    说明: 在通话期间,您的听众将经历以下状态,

    第一步:TelephonyManager.CALL_STATE_IDLE

    最初您的呼叫状态将处于空闲状态,这就是变量 callEnded 将具有值 false 的原因。

    第 2 步:TelephonyManager.CALL_STATE_RINGING

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

    第 3 步:TelephonyManager.CALL_STATE_OFFHOOK

    你挂断电话

    第四步:TelephonyManager.CALL_STATE_IDLE

    再次闲置

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

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多