Как получить обновления местоположения пользователя в nativescript, когда приложение приостановлено (android)? - PullRequest
1 голос
/ 20 июня 2019

Я использую плагин 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>

Я ожидаю, что когда пользователь нажмет кнопку «Домой» своего устройства, чтобы перевести приложение в режим приостановки, фоновая служба запустится и соберет обновления геолокации.

1 Ответ

0 голосов
/ 20 июня 2019

Поскольку вы фокусируетесь только на BackgroundService26 Я предполагаю, что вы тестируете на Android 8 или более поздней версии, и в этом случае я думаю, что вы пропустили setOverrideDeadline

...