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

Androidアプリ開発 電話機能偏

受信に自動応答する

Auto-Answering an Incoming Call

バックグラウンドで電話の状態をモニタする
電話の状態がidle、ringing、offhookのどれかを調査し、
どのようにモニタするかを示しました。
その他使い勝手の良い動作としては、電話が鳴った時に、
自動で電話に応答することでしょうか。
例えば、ユーザが忙しい(運転中など)
電話に自動的に応答することをユーザが許すアプリケーションを
開発者が書きたいことがあるかもしれません。
(大抵は一定の電話番号にだけ許すだけでも)
プログラムに従った形で受信に応答するには、
書くアプリケーションに付けられたBluetoothヘッドセットと
デバイスを単純に評価する必要があります。
受信が確認されたときには、ユーザがBluetoothヘッドセットの
ボタンを押したのと同じようにIntentオブジェクトを
無効にします。
まず受信を見つけるために、BroadcastReceiverクラスが
電話の状態をモニタするために必要になります。
(これはバックグラウンドで電話の状態をモニタする
紹介しています。)
以下のようにIncomingCallReceiverクラスが
BroadcastReceiverクラスのサブクラスであることを示します。

package net.learn2develop.autocalls;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;

public class IncomingCallReceiver extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent){
   if(!intent.getAction().equals(
      "android.intent.action.PHONE_STATE)) return;
   String extraState =
      intent.getStringExtra(TelephonyManager.EXTRA_STATE);

   if(extraState.equals(TelephonyManager.EXTRA_INCOMING_RINGING)){
     String incomingNumber =
      intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

     if(incomingNumber.contentEquals("123456")){
      //---answer the call---
      Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
      i.putExtra(Intent.EXTRA_KEY_EVENT,
          new KeyEvent(KeyEvent.ACTION_UP,
          KeyEvent.KEYCODE_HEADSETHOOK));
      context.sendOrderedBroadcast(i, null);
     }
    }
    return;
   }
  };

電話の状態が変化したのが見つかったときには、
まずEXTRA_STATE定数を使って電話の状態がringingかどうかを
チェックして、
EXTRA_INCOMING_NUMBER定数を使って受信電話番号を取得します。
この情報を使ってアプリケーションが自動的に
電話に出るべきかどうかを判断します。
ACTION_MEDIA_BUTTONアクションと共にIntentオブジェクトを使って行い、
追加のKeyEventオブジェクトにIntentオブジェクトを渡します。
コードにセットした電話番号を元に
電話が受信に対し自動的に応答できる様にします。
電話状態の変化をモニタするためには、
READ_PHONE_STATEパーミッションをAndroidManifest.xmlファイルに
加える必要があります。
BroadcastReceiverクラスを宣言する必要もあります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="ner.learn2develop.autocalls"
  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>

   <receiver android:name=".IncomingCallReceiver" >
    <intent-filter>
     <action android:name="android.intent.action.PHONE_STATE) />
    </intent-filter>
   </receiver>

  </application>
</manifest>

プログラムに従う形で受信に応答できる一方、
同じアプローチを使って電話を終了させることはできません。
以下のようなコード部を使ってプログラム的に受信を拒否することに
使えると考えるかもしれません。

//---hang up the call---
//---the following code needs CALL_PRIVILEGED permission,
//which is not available to third-party apps
//hence won't work---
Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
i.putExtra(Intent.EXTRA_KEY_EVENT,
     new KeyEvent(KeyEvent.ACTION_DOWN,
     KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(i,"android.permission.CALL_PRIVILEGED");

しかし、上のコードではうまく動きません。
CALL_PRIVILEGEDパーミッションが必要になるように、
が、たとえAndroidManifest.xmlファイルにこのパーミッションを
加えたとしても、まだうまく動かないでしょう。
CALL_PRIVILEGEDパーミッションはシステム上のみ利用可能で、
サードパーティのアプリでは利用できないものになっています。

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