【问题标题】:How to make Compass in nativescript when i am unable to find north direction?当我无法找到北方向时,如何在 nativescript 中制作指南针?
【发布时间】:2019-01-21 13:16:46
【问题描述】:

我正在研究 nativescript ,但其中严重缺乏库。我无法找到北方向。 我试过插件

   import * as geolocation from "nativescript-geolocation";
    import { Accuracy } from "tns-core-modules/ui/enums"; 
         test:function() {

          var a = geolocation.getCurrentLocation({ desiredAccuracy: Accuracy.high, maximumAge: 5000, timeout: 20000 })
                    ;
                    a.then( return_a => {
                    console.log("this------------------------------->",return_a);        
                    //distance(return_a,);
                    var degree = angleFromCoordinate(return_a.latitude,return_a.longitude , 21.4225,39.8262);
                     console.log(degree);
                    this.gaugeValue = degree;//return_a.verticalAccuracy

                    });   
                    }
          });
        function angleFromCoordinate( lat1,  long1,  lat2, long2) {

        var dLon = (long2 - long1);

        var y = Math.sin(dLon) * Math.cos(lat2);
        var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
                * Math.cos(lat2) * Math.cos(dLon);

        var brng = Math.atan2(y, x);

        brng = brng * 180 / Math.PI;
        brng = (brng + 360) % 360;
        brng = 360 - brng; // count degrees counter-clockwise - remove to make clockwise

        return brng;
    }

也有方向属性可用。但它始终是 -1 。 我使用 Typescript , javascript 作为模板语言。

【问题讨论】:

  • nativescript-geolocation 插件的目的是单独处理位置服务,我不认为它实现了检测航向所需的 api。此外,没有现成的插件可用于完成此功能,您必须编写一个或直接访问本机 api。
  • 首先您需要验证用户将拥有一个带有实际硬件传感器的设备(与 NativeScript 无关),然后才能访问和使用原生 Android API 来检测地理方向(更多这里stackoverflow.com/questions/8315913/…)

标签: nativescript


【解决方案1】:

Here我找到了解决方案。您需要手动完成。

import * as app from "tns-core-modules/application"; 
import { isAndroid, isIOS } from "tns-core-modules/platform";

declare const android: any;
declare const CLLocationManager: any;

export class MyClass {
  private sensorUpdate: any;
  private sensorManager: any;

  startHeadingUpdates() {
    if (this.sensorManager || this.sensorUpdate) {
      return;
    }

    if (isIOS) {
      this.sensorManager = CLLocationManager.alloc().init();

      if (this.sensorManager.headingAvailable) {
        this.sensorManager.startUpdatingHeading();

        this.sensorUpdate = setInterval(() => {
          console.log(this.sensorManager.heading.trueHeading);
        }, 100);
      } else {
        console.log("Heading not available.");
      }

      return;
    }

    if (isAndroid) {
      this.sensorManager = app.android.foregroundActivity.getSystemService(
        android.content.Context.SENSOR_SERVICE
      );

      this.sensorUpdate = new android.hardware.SensorEventListener({
        onAccuracyChanged: (sensor: any, accuracy: any) => {
          // console.log(accuracy)
        },
        onSensorChanged: (event: any) => {
         console.log(event.values[0]);
        }
      });

      const orientationSensor = this.sensorManager.getDefaultSensor(
        android.hardware.Sensor.TYPE_ORIENTATION
      );
      this.sensorManager.registerListener(
        this.sensorUpdate,
        orientationSensor,
        android.hardware.SensorManager.SENSOR_DELAY_UI
      );
    }
  }

  stopUpdatingHeading() {
    if (!this.sensorManager || !this.sensorUpdate) {
      return;
    }

    if (isIOS) {
      this.sensorManager.stopUpdatingHeading();
      clearInterval(this.sensorUpdate);
      this.sensorManager = null;
      return;
    }

    if (isAndroid) {
      this.sensorManager.unregisterListener(this.sensorUpdate);
      this.sensorManager = null;
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多