マツリさんの日記

androidプログラミング初心者の奮闘日記です。たまに統計学もしてます。

PhoneStateListenerの作成 02

 毎度、小出しにしていますが、PhoneStateListenerの続きです。

 前回の実装では、バックグラウンド時にはToastが表示されないという点で未完成でした。

 そこで、今回は他のサイトのBroadcastReceiver、IntentFilterを参考にして、バックグランドでも通話状態を捕捉するように実装しなおしました。

MainActivity.java

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class MainActivity extends AppCompatActivity {

// 各フィールドの設定
PhoneReceiver phoneStateListener;
TelephonyManager manager;

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

// PhoneReceiverインスタンスの生成
phoneStateListener = new PhoneReceiver(this);
// TelephonyManagerインスタンスの生成(Context.TELEPHONY_SERVICEを指定)
manager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE));
}

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

PhoneReceiver.java

import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.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);

switch (state) {
// 着信時の処理内容
case TelephonyManager.CALL_STATE_RINGING:
Toast.makeText(context, "着信中!!" + incomingNumber, Toast.LENGTH_LONG).show();
break;
// 通話時の処理内容
case TelephonyManager.CALL_STATE_OFFHOOK:
Toast.makeText(context, "通話中!!" + incomingNumber, Toast.LENGTH_LONG).show();
break;
}
}
}

PhoneStateReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneStateReceiver extends BroadcastReceiver {
// 各フィールドの定義
TelephonyManager manager;
PhoneReceiver phoneStateListener;
static boolean listener = false;

// intent情報を処理する
@Override
public void onReceive(Context context, Intent intent) {
// PhoneReceiverインスタンスの生成
phoneStateListener = new PhoneReceiver(context);
// TelephonyManagerインスタンスの生成
manager =((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE));

if(!listener) {
manager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
listener = true;
}
}
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ma2ri.telephonecontrol">

<!-- 電話番号、通話の状態などの端末情報を取得するためのパーミッション -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name="com.example.ma2ri.telephonecontrol.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 着信などを制御するBroadcastReceiver -->
<receiver android:name=".PhoneStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>

</application>

</manifest>

 ここで、前回のマニフェストに登場したBroadcastReceiverがやっと日の目を見ました。

 BroadcastReceiverを実装することで、以前ではアプリの起動時しか通話状態の変化に対応できなかったものが、バックグラウンド時でも対応できるようになったという訳でございます。

 次は、Toast表示を別の物に変更するということと、電話帳へのアクセスあたりをやりたいと思います。