[Firefox OS][WebAPI]バイブレーションAPIの使い方

 藪下@2課のガジェオタです。環境光センサ、近接センサ、GPSときて今回はバイブレーターを動かします。
 バイブレータは使いどころがわかりやすいですね。何らかの通知を目立たせるため、演出の効果の一つとして、メインの効果ではないかもしれませんがちょくちょく使われている場面に出くわします。

バイブレーション

 バイブレーションAPIは端末のバイブレータを制御するためのAPIです。
 着信音とともにバイブレートする機能や通知の一種に使われます。
 バイレーションAPIは振動させたい時間を与えることで制御します。振動時間と停止時間の配列を渡すことによってパターンも表現することができます。

  • [バイブレータのサンプル](https://github.com/aoitan/C86_samples/tree/master/vibrator バイブレータのサンプル)

バイブレータを振動させる

 バイブレータAPIはnavigator.vibrate()によって制御します。
 引数としてnumberあるいはnumberの配列を取り、引数で指定された時間だけバイブレータを振動させます。単位はミリ秒です。
 引数が配列の場合、奇数番目の要素を振動時間、偶数番目の要素を停止時間としたパターンでバイブレータを振動させます。

navigator.vibrate(200);
// 三三七拍子
navigator.vibrate([200, 100, 200, 100, 200, 200,
                   200, 100, 200, 100, 200, 200,
                   200, 100, 200, 100, 200, 100, 200, 100,
                   200, 100, 200, 100, 200, 200]);

バイブレータを停止させる

 引数として0を渡すとバイブレータが停止します。

navigator.vibrate(0);

リファレンス

 今回の内容は以下のURLが一次リソースになります。W3Cの仕様なので各ブラウザもこの仕様に則ります。

まとめ

 バイブレーションAPIは使い方も簡単でいいですね。
 冒頭でも書いた通り主役の効果ではないもののいろいろな場面で小粋に効いてくれる効果だと思います。
 単に通知する場合だけでなく、ゲームなどでも派手な動きや爆発とともに使えばよい演出になるでしょう。

 ただしバイブレーションAPIはバイブレータを駆動させるため不用意に多用すると電池持ちに影響します。
 デバイスを制御するAPI全般に言えることではありますが、適切な使用を心がけましょう。

[Firefox OS][WebAPI]Geolocation APIの使い方

 藪下@@2課のガジェオタです。

 環境光センサ、近接センサと解説してきましたが、今回はGeolocation APIについての記事です。
 アプリを作る人の観点ではこれまでのセンサ類と比べてよく使うものではないでしょうか。よく使われるだけに使ったことがある人も多いかもしれませんね。

地理位置情報

 地理位置情報APIは位置情報の取得を行うAPIです。現在位置の取得、位置情報の監視を行えます。
 位置情報APIはリクエストメソッドにコールバック関数を渡してレスポンスを待つような使い方になっています。
 また位置情報はプライベートな情報であるためAPIの使用時に許可を求めるプロンプトが表示されます。
 地理位置情報APIはnavigator.geolocationに属します。

パーミッションの設定

 Firefox OSで地理位置情報APIを使用するにはマニフェストへのパーミッションの設定が必要です。
 ”permissions” プロパティに “geolocation” を記述します。

  "permissions": {
    "geolocation": {}
  },

現在位置情報の取得

 現在位置の取得にはgetCurrentを使用します。
 geolocation.getCurrentPositionは2つの引数と1つのオプション引数を取ります。
 返り値はありません。

 第3引数のPositionOptionに高精度の位置情報を要求するフラグを立てない場合、高速なレスポンスのために低精度の位置情報を返します。

  navigator.geolocation.getCurrentPosition(successHandler, errorHandler, [PositionOption])
引数 概要
successHandler 現在位置取得成功コールバック
errorHandler 現在位置取得失敗コールバック
PositionOption 高精度位置情報を取得するか、最大試行回数、待ち時間を表すオブジェクト

現在位置の監視

 現在位置の監視にはgeolocation.watchPositionを使用します。
 geolocation.getCurrentPositionは2つの引数と1つのオプション引数を取ります。引数の意味はgeolocation.getCurrentPositionと同じです。
 geolocation.watchPositionは位置に変化があると第1引数のコールバック関数を呼び出します。
 返り値として監視を区別するための値を返却します(@ {aoitan_watchposition_geoloc})。

  navigator.geolocation.watchPosition(successHandler, errorHandler, [PositionOption])
引数 概要
successHandler 現在位置取得成功コールバック。callback void (Position)
errorHandler 現在位置取得失敗コールバック。callback void (ErrorPosition)
PositionOptions 高精度位置情報の取得や最大試行回数、待ち時間を指定
変数名 概要
enableHighAccuracy true:高精度位置情報を取得する、false:取得しない
timeout タイムアウトまでのミリ秒数
maximumAge 最大試行回数

 監視を終了するにはgeolocation.watchPositionが返却した値を引数としてgeolocation.clearWatchを呼び出します。

  navigator.geolocation.clearWatch(watchId)
引数 概要
watchId watchPositionから返却された監視ID

位置情報

 geolocation.getCurrentPositiongeolocation.watchPositionでの測位が成功すると、成功コールバックで位置情報が取得できます。
 位置情報には座標情報と時刻が含まれます。

変数名 概要
coords 座標情報を表すCoordinates型の値
timestamp coordを取得した時刻を表すDOMTimeStamp型の値
変数名 概要
latitude 地理座標系の緯度
longitude 地理座標系の経度
altitude 高さ。高さが測位できない場合はnull
accuracy 緯度経度についての精度。非負実数
altitudeAccuracy 高さの精度。非負実数。高さが測位できない場合はnull
heading 北に対するデバイスの向き。時計回りに0~360度を取る
speed 水平移動速度

altitude、altitudeAccuracy変数の単位はメートルです。またspeedは秒速メートル単位で取得できます。
heading変数は、向きが提供できない場合にnull、静止状態の時NaNをとります。

サンプル

function startPositioning() {
  var geo = navigator.geolocation;

  // まず現在地を取る
  return this.getCurrentPosition().then((pos) => {
    positionPrint(pos);

    // 精度を上げるために監視を始める
    watchId = geo.watchPosition((position) => {
      positionPrint(pos);
    }, (error) => {
      errorPrint(error);
    }, {enableHighAccuracy: true});
    return watchId;
  }).catch((error) => {
    errorPrint(error);
  });
}

function getCurrentPosition() {
  var geo = navigator.geolocation;

  var getLocation = new Promise((resolve, reject) => {
    geo.getCurrentPosition((position) => {
      resolve(position);
    }, (error) => {
      reject(error);
    });
  });

  return getLocation;
}

 サンプルでは低精度な代わりに素早く位置情報を取得してから高精度で位置情報監視を開始して精度を上げる動作を端的に表しています。
 実際のアプリでは上記サンプルのように文字列を表示するだけでなく、マップAPIを併用して地図上で位置と範囲を表示するような形になるでしょう。

リファレンス

 今回の内容は以下のURLが一時リソースになります。W3Cの仕様なので各ブラウザもこの仕様に則ります。

まとめ

 地理位置情報APIの典型的な使用例は地図との連携でしょう。Firefox OSでもv1.0のころはNokiaのhere mapを搭載していたり、今でも開発ビルドではOpen Street Mapと組み合わせたテストアプリなど、地図との連携の例があります。
 昨今では地図以外での利用も増えていますね。SMSなどの投稿時や写真にジオタグをつける、スタブラやIngressのような位置に基づいたゲームなどですね。

 位置情報はいろいろ使えるところがあるので面白いアプリを作っていきましょう!