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

Androidアプリ開発 電話機能偏

電話の状態をバックグラウンドでモニタリング

Monitoring Phone State in the BackGround

電話の状態をモニタリングで、
PhoneStateListenerクラスを使って電話の状態を
どのようにモニタリングするかを示しました。
もし、アプリケーションが走っていなかったら、
電話の状態の変化を捕らえることができなくなります。
そのため、良い方法としては、AndroidManifest.xmlファイルに
BroadcastReceiverオブジェクトを宣言します。
これで、アプリケーションがデバイスにインストールされている間、
たとえアプリケーションが実際に走っていなくても、
電話の状態をモニタすることができるようになります。
アプリケーションが電話の状態の変化を
確実にモニタし続けられる様にするためには、
BroadcastReceiver基底クラスを拡張したクラスを作る必要があります。
このクラスの中で、
PhoneStateListenerクラスを実行する内部クラスを作ります。
(PhoneStateListenerクラスの詳細は
    電話の状態をモニタリングで)
BroadcastReceiverクラスのonreceive()クラスを再定義することで、
PhoneStateListenerクラスのインスタンスを使って、
電話の状態変化をモニタするためにTelephonyManagerクラスの
listen()メソッドを呼び出すことができます。
開発者はlistenerを一度だけ登録し、それ以上登録しないように
する必要があります。
以下は概要になりますが、どのようにコードが進むかを示します。

package net.learn2develop.phone;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneSt6ateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class PhoneStateReceiver extends BoardcastReceiver{
  TelephonyManager manager;
  phoneReceiver myPhoneStateListener;
  static boolean alreadyListening = false;

  @Override
  public void onReceive(Context context, Intent intent){
   myPhoneStateListener = new PhoneReceiver(context);
   manager = ((TelephonyManager) context.getSystemService
           Context.TELEPHONY_SERVICE));

   //---do not add the listener more than once---
   if (!alreadyListening){
    manager.listen(myPhoneStateListener,
        PhoneStateListener.LISTEN_CALL_DTATE);
    alreadyListening = true;
   }
  }

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

   @Override
   public void onCallStateChanged(int state, String incommingNumber){
    super.onCallStateChanged(state, incomingNumber);
    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: " + incomingNumber,
        Toast.LENGTH_LONG).show();
        break;
     case TelephonyManager.CALL_STATE_OFFHOOK:
      Toast.makeText(context, "Offhook", Toast.LENGTH_LONG).show();
      break;
     }
    }
   }
  }

AndroidManifest.xmlファイルでは<receiver>要素を
加える必要があり、結果、電話の状態変化をモニタできるようになります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package ="net.learn2develop.phone"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
   android:minSdkVersion="8"
   android:targetSdkVersion="15" />

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


  <application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <activity
    android:name="MainActivity"
    android:label="@string/title_activity_main" >
    <intent-filter>
     <action android:name="android.intent.action.MAIN />

     <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
   </activity>

   <!--put this here so that even if the app is not running,
   your app can be woken up if there is a change in phone state-->
   <receiver android:name=".PhoneStateReceiver">
    <intentfilater>
     <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
   <receiver>

  </application>
<manifest>

<receiver>要素を加えるとしてもこれだけのことで、
アクティビティのlistenerの登録を開発者がする必要はありません。
一度アプリケーションがデバイスにインストールされたら、
BroadcastReceiverは自動的に電話の状態の変更があったときには
いつでも動きを止めます。

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