マツリさんの日記

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

PhoneStateListenerの作成 03

 前回PhoneStateListenerをつかって、着信状態に応じてToast表示する方法を実装しました。

 今回はMainActivity.javaは省略して、PhoneReceiver.javaをこのように実装しなおしました。

 

 PhoneReceiver.java

import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.telephony.PhoneNumberUtils;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class PhoneReceiver extends PhoneStateListener {
private Context context;
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:

Cursor addressTable = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if (addressTable != null) {
while (addressTable.moveToNext()) {
String phoneNumber = addressTable.getString(addressTable.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (PhoneNumberUtils.compare(phoneNumber, incomingNumber)) {
Toast.makeText(context, "OK!" + incomingNumber, Toast.LENGTH_LONG).show();
}
}
addressTable.close();
}
break;

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

 実は更新をしていなかった間に、色々変更に変更を重ねて、このかたちになりました。

 当初、ContentResolverを用いて、データを抽出する作業をしていましたが、問題はデータの保存でして。

 SQLite、realmで保存方法を試行錯誤しましたが、どうしても納得できるかたちにできず。

 最終的に、Stack Overflowを参考にすると、PhoneNumberUtilsという便利なAPIを見つけることができました。

 日本語の解説がほぼなかったので、見つけるのに難儀しました。