ubicacion - obtener posicionamiento android
La geolocalizaciĆ³n de Android nativa de React (1)
Necesito detectar la geolocalización del usuario en Android nativo de React, pero la implementación actual solo admite iOS. No he encontrado tutoriales ni preguntas relacionadas en ninguna parte.
Intenté crear mi propio componente nativo de Android para esto. Lo he intentado con el emulador (estableciendo algunas coordenadas a través de la línea de comandos) y con un teléfono, pero no hay un icono de gps en la barra de acciones y la devolución de llamada de reacción no tiene datos.
Intento obtener la última ubicación conocida de inmediato y también estoy configurando un detector de eventos para las actualizaciones.
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){
}
}
Permisos:
<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" />
No he encontrado nada relevante de los registros de logcat tampoco. Cualquier consejo sobre qué es lo que está mal con este código o cualquier tipo de solución para obtener geocoordinates sería genial.
ACTUALIZACIÓN : suspiro. Hablé pronto Es parte de 0.15.0: https://github.com/facebook/react-native/releases/tag/v0.15.0
El módulo oficial parece que aún no tiene código abierto (Ver: Problemas conocidos ), pero el hecho de que haya documentación para usarlo con Android sugiere que aparecerá algún día ... ¿pronto? Mientras tanto, esto es lo que tengo un mes después y después de googlear un poco:
- rn-geolocation (Parece sencillo. Ir a probar esto.)
- react-native-android-geolocation (¿También se ve bien?)
- react-native-background-geolocation (No es gratis para Android pero parece ser el verdadero negocio para aplicaciones intensivas de GPS, como correr / navegar)
- react-native-geolocation-android (LGPL)