package com.eteng.geolocation.baidu; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; import org.apache.cordova.PermissionHelper; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.eteng.geolocation.w3.PositionOptions; import android.content.Context; import android.util.Log; import android.util.SparseArray; import android.Manifest; import android.content.pm.PackageManager; public class GeolocationPlugin extends CordovaPlugin { private static final String TAG = "GeolocationPlugin"; private static final int GET_CURRENT_POSITION = 0; private static final int WATCH_POSITION = 1; private static final int CLEAR_WATCH = 2; private SparseArray<BDGeolocation> store = new SparseArray<BDGeolocation>(); private String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; private JSONArray requestArgs; private CallbackContext context; @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { Log.i(TAG, "插件调用"); JSONObject options = new JSONObject(); requestArgs = args; context = callbackContext; if (action.equals("getCurrentPosition")) { getPermission(GET_CURRENT_POSITION); try { options = args.getJSONObject(0); } catch (JSONException e) { Log.v(TAG, "options 未传入"); } return getCurrentPosition(options, callbackContext); } else if (action.equals("watchPosition")) { getPermission(WATCH_POSITION); try { options = args.getJSONObject(0); } catch (JSONException e) { Log.v(TAG, "options 未传入"); } int watchId = args.getInt(1); return watchPosition(options, watchId, callbackContext); } else if (action.equals("clearWatch")) { getPermission(CLEAR_WATCH); int watchId = args.getInt(0); return clearWatch(watchId, callbackContext); } return false; } private boolean clearWatch(int watchId, CallbackContext callback) { Log.i(TAG, "停止监听"); BDGeolocation geolocation = store.get(watchId); store.remove(watchId); geolocation.clearWatch(); callback.success(); return true; } private boolean watchPosition(JSONObject options, int watchId, final CallbackContext callback) { Log.i(TAG, "监听位置变化"); Context ctx = cordova.getActivity().getApplicationContext(); PositionOptions positionOpts = new PositionOptions(options); BDGeolocation geolocation = new BDGeolocation(ctx); store.put(watchId, geolocation); return geolocation.watchPosition(positionOpts, new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { JSONArray message = new MessageBuilder(location).build(); PluginResult result = new PluginResult(PluginResult.Status.OK, message); result.setKeepCallback(true); callback.sendPluginResult(result); } }); } private boolean getCurrentPosition(JSONObject options, final CallbackContext callback) { Log.i(TAG, "请求当前地理位置"); Context ctx = cordova.getActivity().getApplicationContext(); PositionOptions positionOpts = new PositionOptions(options); BDGeolocation geolocation = new BDGeolocation(ctx); return geolocation.getCurrentPosition(positionOpts, new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { JSONArray message = new MessageBuilder(location).build(); callback.success(message); } }); } /** * 获取对应权限 * int requestCode Action代码 */ public void getPermission(int requestCode){ if(!hasPermisssion()){ PermissionHelper.requestPermissions(this, requestCode, permissions); } } /** * 权限请求结果处理函数 * int requestCode Action代码 * String[] permissions 权限集合 * int[] grantResults 授权结果集合 */ public void onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException { PluginResult result; //This is important if we're using Cordova without using Cordova, but we have the geolocation plugin installed if(context != null) { for (int r : grantResults) { if (r == PackageManager.PERMISSION_DENIED) { Log.d(TAG, "Permission Denied!"); result = new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION); context.sendPluginResult(result); return; } } switch(requestCode) { case GET_CURRENT_POSITION: getCurrentPosition(this.requestArgs.getJSONObject(0), this.context); break; case WATCH_POSITION: watchPosition(this.requestArgs.getJSONObject(0), this.requestArgs.getInt(1), this.context); break; case CLEAR_WATCH: clearWatch(this.requestArgs.getInt(0), this.context); break; } } } /** * 判断是否有对应权限 */ public boolean hasPermisssion() { for(String p : permissions) { if(!PermissionHelper.hasPermission(this, p)) { return false; } } return true; } /* * We override this so that we can access the permissions variable, which no longer exists in * the parent class, since we can't initialize it reliably in the constructor! */ public void requestPermissions(int requestCode) { PermissionHelper.requestPermissions(this, requestCode, permissions); } }