以前、Androidのフォアグラウンドサービスを使って、位置情報を常に取得するサービスを作成しました。
Androidのフォアグラウンドサービスで位置情報を取得する
今回は、これをCordovaプラグインにするとともに、Androidスマホ起動時にも自動的に起動するようにします。
ちなみに、この投稿は、以下の投稿の補足です。全ソースファイルは以下を参照してください。
散歩ルート計画アプリを作った
AndroidManifest.xml
Androidスマホの起動時に、OSから通知されるブロードキャストを受け取ることで、起動時の処理ができるようになります。
そのために、以下のパーミッションを付けておく必要があります。
AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
次に、受け取り先のクラスを指定します。
AndroidManifest.xml
<receiver android:name="jp.or.myhome.sample.plugin.LocationRecorder.Main$StartupReceiver" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
受け取り先のクラスは、BroadcastReceiverを継承しておく必要があります。
Main.java
public static class StartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "StartupReceiver.onReceive");
・・・・・
}
}
上記のクラスは、Main.javaの中に定義したので、AndroidManifestには以下のような記載になっています。
android:name="jp.or.myhome.sample.plugin.LocationRecorder.Main$StartupReceiver"
plugin.xml
結局のところ、Cordovaプラグインのplugin.xmlは以下のようになりました。
plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
id="cordova-plugin-locationrecorder" version="0.0.1">
<name>LocationRecorderPlugin</name>
<js-module src="www/plugin_locationrecorder.js" name="locationrecorderplugin">
<clobbers target="locationrecorderplugin" />
</js-module>
<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<feature name="LocationRecorderPlugin" >
<param name="android-package" value="jp.or.myhome.sample.plugin.LocationRecorder.Main"/>
<param name="onload" value="true" />
</feature>
</config-file>
<config-file target="res/xml/config.xml" parent="/*">
<preference name="android-minSdkVersion" value="26" />
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<service android:name="jp.or.myhome.sample.plugin.LocationRecorder.LocationService" android:exported="false" android:foregroundServiceType="location" />
<receiver android:name="jp.or.myhome.sample.plugin.LocationRecorder.Main$StartupReceiver" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</config-file>
<source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/Main.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
<source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/LocationService.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
<source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/LocationDbHelper.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
<source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/HttpPostJson.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
<framework src="com.google.android.gms:play-services-location:21.0.1" />
</platform>
</plugin>
以上