PhoneGap 手机百度地图定位插件

虽然不难。。能简单搞定的就简单搞。。能复制就复制。

插件地址:https://github.com/DoubleSpout/phonegap_baidu_sdk_location

原文博客:http://snoopyxdy.blog.163.com/blog/static/601174402014420872345/

<?xml version="1.0" encoding="UTF-8"?>

<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" id="com.spout.phonegap.plugins.baidulocation" version="0.1.0">
    <name>BaiduLocation</name>
    <description>Baidu Location Plugin for Phonegap</description>
    <license>MIT</license>
    <keywords>baidu, location, phonegap</keywords>

    <!-- android -->
    <platform name="android">
        <js-module src="www/baidulocation.js" name="BiaduLocation">
            <clobbers target="window.baiduLocation" />
        </js-module>

        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="BaiduLocation">
                <param name="android-package" value="com.spout.phonegap.plugins.baidulocation.BaiduLocation"/>
            </feature>
        </config-file> 

        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
            <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
            <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
            <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
            <uses-permission android:name="android.permission.INTERNET" />
            <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
            <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
        </config-file>

        <config-file target="AndroidManifest.xml" parent="/manifest/application">
            <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"></service>
        </config-file>

        <source-file src="src/android/BaiduLocation.java" target-dir="src/com/spout/phonegap/plugins/baidulocation" />   
        <source-file src="src/android/locSDK_4.0.jar" target-dir="libs" framework="true"/>      
        <source-file src="src/android/liblocSDK4.so" target-dir="libs/armeabi" framework="true"/>   
    </platform>         
</plugin>

将上述地址配置到指定文件即可.

需要留意版本,本人就还是在用android 4.1 cordova 用的是2.8版本,所以稍微麻烦了点

莫鄙视…

补充一个2.8版本的百度地图定位

package com.spout.phonegap.plugins.baidulocation;

import java.util.HashMap;
import java.util.Map;

import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;

public class BaiduLocation extends Plugin {

	public static final String PLUGIN_NAME = "BaiduLocation";
	NotificationManager notificationManager;
	Notification note;
	PendingIntent contentIntent;

	public CallbackContext callbackContext;
	private static final String STOP_ACTION = "stop";
	private static final String GET_ACTION = "getCurrentPosition";
	public LocationClient locationClient = null;
	public JSONObject jsonObj = new JSONObject();
	public boolean result = false;

	public BDLocationListener myListener;

	private static final Map<Integer, String> ERROR_MESSAGE_MAP = new HashMap<Integer, String>();

	private static final String DEFAULT_ERROR_MESSAGE = "服务端定位失败";

	static {
		ERROR_MESSAGE_MAP.put(61, "GPS定位结果");
		ERROR_MESSAGE_MAP.put(62, "扫描整合定位依据失败。此时定位结果无效");
		ERROR_MESSAGE_MAP.put(63, "网络异常,没有成功向服务器发起请求。此时定位结果无效");
		ERROR_MESSAGE_MAP.put(65, "定位缓存的结果");
		ERROR_MESSAGE_MAP.put(66, "离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果");
		ERROR_MESSAGE_MAP.put(67, "离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果");
		ERROR_MESSAGE_MAP.put(68, "网络连接失败时,查找本地离线定位时对应的返回结果。");
		ERROR_MESSAGE_MAP.put(161, "表示网络定位结果");
	};

	public String getErrorMessage(int locationType) {
		String result = ERROR_MESSAGE_MAP.get(locationType);
		if (result == null) {
			result = DEFAULT_ERROR_MESSAGE;
		}
		return result;
	}
	private void logMsg(String s) {
		System.out.println(s);
	}

	public CallbackContext getCallbackContext() {
		return callbackContext;
	}

	public void setCallbackContext(CallbackContext callbackContext) {
		this.callbackContext = callbackContext;
	}
	@Override
	public boolean execute(String action, JSONArray args,
			final CallbackContext callbackContext) throws JSONException {
		Log.d(PLUGIN_NAME, "Plugin execute called with action: " + action);

		setCallbackContext(callbackContext);
		if (GET_ACTION.equals(action)) {
			cordova.getActivity().runOnUiThread(new Runnable() {
				@Override
				public void run() {

					Log.d(PLUGIN_NAME, "run: ");
					locationClient = new LocationClient(cordova.getActivity());
					locationClient.setAK("BfkPvjDGHC0ATZhIr6wxnHh9");// 设置百度的ak
					myListener = new MyLocationListener();
					locationClient.registerLocationListener(myListener);
					LocationClientOption option = new LocationClientOption();
					option.setOpenGps(true);
					option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
					option.setProdName("BaiduLoc");
					option.disableCache(true);// 禁止启用缓存定位
					locationClient.setLocOption(option);

					locationClient.start();
					locationClient.requestLocation();

				}

			});
		} else if (STOP_ACTION.equals(action)) {
			locationClient.stop();
		}

		while (result == false) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		return true;
	}
	@Override
	public void onDestroy() {
		if (locationClient != null && locationClient.isStarted()) {
			locationClient.stop();
			locationClient = null;
		}
		super.onDestroy();
	}

	public class MyLocationListener implements BDLocationListener {
		@Override
		public void onReceiveLocation(BDLocation location) {
			if (location == null)
				return;
			try {

				Log.d(PLUGIN_NAME, "MyLocationListener");
				JSONObject coords = new JSONObject();
				coords.put("latitude", location.getLatitude());
				coords.put("longitude", location.getLongitude());
				coords.put("radius", location.getRadius());

				jsonObj.put("coords", coords);

				int locationType = location.getLocType();

				jsonObj.put("locationType", locationType);
				jsonObj.put("code", locationType);
				jsonObj.put("message", getErrorMessage(locationType));

				switch (location.getLocType()) {

				case BDLocation.TypeGpsLocation:
					coords.put("speed", location.getSpeed());
					coords.put("altitude", location.getAltitude());
					jsonObj.put("SatelliteNumber",
							location.getSatelliteNumber());
					break;

				case BDLocation.TypeNetWorkLocation:
					jsonObj.put("addr", location.getAddrStr());
					break;
				}

				Log.d("BaiduLocationPlugin", "run: " + jsonObj.toString());
				callbackContext.success(jsonObj);
				result = true;
			} catch (JSONException e) {
				callbackContext.error(e.getMessage());
				result = true;
			}

		}

		@Override
		public void onReceivePoi(BDLocation arg0) {
			// TODO Auto-generated method stub

		}
	}

	@SuppressWarnings("unused")
	@Override
	public PluginResult execute(String arg0, JSONArray arg1, String arg2) {

		Log.d("BaiduLocationPlugin", "run: xxxx" );
		return new PluginResult(true ? PluginResult.Status.OK
				: PluginResult.Status.ERROR);
		// TODO Auto-generated method stub
	}

}

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注