Androidでの電話のかけ方 - JPDialer

 T-Mobile G1が到着したので、勉強をかねて、DialerAndroid対応版を作ってみることにした。なお、標準の電話アプリケーションと名前がぶつかるのを避けるため、Android版ではJPDialerという名前を使うことにした。
 特定の電話番号に電話をかけるためには、Intent.ACTION_DIALまたはIntent.ACTION_CALLと電話番号を指定してstartActivity()を呼び出す。後者はユーザー操作なしにダイヤルが始まるので、CALL_PHONEというパーミッションをあらかじめ追加設定しておく必要がある。基本的には、次のようなコードになる。

String phoneNumber = ...;
Uri uri = Uri.fromParts("tel", phoneNumber, null);
Intent callIntent = new Intent(Intent.ACTION_CALL, uri);
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(callIntent);

 電話帳のリストからユーザー操作で通話先を選ぶには、Contacts.Phones.CONTENT_ITEM_TYPEをMIMEタイプに指定したIntent.ACTION_GET_CONTENTをstartActivity()メソッドで呼び出す。次のようなコードになる。

Intent lookupIntent = new Intent(Intent.ACTION_GET_CONTENT);
lookupIntent.setType(Contacts.Phones.CONTENT_ITEM_TYPE);
startActivityForResult(lookupIntent, 0);

 ユーザーが電話番号を選ぶとonActivityResult()コールバックが呼ばれるので、dataパラメータに格納されたURIを使って電話帳データベースから電話番号を取り出す。直接 "tel:" スキームの電話番号を渡してくれればアプリケーションからデータベースにアクセスする必要がない*1のだが、実際に渡されるのは "content:" スキームのURIである。このURIから、次のようなコードで電話番号をデータベースから取り出すことができる。なお、電話帳にアクセスすることになるので、READ_CONTACTSのパーミッションを追加設定しておかなければならない。

Uri uri = data.getData();
Cursor cursor = managedQuery(uri, null, null, null, null);
cursor.moveToFirst();
String phoneNumber = cursor.getString(cursor.getColumnIndex(Contacts.PhonesColumns.NUMBER));


 上記のような電話機能へのアクセスが、T-Mobile G1でも可能なことを確認した。

*1:Android開発者は、アプリケーションが主体的に電話帳にアクセスすることと電話帳から電話番号だけが渡されることの、セキュリティ面での違いを重要視しなかったようだ。