こんにちは。kimukimuです。
前回は見事にAndroid仮想マシンで動作しない機能を引き当ててしまったので、
今回は冷静に動く機能を下調べしてきました!
#尚、SipはAndroid仮想マシンでは動作しませんでした。ええ。試してみましたとも。
てなわけで、今回紹介する新機能は「Content Provider」です。
1. Content Providerって?
Content Providerとは何かというと、
『アプリの持つデータベースを外部のアプリから直接操作することが出来る機能』です。
あるアプリが公開しているインタフェースを基に、外部のアプリから直接操作が可能となります。
つまりはあるアプリの機能を外部のアプリから簡単なコードで利用可能になるということですね。
では、実際にAndroid2.3で追加されたContent Providerを試してみます。
尚、Anrdoid Developers | Android2.3 Platformにある通り、
Android2.3で追加されたContent Providerは下記の4種類です。
-
- AlarmClock:時計にアラーム/メッセージを指定できる
- MediaStore:音声入力の処理、メディアファイルの検索を容易に行える
- Settings:アプリケーションの詳細設定や管理を行える
- ContractsContract:アドレスとして、Sip番号を保存できる
なんですが、MediaStoreとContractsContractは音声入力やSipといった
ハード固有の機能を扱うため、Android仮想マシンの上で検証する対象からは除外します。
そうなると、残るはAlarmClockとSettingsなんですが、AlarmClockの方がわかりやすいため、
まずはAlarmClockを外部アプリから簡単に試してみることにします。
2. アプリケーションマニフェストファイルの記述
プロジェクトの作成はNFC(近距離通信)を使えるかを確認してみました参照。
プロジェクト作成後、「AndroidManifest.xml」に記述を追加し、下記の状態にします。
これはアプリケーションのマニフェストを記述するファイルです。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.gr.t3.android.callcontext" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="9" /> <!-- ★ ↓Contents Provider:AlarmClockを利用するアプリであることを宣言 ↓ ★ --> <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".CallAlarmContextTestActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
上記の★部分の記述で
Contents Provider:AlarmClockを利用するアプリであることを宣言しています。
宣言があれば、Androidマーケットでアプリをインストールするときに機能を使うことが
注意点として表示されますし、実際にアプリの中で機能を使うことが可能となります。
#宣言していない場合、アプリの中で機能を呼び出してもエラーになります。
3. GUIエディタで画面作成
次は画面の作成です。
メイン画面のレイアウトを示すmain.xmlをGUIエディタで開き、下記の3つのパーツを配置します。
-
- TimePicker:時刻を選択できるセレクタ
- EditText:中にテキストを記述できるテキストフィールド
- Button:押下出来るボタン
追加後のイメージが下記の通りです。赤線で囲んだ部分が実際の画面となります。
TimePickerはGUIエディタには表示できませんが、
テキストフィールドとボタンが追加されているのがわかると思います。
では、実際に上記の画面を使うコードです。
4. Contents Provider:AlarmClockを利用するコードを記述
メインのアクティビティクラスを開き、下記のようにコードを修正します。
/** * Android2.3追加API ContextProviderを用いてAlarmの追加を行うテストアクティビティ */ public class CallAlarmContextTestActivity extends Activity { private TimePicker setTimePicker; private EditText messageEditText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 画面コンポーネントの初期化 this.setTimePicker = (TimePicker) findViewById(R.id.SetTimePicker); this.setTimePicker.setIs24HourView(true); // 時間の初期値を設定 Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); this.setTimePicker.setCurrentHour(hour); int minute = cal.get(Calendar.MINUTE); this.setTimePicker.setCurrentMinute(minute); this.messageEditText = (EditText) findViewById(R.id.MessageEditText); Button addBtn = (Button) findViewById(R.id.AddButton); addBtn.setOnClickListener(this.setClickListener_); } /** * ボタン押下時向けリスナー定義 */ private OnClickListener setClickListener_ = new OnClickListener() { public void onClick(View v) { CallAlarmContextTestActivity myself = CallAlarmContextTestActivity.this; int setHour = myself.setTimePicker.getCurrentHour(); int setMinute = myself.setTimePicker.getCurrentMinute(); String message = myself.messageEditText.getText().toString(); myself.addAlarm(setHour, setMinute, message); } }; /** * アラームの追加を行う。 * * @param hour アラーム設定時 * @param minute アラーム設定分 * @param message アラームメッセージ */ private void addAlarm(int hour, int minute, String message) { Intent it = new Intent(AlarmClock.ACTION_SET_ALARM); // 時の設定 it.putExtra(AlarmClock.EXTRA_HOUR, hour); // 分の設定 it.putExtra(AlarmClock.EXTRA_MINUTES, minute); // メッセージの設定 it.putExtra(AlarmClock.EXTRA_MESSAGE, message); // アラームの追加 startActivity(it); } }
このうち、Content Providerを実際に実行しているのは下記の記述になります。
private void addAlarm(int hour, int minute, String message) { Intent it = new Intent(AlarmClock.ACTION_SET_ALARM); // 時の設定 it.putExtra(AlarmClock.EXTRA_HOUR, hour); // 分の設定 it.putExtra(AlarmClock.EXTRA_MINUTES, minute); // メッセージの設定 it.putExtra(AlarmClock.EXTRA_MESSAGE, message); // アラームの追加 startActivity(it); }
EXTRA_HOUR(時刻)、EXTRA_MINUTES(分)、EXTRA_MESSAGE(メッセージ)を設定し、
ACTION_SET_ALARMをstartActivityメソッドで実行することでタイマーの設定が可能です。
5. 実際の動作を確認
では、上記のコードを実際に動かしてみましょう。
前回と同じようにアプリを実行してみますと、下記のような画面が表示されます。
時間とメッセージを入力し、ボタンを押すことでアラームが設定可能になっています。
起動後、時計とメッセージを下記のように入力します。
入力後、「Alarm Add」ボタンを押下するとアラームが追加された旨のメッセージが表示されます。
時刻が一見あっていないように見えるのはアプリ側が24時間表示、
ベースのAndroidが12時間表示になっているだけなので、お気になさらず。
その後、アラームを設定した21:20になると、
下記のようにウィンドウが表示され、アラームが鳴り響きます。
入力したメッセージも同時に表示されることがわかりますね。
以上で、作ったアプリの動作確認は終了です。
非常に簡単なコードでAlarmが設定できることがわかりました。
6. 最終的に何が嬉しいの?
最初にも書いてますが、
『あるアプリの機能を外部のアプリから簡単なコードで利用可能』に尽きると思います。
複雑なアプリであっても、入力する内容自体はそれほど複雑でないことも多いです。
そんな時、Content Providerで簡単なインタフェースを公開すれば、
公開したインタフェースを通して機能を自由に使えます。
こういった形でアプリ間の連携がどんどん進んでいけば、
Androidの使い勝手も更に増していくのではないでしょうか。
#当然、Content Providerは自分のアプリでも作成&公開が可能です。
今後のアプリ連携の広がりが非常に楽しみですね!