[Titanium][Android] 端末のGPS機能で現在位置を取得する

android_gps_location定期的に現在位置を取得する方法を調査したときの覚書。

環境: Titanium SDK 3.2.3.GA, Android

GPSの有効・無効の判定など、KitchenSinkを見るのが分かりやすい。

下記のサンプルコードも参考になった。

 

私が書いたgeolocation.jsはこんな感じ(一部)

var U = require('/lib/utils');
var _gpsProvider;

exports.init = init;
exports.release = release;

/**
* Initialization
*
* @api public
*/
function init() {
    if (!U.isAndroid()) {
        return;
    }

    //
    // "preferredProvider" is deprecated.
    // @see http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.Geolocation.Android
    //

    //Ti.Geolocation.preferredProvider = 'gps';
    //Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_HIGH;
    //Ti.Geolocation.distanceFilter = 10;

    _gpsProvider = Ti.Geolocation.Android.createLocationProvider({
        name: Ti.Geolocation.PROVIDER_GPS,
        minUpdateTime: 30, // seconds
        minUpdateDistance: 100 // meters
    });

    Ti.Geolocation.Android.addLocationProvider(_gpsProvider);
    Ti.Geolocation.Android.manualMode = true;

    // Bind Event
    Ti.Geolocation.addEventListener('location', handleLocation);
}


/**
* Release
*
* @api public
*/
function release() {
    if (_gpsProvider) {
        Ti.Geolocation.Android.removeLocationProvider(_gpsProvider);
        Ti.Geolocation.removeEventListener('location', handleLocation);
    }
    _gpsProvider = null;
}

 

GPSが無効のときは設定画面を開きたい。

ただKitchenSinkで試すと分かるけど、getCurrentPositionは「位置情報サービス」が有効だとGPSが無効でも正常に動作する。

GPSが有効かどうかは
Ti.Geolocation.addEventListener('location', handleLocation)
の結果を見て判断するしかない。モジュールを作れば別。

サンプルコード

/**
* Show Setting App
*
* @api public
* @param {String} text
*/
function showLocationSetting(text) {
    var dialog;

    dialog = Ti.UI.createAlertDialog({
        message: text || L('w_gps_off'),
        buttonNames: [L('cancel'),L('settings')],
        cancel: 0
    });

    // Add click event.
    dialog.addEventListener('click', function(e) {
        if (!U.isAndroid() || e.cancel === e.index || e.cancel === true) {
            return false;
        }
        Ti.Android.currentActivity.startActivity(Ti.Android.createIntent({
            action: 'android.settings.LOCATION_SOURCE_SETTINGS'
        }));
    });

    // Show
    dialog.show();
}

 

 

位置情報を収集している間はServiceを起動 + Notificationに表示して分かりやすくしてみた。

 

< Related Posts >