4

私は現在、通話に費やした時間を記録し、空き時間に近づいたときに警告する簡単なアプリを作成しようとしています。

この時点で、ユーザーが人に電話をかけるたびに呼び出される 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();
        }


}
4

1 に答える 1

6

はい、メソッドを使用する必要があります 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;
            }
        }

    }

説明: 通話中、リスナーは次の状態になりますが、

ステップ1TelephonyManager.CALL_STATE_IDLE

最初は呼び出し状態がアイドル状態になるため、変数callEndedの値はになりますfalse

ステップ2TelephonyManager.CALL_STATE_RINGING

今、あなたは受信者があなたの電話を受けるのを待っています

ステップ3TelephonyManager.CALL_STATE_OFFHOOK

あなたは電話を切る

ステップ4TelephonyManager.CALL_STATE_IDLE

再びアイドル

注:通話がいつ終了するか、通話終了後に何をすべきかを知りたくない場合は、callEnded変数を削除して、次のブロックに入るたびにサービスを停止してください。TelephonyManager.CALL_STATE_IDLE

お役に立てば幸いです!!

于 2013-01-26T14:35:29.580 に答える