Всем добрый день. Стоит задача сделать плагин для PhoneGap который будет определять гео-позицию юзера. Делаю так:
HelloPlugin.java
| Код |
package com.chiffa.test
import org.apache.cordova.Config; import org.apache.cordova.DroidGap; import org.apache.cordova.GPSListener; import org.apache.cordova.api.Plugin; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; import org.apache.cordova.*;
import android.util.Log; import android.webkit.WebView;
import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager;
import android.location.Geocoder; import android.os.Bundle;
@SuppressWarnings("deprecation") public class HelloPlugin extends Plugin implements LocationListener { public static MainActivity context = null;
public static final String NATIVE_ACTION_STRING="nativeAction"; public static final String SUCCESS_PARAMETER="success";
private String bestProvider; private LocationManager lManager; private Location currentBestLocation = null; @Override
public PluginResult execute(String action, JSONArray data, String callbackId) { //only perform the action if it is the one that should be invoked if (NATIVE_ACTION_STRING.equals(action)) { lManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); bestProvider = lManager.getBestProvider(criteria, false); try { lManager.requestLocationUpdates(bestProvider, 1000, 0, this); } catch (Exception e) { e.printStackTrace(); } Log.d("Plugin", "Plugin is ok"); return new PluginResult(PluginResult.Status.OK, "Yay, Success!!!"); } return null; }
public void onLocationChanged(Location location) { Log.d("---", String.valueOf(location.getLatitude())); }
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
}
|
MainActivity.java
| Код |
package com.cff.travel;
import android.os.Bundle; import org.apache.cordova.*; import android.location.Geocoder; import android.content.Context; import android.location.Criteria;
public class MainActivity extends DroidGap {
LocationManager lManager; private static String bestProvider;
@Override public void onCreate(Bundle savedInstanceState) {
HelloPlugin.context = this; super.onCreate(savedInstanceState); // Set by <content src="index.html" /> in config.xml super.loadUrl(Config.getStartUrl()); //super.loadUrl("file:///android_asset/www/index.html") }
}
|
на строке вызова lManager.requestLocationUpdates(bestProvider, 1000, 0, this); бьет ошибки:
03-05 00:18:51.450: W/System.err(26662): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 03-05 00:18:51.455: W/System.err(26662): at android.os.Handler.<init>(Handler.java:121) 03-05 00:18:51.455: W/System.err(26662): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:183) 03-05 00:18:51.455: W/System.err(26662): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:183) 03-05 00:18:51.460: W/System.err(26662): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:661) 03-05 00:18:51.460: W/System.err(26662): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:486) 03-05 00:18:51.465: W/System.err(26662): at com.cff.travel.HelloPlugin.execute(HelloPlugin.java:126) 03-05 00:18:51.465: W/System.err(26662): at org.apache.cordova.api.Plugin$1.run(Plugin.java:78) 03-05 00:18:51.465: W/System.err(26662): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 03-05 00:18:51.470: W/System.err(26662): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 03-05 00:18:51.470: W/System.err(26662): at java.lang.Thread.run(Thread.java:856)
Вроде как все сделано, как описано в доках и примерах... Подскажите, что не так? Заранее благодарен за помощь!
|