以下实现通过百度SDK获取地理位置和天气信息,请參考

title=android-locsdk/guide/v5-0">百度开发文档

1.
相关下载最新的库文件。将so文件的压缩文件解压出来,把相应架构下的so文件放入开发人员自己APP的相应架构下的目录中,建议所有放入。
程序兼容性会大大提升,将locSDK_5.X.jar文件复制到project的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;
} }

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

  1. Vue 通过调用百度API获取地理位置-经度纬度省份城市

    一.首先在百度api注册获得ak密钥 二.新建js文件,我命名为loadBMap.js,里面创建script,代码如下: /** * 加载地图 * @param {Function} callback ...

  2. java解析xml实例——获取天气信息

    获取xml并解析其中的数据: package getweather.xml; import java.io.IOException; import java.util.HashMap; import ...

  3. Linux网络编程之"获取网络天气信息"

    需求分析: 1.需要Linux c 网络编程基础, 2.需要了解 http 协议 3.需要天气信息相关api(可以从阿里云上购买,很便宜的!) 4.需要cJSON解析库(因为获取到的天气信息一般是用c ...

  4. 百度api:根据经纬度获取地理位置信息

    调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...

  5. Hbuilder获取手机当前地理位置的天气

    前言:前面一段时间,公司项目里有一个需求 是获取当前手机地理位置当天的天气情况  将实时天气信息提供给客户.在网上搜索资料时候,发现知识很零碎,自己实现以后整理出来,方便于各位的学习与使用. 一.获取 ...

  6. 内网公告牌获取天气信息解决方案(C# WebForm)

    需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...

  7. Html5 Geolocation获取地理位置信息

    Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置.基于此特性可以开发基于位置的服务应用.在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用. ...

  8. 谷歌、腾讯、百度相应API批量获取地理位置坐标信息及其优缺点

    目录: 申请ak 批量获取地理位置 目的:通过给定的地理位置名称(如:北京市海淀区上地十街十号),获取经纬度信息. 1.申请ak 以百度Geocoding API为例:http://lbsyun.ba ...

  9. AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能

    HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...

随机推荐

  1. 借助svn进行半自动多台服务器上线部署

    传统简单保留 如果web服务器就那么几台,大致可以在测试服务器上测试好以后,直接在正式的web服务器 压缩拷贝一个,然后再覆盖下,进行简单暴力的发布. 这种纯手工发布往往会带来几个问题 压缩一不小心把 ...

  2. Apache配置实现日志按天分割并删除指定几天前的日志

    Apache日志默认情况下是一周切割一次,由于访问量大的时候日志的文件还是比较大的,同时也不利于管理员对日志的分析处理.于是尝试对Apache日志设置按天分割,并通过计划任务执行删除几天的日志. 配置 ...

  3. 【LOJ】#2172. 「FJOI2016」所有公共子序列问题

    题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪 ...

  4. 【C#】线程问题

    多线程编程对很多程序员来说并不容易,在启动访问相同数据的多个线程时,会间歇性地遇到难以发现的问题.如果使用任务.并行LINQ或Parallel类,也会遇到这些问题.为了避免这一系列问题,开发程序中必须 ...

  5. vue中使用ueditor富文本编辑框

    1.把下载的Ueditor资源,放入静态资源static中. 修改ueditor.config.js中的window.UEDITOR_HOME_URL配置,如下图: 2.在main.js中引入以下文件 ...

  6. HDU 6183 Color it

    线段树. 假设只有一种颜色,因为每次询问有一个$x$一定是$1$,那么我可以想办法找出每一个$y$最小的$x$是多少,如果最小的都不符合,那么一定不符合,因为更新变成了单点更新,询问是区间询问最小值, ...

  7. Xamarin.Forms XAML的辅助功能Code Snippet

    Xamarin.Forms XAML的辅助功能Code Snippet   在Visual Studio中,使用Code Snippet(代码片段)功能可以减少基础代码的编写量,如常见的标签.循环语句 ...

  8. FastReport.Net使用:[24]其他控件(邮政编码(Zip Code),网格文本(Cellular Text)以及线性刻度尺(Linear Gauge))

    邮政编码(Zip Code) Zip Code仅支持数字(0~9) Zip Code支持数据列绑定,表达式,文本等模式 可通过修改SegmentCount属性的值来确定Zip Code的位数. 数字右 ...

  9. 【UOJ #205】【APIO 2016】Fireworks

    http://uoj.ac/problem/205 好神的题啊. dp[i][j]表示以i为根的子树调整成长度j需要的最小代价. 首先要观察到dp值是一个下凸壳. 因为从儿子合并到父亲时要把所有儿子的 ...

  10. 【期望DP】BZOJ2318-[Spoj4060]Game with probability Problem

    [题目大意] Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币 ...