Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ContentProviderでAlarmClockを操作してみました

こんにちは。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種類です。

    1. AlarmClock:時計にアラーム/メッセージを指定できる
    2. MediaStore:音声入力の処理、メディアファイルの検索を容易に行える
    3. Settings:アプリケーションの詳細設定や管理を行える
    4. 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.xmlGUIエディタで開き、下記の3つのパーツを配置します。

    1. TimePicker:時刻を選択できるセレクタ
    2. EditText:中にテキストを記述できるテキストフィールド
    3. 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は自分のアプリでも作成&公開が可能です。

今後のアプリ連携の広がりが非常に楽しみですね!