Я использую плагин nativescript-geolocation и пытаюсь записывать местоположения пользователей, пока приложение приостановлено. Я делаю приложение в стиле навигации, которое должно иметь возможность отслеживать местоположение пользователя, пока оно не открыто. Например, я запускаю навигацию, затем нажимаю «home» на устройстве и открываю другое приложение; Я хотел бы записать их геолокации в фоновом режиме.
Я пытался выполнить this , но местоположение запускается только при открытом приложении. Если приложение приостанавливается, журналы консоли не отображаются при перемещении устройства. Я также попытался сохранить местоположения в массив, а затем консоль, регистрируя их при возобновлении работы приложения, это только распечатало первый сегмент местоположения.
background-service.js
const geolocation = require("nativescript-geolocation");
const Accuracy = require("tns-core-modules/ui/enums").Accuracy;
const application = require("tns-core-modules/application");
const device = require("tns-core-modules/platform");
var watchID;
function clearWatch() {
if (watchID) {
geolocation.clearWatch(watchID);
watchID = null;
}
}
function startWatch() {
console.log("starting watch??");
clearWatch();
watchID = geolocation.watchLocation(
function (loc) {
console.log("repeat?");
if (loc) {
console.log("Background location: " + loc.latitude + ", " + loc.longitude);
}
},
function (err) {
console.log(err);
}, {
desiredAccuracy: Accuracy.high,
updateDistance: 5,
updateTime: 1000
}
);
}
application.on(application.exitEvent, clearWatch);
if (application.android) {
android.app.job.JobService.extend("com.oa.location.BackgroundService26", {
onStartJob() {
console.log("service onStartJob");
startWatch();
return true;
},
onStopJob(jobParams) {
console.log("service onStopJob");
this.jobFinished(jobParams, false);
clearWatch();
return false;
},
});
}
в home-page.js
application.on(application.suspendEvent, args => {
// background recording segment
if (application.android) {
var context = utils.ad.getApplicationContext();
var component = new android.content.ComponentName(context, com.oa.location.BackgroundService26.class);
var builder = new android.app.job.JobInfo.Builder(1, component);
builder.setRequiredNetworkType(android.app.job.JobInfo.NETWORK_TYPE_ANY);
//builder.setPeriodic(30);
const jobScheduler = context.getSystemService(android.content.Context.JOB_SCHEDULER_SERVICE);
service = jobScheduler.schedule(builder.build());
console.log(`Job Scheduled: ${jobScheduler.schedule(builder.build())}`);
// var intent = new android.content.Intent(context, com.oa.location.BackgroundService26.class);
// context.startService(intent);
}
console.log("suspended");
});
application.on(application.resumeEvent, args => {
if (args.android) {
//geolocation.clearWatch(watchID);
console.log("resumed");
// remove background recording
var context = utils.ad.getApplicationContext();
const jobScheduler = context.getSystemService(android.content.Context.JOB_SCHEDULER_SERVICE);
jobScheduler.cancel(service);
console.log("Canceled " + service);
service = null;
}
});
в AndroidManifest.xml
<application android:usesCleartextTraffic="true" android:name="com.tns.NativeScriptApplication" android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/AppTheme">
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="true" />
<service android:name="com.oa.location.BackgroundService26" android:permission="android.permission.BIND_JOB_SERVICE" android:enabled="true" android:exported="false">
</service>
<activity android:name="com.tns.NativeScriptActivity" android:label="@string/title_activity_kimera" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode" android:theme="@style/LaunchScreenTheme" android:screenOrientation="portrait">
<meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.tns.ErrorReportActivity" />
</application>
Я ожидаю, что когда пользователь нажмет кнопку «Домой» своего устройства, чтобы перевести приложение в режим приостановки, фоновая служба запустится и соберет обновления геолокации.