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


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

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

詳細は以下から。

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

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

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

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

[table “133” not found /]

※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の内容が表示されるようになります。

関連する記事: