【问题标题】:React-native Android geolocationReact-native Android 地理定位
【发布时间】:2016-01-25 07:36:24
【问题描述】:

我需要在 React-native Android 上检测用户的地理位置,但当前的实现只支持 iOS。我在任何地方都没有找到任何教程或相关问题。

我已经尝试为此创建自己的 Android 原生组件。我已经用模拟器(通过命令行设置一些坐标)和手机进行了尝试,但操作栏中没有 gps 图标,并且反应回调中没有数据。

我正在尝试立即获取最后一个已知位置,并且我还设置了一个事件侦听器以进行更新。

public class GeoLocation extends ReactContextBaseJavaModule implements
    GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

protected static final String TAG = "GeoLocation";
protected GoogleApiClient mGoogleApiClient;
protected Location mLastLocation;


public GeoLocation(ReactApplicationContext reactContext) {
    super(reactContext);
    buildGoogleApiClient();
}

@Override
public String getName() {
    return "GeoLocation";
}

protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(getReactApplicationContext())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    mGoogleApiClient.connect();
}

@Override
public void onConnected(Bundle connectionHint) {

    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    //WritableMap params = Arguments.createMap();

    //Can I use ConcurrentHashMap instead of WritableMap?
    ConcurrentHashMap<String, String> params = new ConcurrentHashMap();
    params.put("lastLocation", mLastLocation.toString());
    sendEvent(getReactApplicationContext(), "geoCoordsChanged", params);
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
}

@Override
public void onConnectionSuspended(int cause) {
    mGoogleApiClient.connect();
}

@ReactMethod
public void getLastLocation(Callback success,Callback err){
    try {
        String msg = "No location found yet";

        if(mLastLocation != null){
            msg = mLastLocation.toString();
        }

        success.invoke(msg);
    } catch (Exception e) {
        err.invoke(e.getMessage());
    }
}

private void sendEvent(ReactContext reactContext,
                       String eventName,
                       @Nullable ConcurrentHashMap<String, String> params) {
  try {
      reactContext
          .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
          .emit(eventName, params);
  } catch(Exception e){

  }
}

权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<application
  android:allowBackup="true"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:theme="@style/AppTheme">

    <meta-data android:name="com.google.android.gms.version"
               android:value="@integer/google_play_services_version" />

我也没有从 logcat 日志中找到任何相关内容。任何提示此代码有什么问题或任何获取地理坐标的解决方案都会很棒!

【问题讨论】:

    标签: android geolocation react-native


    【解决方案1】:

    更新:叹息。我很快就跟他说话了。它是 0.15.0 的一部分:https://github.com/facebook/react-native/releases/tag/v0.15.0

    官方模块似乎尚未开源(请参阅:Known Issues),但有 documentation for using it with Android 的事实表明它会在某个时候出现……很快?与此同时,这是我一个月后在谷歌上搜索后得到的:

    【讨论】:

    • 它应该可以在 Android 上运行吗?我可以让地图工作,但不能让 navigator.geolocation.watchPosition
    • This code(11 月 18 日)似乎发出了 watchPosition 监听的事件,所以我敢说是的,它应该可以工作。我们在地理定位方面遇到了一些麻烦。我不确定 watchPosition,但我们的测试手机未激活这一事实似乎导致了高精度模式的问题。我建议首先尝试模拟器和一两部真正的手机。当然还要检查adb logcat 是否有错误。
    • “激活”是什么意思?这很容易成为问题。我已经通过调试器中的 java LocaltionManger 单步执行,并注意到最后一次知道的位置是 12 小时前。它显然有 GPS 位置,因为我可以在地图上看到蓝点,只是由于某种原因没有更新。
    • 对不起。我的意思是我们正在使用不再订阅 Verizon 服务的旧手机进行测试。我在网上看到建议,由于地理定位使用 GPS 和手机信号塔的组合,这可能会导致高精度失败。不过只是猜测。 RN Android 也有一个bug that caused geolocation to hang forever instead of timing out,但在最近的版本中已修复。我们目前正在使用 Android Studio 2 的模拟器,它允许您显式发送 GPS 位置。底线:可能应该工作;尝试多个设备。 :)
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2021-12-29
    • 2016-10-26
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多