ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 電話機能偏

電話の状態をモニタリング

Monitoring the State of the Phone

Androidデバイス上の電話は、通常3つの状態の内の1つになります。
●アイドル状態(idle)
デバイスが送受話をしていない状態。
●受信状態(ringing)
電話が鳴っている状態。
●受話状態(off hook)
ユーザが電話に出ている状態。
この電話の状態をモニタリングする能力は、
開発者に興味深いアプリケーションを書けるようにしてくれます。
例えばもし、運転中に電話がなったとしたら、
電話をかけてきた人にSMSメッセージを送り、
今忙しくて、電話に出られないことを通知するようにしたいでしょう。
ここでは電話の状態をどのようにモニタリングするのかを示します。
電話の状態が変化したのをモニタするには、
PhoneStateListener基底クラスを拡張したクラスを
作る必要があります。

package net.learn2develop.phone;

import android.content.Context;
import android.telephoney.PhoneStateListener;
import android.telephoney.TelephonyManager;
import android.widget.Toast;

public class PhoneReceiver extends PhoneStateListener{
  Context context;
  public PhoneReceiver(Context context){
   this.context = context;
  }

  @Override
  public void onCallStateChanged(int state,
    String incomingNumber){
   super.onCallStateChanged(state, incomingNumber);

   Toast.makeText(context, "onCallStateChanged state" +
     state + "incomingNumber=" L incomingNumber,
     Toast.LENGTH_LONG).show();

   switch(state){
   case TelephonyManager.CALL_STATE_IDLE:
     Toast.makeText(context, "idle", Toast.LENGTH_LONG).show();
     break;
   case TelephonyManager.CALL_STATE_RINGING:
     Toast.makeText(context, "ringing", Toast.LENGTH_LONG).show();
     break;
   case TelephonyManager.CALL_STATE_OFFHOOK:
     Toast.makeText(context, "offhook", Toast.LENGTH_LONG).show();
     break;
   }
  }
}


Context引数をとるこのクラスのためのコンストラクタです。
onCallStateChanged()メソッドを無効にすることで、
結果、電話が鳴る・ユーザが電話に出る・通話が終わるなど
電話の状態が変わったときに、この変化を処理することができます。
上にあるコードの例では、
単純にメッセージを表示するために、Toastクラスを使っています。
さらに重要なのは、発信者の電話番号を取得できること。
おそらく、SMSメッセージ送るためなどですが。
電話の状態の変化のお知らせをさせるためには、
開発者はまずTelephonyManagerクラスとPhoneReceiverクラスの
インスタンスを作る必要があります。

package net.learn2develop.phone;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;

public class MainActivity extends Activity{
  TelephonyManager manager;
  PhoneReceiver myPhoneStateListener;

  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   myPhoneStateListener = new PhoneReceiver(this);
   manager = ((TelephonyManager) getSystemService(Context,
             TELEPHONY_SERVICE));
  }
}

onResume()メソッドでは、TelephonyManagerクラスの
listen()メソッドを使って変化に傾聴し始められます。
PhoneReceiverクラスのインスタンスと同じように、
LISTEN_CALL_STATE定数にlisten()メソッドを渡します。

import android.telephony.PhoneStateListener;
....

  @Override
  public void onResume(){
   super.onResume();
   manager.listen(myPhoneStateListener,
       PhoneStateListener.LISTEN_CALL_STATE);
   }

onPause()メソッドでは、開発者が同じlisten()メソッドと
LISTEN_NONE定数を使ってリスナーを削除することができます。

@Override
public void onPause(){
  super.onPause();
  manager.listen(myPhoneStateListener,PhoneStateListener.LISTEN_NONE);
}

最後に、AndroidManifest.xmlファイルにREAD_PHONE_STATE許可を
加える必要があります。

<uses-permission
  android:name="android.permission.READ_PHONE_STATE" />

ちょっと注釈

アクティビティをバックグラウンドに送ったときには、
onPause()イベントにあるlistenerを未登録にしておきます。
その他、アクティビティがフォアグラウンドに返ってきたときには、
アクティビティはサイドlistenerを登録します。
もし、登録したら、onCallStateChangedが何度が呼び出されます。


ホーム
便利堂ロゴ
inserted by FC2 system