ContentProviderを使用してVoiceMailを保存する
|Android4.0(以降ICS)から、VoiceMail専用のContentProviderが用意されました。
開発者はこのContentProviderを使用してデータを保存することで、VoiceMailのデータ(音声や付加情報)を他のアプリケーションと共有することができます。
詳細は以下から。
パーミッションを設定する
VoiceMailを保存する場合はAndroidManifest.xmlにcom.android.voicemail.permission.ADD_VOICEMAILを設定する必要があります。
VoicemailContract.Voicemailsを使用してデータを作成する
VoiceMailを保存するにはVoicemailContract.Voicemailsクラスの以下の定数を使用して、保存するデータを指定します。
定数名 | 概要 |
---|---|
DATE | 送信された時間を指定します |
DURATION | VoiceMailの状態を保存する |
HAS_CONTENT | 再生可能なデータが入っているかどうかをboolean型で指定します |
IS_READ | 既読かどうかをboolean型で設定します |
MIME_TYPE | VoiceMailの保存形式を指定します |
NUMBER ※1 | 送信者の番号を指定します |
SOURCE_DATA | 不明(データが保存されているサーバーの何かを保存するようですが、Googleのサンプルでもnullになっていました) |
SOURCE_PACKAGE ※2 | VoiceMailを保存したアプリケーションのパッケージ名を指定します |
※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の内容が表示されるようになります。