Как внедрить фоновую службу Android в проект NativeScript Angular?

Я пытаюсь создать фоновую службу для nativescript-geolocation, чтобы получать уведомления при запуске события.

Я нашел много примеров для общей версии NS, но ничего для версии Angular, и я не могу найти способ ее реализовать.

В настоящее время я получаю Class "com.nativescript.location.BackgroundService" not found. сообщений об ошибках.

Службы были объявлены в AndroidManifest.xml, удален каталог платформ и выполнена чистая сборка.

<service android:name="com.nativescript.location.BackgroundService"
         android:exported="false" >
</service>
<service android:name="com.nativescript.location.BackgroundService26"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:enabled="true"
         android:exported="false">
</service>

Я использую это как ссылку и пытаюсь создать версию Angular этого https://github.com/NativeScript/nativescript-geolocation/tree/master/demo

background-service.ts

import * as geolocation from "nativescript-geolocation";
import { Accuracy } from "tns-core-modules/ui/enums";
import * as application from "tns-core-modules/application";
import { device } from "tns-core-modules/platform";
import * as Toast from "nativescript-toast";

let watchId;

function _clearWatch() {
  if (watchId) {
    geolocation.clearWatch(watchId);
    watchId = null;
  }
}

function _startWatch() {
  geolocation.enableLocationRequest().then(function () {
    _clearWatch();
    watchId = geolocation.watchLocation(
      function (loc) {
        if (loc) {
          let toast = Toast.makeText('Background Location: \n' + loc.latitude + ', ' + loc.longitude);
          toast.show();
          console.log('Background Location: ' + loc.latitude + ' ' + loc.longitude);
        }
      },
      function (e) {
        console.log("Background watchLocation error: " + (e.message || e));
      },
      {
        desiredAccuracy: Accuracy.high,
        updateDistance: 1.0,
        updateTime: 3000,
        minimumUpdateTime: 100
      });
  }, function (e) {
    console.log("Background enableLocationRequest error: " + (e.message || e));
  });
}
application.on(application.exitEvent, _clearWatch);

export function getBackgroundServiceClass() {
  if (application.android) {
    if (device.sdkVersion < "26") {
      @JavaProxy("com.nativescript.location.BackgroundService")
      class BackgroundService extends (<any>android).app.Service {
        constructor() {
          super();
          return global.__native(this);
        }
        onStartCommand(intent, flags, startId) {
          console.log('service onStartCommand');
          this.super.onStartCommand(intent, flags, startId);
          return android.app.Service.START_STICKY;
        }
        onCreate() {
          console.log('service onCreate');
          _startWatch();
        }
        onBind(intent) {
          console.log('service onBind');
        }
        onUnbind(intent) {
          console.log('service onUnbind');
        }
        onDestroy() {
          console.log('service onDestroy');
          _clearWatch();
        }
      }
      return BackgroundService;
    } else {
      @JavaProxy("com.nativescript.location.BackgroundService26")
      class BackgroundService26 extends (<any>android.app).job.JobService {
        constructor() {
          super();
          return global.__native(this);
        }
        onStartJob(): boolean {
          console.log('service onStartJob');
          _startWatch();
          return true;
        }
        onStopJob(jobParameters: any): boolean {
          console.log('service onStopJob');
          this.jobFinished(jobParameters, false);
          _clearWatch();
          return false;
        }
      }
      return BackgroundService26;
    }
  } else {
    return null;
  }
}
export const BackgroundServiceClass = getBackgroundServiceClass();

app.component.tns.ts

import {Component, ElementRef, ViewChild} from '@angular/core';

import { BackgroundServiceClass } from "@src/background-service";


import { Page } from "tns-core-modules/ui/page";
const utils = require("tns-core-modules/utils/utils");
import * as application from "tns-core-modules/application";
import { device } from "tns-core-modules/platform";

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
})

export class AppComponent {




  /* Background servie stuffs */
  page: Page;
  watchIds = [];
  jobId = 308; // the id should be unique for each background job. We only use one, so we set the id to be the same each time.
  com: any;

  constructor(

  ) {

  }

  ngOnInit(){


    application.on(application.exitEvent, this._stopBackgroundJob);


  }

  ngAfterViewInit(){

  }

  _stopBackgroundJob() {
    if (application.android) {
      let context = utils.ad.getApplicationContext();
      const jobScheduler = context.getSystemService((<any>android.content.Context).JOB_SCHEDULER_SERVICE);
      if (jobScheduler.getPendingJob(this.jobId) !== null) {
        jobScheduler.cancel(this.jobId);
        console.log(`Job Canceled: ${this.jobId}`);
      }
    }
  }

    startBackgroundTap() {
      if (application.android) {
        let context = utils.ad.getApplicationContext();
        if (device.sdkVersion >= "26") {
          const jobScheduler = context.getSystemService((<any>android.content.Context).JOB_SCHEDULER_SERVICE);
          const component = new android.content.ComponentName(context, BackgroundServiceClass.class);
          const builder = new (<any>android.app).job.JobInfo.Builder(this.jobId, component);
          builder.setOverrideDeadline(0);
          jobScheduler.schedule(builder.build());
        } else {
          let intent = new android.content.Intent(context, BackgroundServiceClass.class);
          context.startService(intent);
        }
      }
    }
}

Манифест Android

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android" package="__PACKAGE__" android:versionCode="13" android:versionName="1.31">
    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

  <application android:name="com.tns.NativeScriptApplication" android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/AppTheme" android:windowSoftInputMode="adjustResize" android:hardwareAccelerated="true" android:networkSecurityConfig="@xml/network_security_config">
      <service android:name="com.nativescript.location.BackgroundService"
               android:exported="false" >
      </service>

      <service android:name="com.nativescript.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">
            <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>
</manifest>

person Peter    schedule 02.06.2020    source источник
comment
Вы нашли информацию по этому вопросу? может быть, Маной может помочь, но он не видел здесь темы?   -  person Prajil Shrestha    schedule 08.06.2020
comment
Я не знаю, что с ним случилось, я также публиковал это 4 раза прямо на канале сообщества разработчиков NS, но всем наплевать... так как они объявили nstudio.io на самом деле они не отвечают на мои вопросы   -  person Peter    schedule 08.06.2020
comment
Ах, какой позор, я пришел сюда по ссылке из ns dev slack. Я хотел бы помочь вам или иметь какие-либо знания об этом.   -  person Prajil Shrestha    schedule 08.06.2020
comment
Я очень надеюсь, что Progress будет лучше поддерживать NS в будущем, это потрясающая вещь в мире, нам это нравится до сих пор, и мы хотим инвестировать в это.   -  person Peter    schedule 08.06.2020
comment
Включена ли угловая версия демо-версии , которая включена в этот репозиторий работает некорректно?   -  person Ian MacDonald    schedule 08.06.2020
comment
@IanMacDonald, к сожалению, фоновая служба не включена в демонстрацию angular.   -  person Peter    schedule 08.06.2020


Ответы (1)


Для проблемы, которую вы упомянули, попробуйте следующее:

  1. Проверьте свою версию Nativescript и версию примера. Критические изменения между версиями могут повлиять. Попробуйте перейти на Nativescript 5, создайте новый проект и вставьте свой код.
  2. Затем попробуйте чистую сборку.

Для отслеживания местоположения в фоновом режиме я предлагаю вам попробовать Foreground Services в сочетании с плагином nativescript-геолокации. Проверьте, что эта статья является хорошо объясненным учебным пособием по первой теме:

https://dev.to/ozymandiasthegreat/android-continuous-background-services-with-nativescript-42c9

Ссылка на репо:

https://github.com/OzymandiasTheGreat/Nativescript-ServiceExample/blob/master/package-lock.json

person KadoLakatt    schedule 09.01.2021