ContentProviderを使用してVoiceMailを保存する


Android4.0(以降ICS)から、VoiceMail専用のContentProviderが用意されました。

開発者はこのContentProviderを使用してデータを保存することで、VoiceMailのデータ(音声や付加情報)を他のアプリケーションと共有することができます。

詳細は以下から。

パーミッションを設定する

VoiceMailを保存する場合はAndroidManifest.xmlにcom.android.voicemail.permission.ADD_VOICEMAILを設定する必要があります。

VoicemailContract.Voicemailsを使用してデータを作成する

VoiceMailを保存するにはVoicemailContract.Voicemailsクラスの以下の定数を使用して、保存するデータを指定します。

定数名概要
DATE送信された時間を指定します
DURATIONVoiceMailの状態を保存する
HAS_CONTENT再生可能なデータが入っているかどうかをboolean型で指定します
IS_READ既読かどうかをboolean型で設定します
MIME_TYPEVoiceMailの保存形式を指定します
NUMBER ※1送信者の番号を指定します
SOURCE_DATA不明(データが保存されているサーバーの何かを保存するようですが、Googleのサンプルでもnullになっていました)
SOURCE_PACKAGE ※2VoiceMailを保存したアプリケーションのパッケージ名を指定します

※1は必須ではありませんが、このデータがない情報を保存すると二度と電話アプリが立ち上がらなくなります。

※2は必須です。

SOURCE_DATAはデータの実体が入っているサーバーを指定するようなのですが、SIMが挿入されているICS搭載実機でGoogleのサンプルを実行してみて確認後、追記します。

具体的には以下のサンプルのようにContentValues#putメソッドを使用して実装します。

このサンプルコードは実行されるとVoiceMailを保存して、保存先のUriを表示します。

VoiceMailSampleActivity.java

public class VoiceMailSampleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	ContentValues values = new ContentValues();
	values.clear();
	// 送信時間の設定(ここでは仮に現在時刻を設定)
	values.put(VoicemailContract.Voicemails.DATE, Calendar.getInstance()
		.getTimeInMillis());

	// VoiceMailの再生時間を設定
	values.put(VoicemailContract.Voicemails.DURATION, 1000);

	// 既読かどうか
	values.put(VoicemailContract.Voicemails.IS_READ, false);

	// MYME TYPEの設定
	values.put(VoicemailContract.Voicemails.MIME_TYPE, "audio/mpeg");

	// 送信者の電話番号
	values.put(VoicemailContract.Voicemails.NUMBER, "09012345678");

	// VoiceMailのデータ本体
	values.put(VoicemailContract.Voicemails.SOURCE_DATA, "");

	// VoiceMailを保存したアプリのパッケージ名
	values.put(VoicemailContract.Voicemails.SOURCE_PACKAGE,
		getPackageName());

	// VoiceMailの保存
	Uri dataSetUri = getContentResolver().insert(
		VoicemailContract.Voicemails.buildSourceUri(getPackageName()),
		values);

	TextView tv = (TextView) findViewById(R.id.text);
	tv.setText(dataSetUri.toString());
    }
}

33~35行目でVoicemailContract.Voicemails.buildSourceUriメソッドを使用して、書き込み先のUriを取得して、VoiceMailを保存しています。

このメソッドで指定するパッケージ名はVoicemailContract.Voicemails.SOURCE_PACKAGEで指定したパッケージ名と同じものである必要があります。

VoiceMailの保存に成功すると、冒頭の画像のように、発着信履歴に保存したVoiceMailの内容が表示されるようになります。