用百度SDK获取地理位置和天气信息

下面实现通过百度SDK获取地理位置和天气信息,请参考百度开发文档

1.
相关下载最新的库文件。将so文件的压缩文件解压出来,把对应架构下的so文件放入开发者自己APP的对应架构下的文件夹中,建议全部放入,
程序兼容性会大大提升,将locSDK_5.X.jar文件拷贝到工程的libs目录下,这样您就可以在程序中使用百度定位SDK了。

2. 设置AndroidManifest.xml

在application标签中声明service组件,每个app拥有自己单独的定位service

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>

【重要提醒】

定位SDKv3.1版本之后,以下权限已不需要,请取消声明,否则将由于Android 5.0多帐户系统加强权限管理而导致应用安装失败。

<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"></uses-permission>

3.声明使用权限

<span style="font-family:SimSun;font-size:14px;"><!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<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" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission></span>

设置AcessKey

使用SDK5.0需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。

设置AccessKey,在application标签中加入

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="key" />       //key:开发者申请的key

相关功能类的使用,请参看百度开发文档,附上自己写的获取地理位置和天气 LocationService.java:

package com.lenovo.realvideocamera.service;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.lenovo.realvideocamera.R;
import com.lenovo.realvideocamera.util.DateUtil;
import com.lenovo.realvideocamera.util.FileUtil;
import com.lenovo.realvideocamera.util.HttpUtil;
import com.lenovo.realvideocamera.util.ImageUtil;

/**
 * 地理位置、天气Service
 * @author Jackie
 *
 */
public class LocationService extends Service implements BDLocationListener {

	private String TAG = "LocationService";

	public LocationClient locationClient;	//百度地图定位Client
	private BDLocation bdLocation;			//百度地图定位信息
	private Bitmap weatherBitmap;			//天气缩略图bitmap

	@Override
	public IBinder onBind(Intent intent) {
		Log.i(TAG, "onBind");
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Log.i(TAG, "onCreate");
	}

	@SuppressWarnings("deprecation")
	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.i(TAG, "onStart");
		initLocation();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		if (locationClient != null) {
			locationClient.stop();
		}
		super.onDestroy();
	}

	/**
	 * @author Jackie
	 * 百度地图定位初始化
	 */
	private void initLocation() {
		locationClient = new LocationClient(this);
		locationClient.registerLocationListener(this);	//设置地图定位回调监听

		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式  Hight_Accuracy高精度、Battery_Saving低功耗、Device_Sensors仅设备(GPS)
		option.setCoorType("gcj02");//返回的定位结果是百度经纬度,默认值gcj02  国测局经纬度坐标系gcj02、百度墨卡托坐标系bd09、百度经纬度坐标系bd09ll
		option.setIsNeedAddress(true);//返回的定位结果包含地址信息
		//option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms 不设置或设置数值小于1000ms标识只定位一次
		//option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
		locationClient.setLocOption(option);

		locationClient.start();
	}

	@Override
	public void onReceiveLocation(BDLocation location) {
		if (null == location) {
			if (bdLocation != null) {
				bdLocation = null;
			}
			Log.d(TAG, "定位失败:location is null");
			return;
		}
		/**
		 * 61 : GPS定位结果
		 *	62 : 扫描整合定位依据失败。此时定位结果无效。
		 *	63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
		 *	65 : 定位缓存的结果。
		 *	66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
		 *	67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
		 *	68 : 网络连接失败时,查找本地离线定位时对应的返回结果
		 *	161: 表示网络定位结果
		 *	162~167: 服务端定位失败
		 *	502:key参数错误
		 *	505:key不存在或者非法
		 *	601:key服务被开发者自己禁用
		 *	602:key mcode不匹配
		 *	501~700:key验证失败
		 */
		int code = location.getLocType();
		if (code == 161) {
			this.bdLocation = location;
			String city = location.getCity();
			double latitude = location.getLatitude();
			double lontitude = location.getLongitude();
			String address = location.getAddrStr();
			Log.d(TAG, "city " + city + ",(latitude,lontitude) (" + latitude + "," + lontitude + "),address " + address);
			requestWeather();
		} else {
			if (bdLocation != null) {
				bdLocation = null;
			}
			Log.d(TAG, "定位失败:code=" + code);
		}
	}

	/**
	 *
	 * @author Jackie
	 * 获取天气
	 *
	 * @param view
	 */
	@SuppressLint("HandlerLeak")
	private void requestWeather() {
		final Handler myHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				if (msg == null) {
					return;
				}
				JSONObject object = (JSONObject) msg.obj;
				try {
					int code = object.getInt("error");
					String states = object.getString("status");
					if (code == 0 && states.equals("success")) {
						JSONArray results = object.getJSONArray("results");
						JSONObject resultObj = results.getJSONObject(0);
						JSONArray weatherArray = resultObj.getJSONArray("weather_data");
						JSONObject weatherObj = weatherArray.getJSONObject(0);

						String dayPictureUrl = weatherObj.getString("dayPictureUrl");
						String nightPictureUrl = weatherObj.getString("nightPictureUrl");

						//TODO 增加日间、夜间的判断
						int tag = DateUtil.judgeAmOrPm();
						if (tag == 0) { 		//上午
							getWeatherBitmap(dayPictureUrl);
						} else {				//下午
							getWeatherBitmap(nightPictureUrl);
						}
					} else {
						Log.d(TAG, "天气信息获取失败,code=" + code);
					}
				} catch (JSONException e) {
					Log.d(TAG, "天气信息Json解析错误");
					e.printStackTrace();
				}
				super.handleMessage(msg);
			}
		};

		new Thread(new Runnable() {
			public void run() {
				JSONObject result = getWeatherJson();
				Message msg = Message.obtain();
				msg.obj = result;
				myHandler.sendMessage(msg);
			}

			private JSONObject getWeatherJson() {
				// TODO location获取成功调用requestWeather 所以不存在location为空的情况
				String city = bdLocation.getCity();
				if (city.contains("市")) {
					city.replace("市", "");
				}
				//拼凑百度天气请求的完整url
				StringBuffer url = new StringBuffer();
				url.append(getString(R.string.url_weather));
				url.append(city);
				url.append("&output=json&ak=");
				url.append(getString(R.string.baidu_server_key));
				return HttpUtil.getJsonObjectResult(url.toString(), null);
			}
		}).start();
	}

	/**
	 * 获取图片url对应的bitmap
	 * @return
	 */
	@SuppressLint("HandlerLeak")
	private void getWeatherBitmap(final String url) {
		final Handler myHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				if (msg == null) {
					return;
				}
				weatherBitmap = (Bitmap) msg.obj;
				Log.d(TAG, "weatherBitmap convert ok!");

				mergeBitmap();
				super.handleMessage(msg);
				stopSelf();
			}
		};

		new Thread(new Runnable() {
			public void run() {
				Bitmap bitmap = ImageUtil.getNetImage(url, 1);

				Message msg = Message.obtain();
				msg.obj = bitmap;
				myHandler.sendMessage(msg);
			}
		}).start();
	}

	private String fileName = "location_weather.jpg";

	/**
	 * 合并天气、地理位置为bitmap
	 * @param bitmap
	 * @param str
	 * @return
	 */
	private Bitmap mergeBitmap() {
		if (bdLocation == null && weatherBitmap == null) {
			return null;
		}

		Bitmap mergeBitmap = null;
		if (bdLocation != null && weatherBitmap != null) {
			mergeBitmap = ImageUtil.mergeBitmap(this, weatherBitmap, TextUtils.isEmpty(bdLocation.getAddrStr())?"":bdLocation.getAddrStr());
		} else if (bdLocation != null){
			mergeBitmap = ImageUtil.convertFontBitmap(this, TextUtils.isEmpty(bdLocation.getAddrStr())?"":bdLocation.getAddrStr());
		}
		// save 操作
		//String filePath = FileUtil.saveBitmap(fileName, mergeBitmap);
		String filePath = FileUtil.saveBitmap(fileName, mergeBitmap);

		//Intent intent = new Intent(getString(R.string.location_receiver));
		//intent.putExtra("mergeBitmap", mergeBitmap);
		//intent.putExtra("fileName", fileName);
		//getApplication().sendBroadcast(intent);

		SharedPreferences mSharedPreferences = getSharedPreferences("real_video_camera", 0);
		SharedPreferences.Editor mEditor = mSharedPreferences.edit();
		mEditor.putString(getString(R.string.key_location_file_path), filePath);
        mEditor.commit();  

        Log.d(TAG, "mergeBitmap ok");

		return mergeBitmap;
	}

}
时间: 2024-10-13 20:40:51

用百度SDK获取地理位置和天气信息的相关文章

iOS 百度地图获取地理位置名称

目前很多的应用都用到了百度地图这一版本,不过有些方法是我在网上并没有找到的,但是这并不意味着就没有相关的文章介绍,那么这里我所记录的就是百度地图获取地理位置,以及省份,城市,区域,其他的不多说了,直接进入正题吧:       创建地图基本图层 首先,需要到http://dev.baidu.com/wiki/imap/index.php?title=iOS平台/相关下载下载全部内容,包括文档,示例代码和开发包. 然后获取自己的API KEY,具体方法按百度的官网申请就行,比较简单. 下载的文件应该

js ajax数据的获取小示例 天气信息填充表格

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 现在大家写写了一个简单的ajax获取数据的小示例,希望能帮助需要帮助的. html代码: 1 <table border="1" > 2 <!--因为在谷歌上会自动添加tbody标签,其他浏览器不会有这标签,所以添加tbody是为了选取元素时不会发生混乱.--> 3 <tbody> 4 <tr> 5 <th>日期</th> 6 <th&

根据经纬度调用百度地图获取详细的位置信息

访问类似下面的网址: http://api.map.baidu.com/geocoder/v2/?ak=A1758accd4ec22544bc2f200e5c83a76&location=39,116&output=json&pois=0 location代表坐标的位置,前面是纬度,后面的是经度,中间用逗号隔开. output表示返回的格式,这里用的是json. 返回结果如下:

Python实战-天气预报项目-获取天气信息

天气预报首先需要的就是天气信息,可以从中国天气网的Wap网站上获取,因为Wap网站页面简单,便于抓取内容.网址是:http://wap.weather.com.cn/wap/,默认是北京的天气预报,可以更换城市.某城市的天气预报对应的网址是http://wap.weather.com.cn/wap/weather/city_code.shtml,其中city_code是城市代码.以南京市为例,南京的城市代码是101190101,所以对应的天气预报网址就是http://wap.weather.co

HTML5获取地理位置

HTML5 Geolocation API (地理位置应用程序接口) 目前PC浏览器支持情况: Firefox 3.5+Chrome 5.0+Safari 5.0+Opera 10.60+Internet Explorer 9.0+ 手机支持情况: Android 2.0+iPhone 3.0+Opera Mobile 10.1+Symbian (S60 3rd & 5th generation)Blackberry OS 6Maemo 检测浏览器是否支持: if (navigator.geol

cordova开发中,android端利用百度sdk定位。

原文在此,感谢作者http://snoopyxdy.blog.163.com/blog/static/601174402014420872345/ 近期的一个phonegap项目把我做的焦头烂额,最让人蛋疼的就是安卓4.1.x对html5的定位获取经纬度有个无比巨大的坑,一般我们利用如下代码进行html5的定位 navigator.geolocation.getCurrentPosition(function(pos){               alert(JSON.stringify(po

通过window.navigator对象获取地理位置信息并在百度地图上显示

通过window.navigator对象获取地理位置信息 Geolocation API:用户可共享地理位置,并在Web应用的协助下享用位置感知服务(location-aware services) window.navigator下的geolocation 对象的 getCurrentPosition 方法可以获取当前位置.getCurrentPosition 方法将发起对位置信息的异步请求并将立即返回.如果该请求成功完成,则调用用来实现位置数据接收的成功回调. 下面演示如何调用 getCur

百度地图的使用之获取数据库表中信息的坐标点显示在地图上

//通用封装好的js: var map = new BMap.Map("container"); //建树Map实例 var point = new BMap.Point(103.976032, 33.845509); // 建树点坐标 map.centerAndZoom(point, 6); // 初始化地图,设置中心点坐标和地图级别. //地图事件设置函数: map.enableDragging(); //启用地图拖拽事件,默认启用(可不写) map.enableScrollWhe

HTML5获取地理位置定位信息

HTML5提供了地理位置定位功能(Geolocation API),能确定用户位置,我们可以借助HTML5的该特性开发基于地理位置信息的应用.本文结合实例给大家分享如何使用HTML5,借助百度.谷歌地图接口来获取用户准确的地理位置信息. 如何使用HTML5地理位置定位功能 定位功能(Geolocation)是HTML5的新特性,因此只有在支持HTML5的现代浏览器上运行,特别是手持设备如iphone,地理定位更加精确.首先我们要检测用户设备浏览器是否支持地理定位,如果支持则获取地理信息.注意这个