百度定位为什么要android.androidpermissionn.BAIDU

android使用百度地图、定位SDK实现地图和定位功能!(最新、可用+吐槽)
在百度地图看了几个小时的教程,发现种种问题,很大部分是百度对于定位API 网页上的DEMO代码一大堆错误!这极可能是定位SDK升级后而网页上的DEMO部分代码沿用旧版导致的。
在该示例中取了个变量叫mLocationClient,后面居然叫mLocClient,我找了半天,说这变量哪来的呢
这个错误是最致命的,在网页上的DEMO(开发指南)里居然连开始定位这个函数至始至终都没调用过!!!
新手咋看以为调用这个就可以定位了,擦,其实还应该调用mLocClient.start(); 才行,否则压根就没启动定位。。。
二、使用百度地图V2.2和定位V4.0实现地图和定位功能
1、首先将必要的库文件导入到你的项目里,具体参看这里
/map/sdkandev-2.htm
/map/geosdk-android-developv4.0.htm
2、编写代码 (MainActivity.java)
package com.android.
import android.app.A
import android.os.B
import android.os.H
import android.util.L
import android.view.M
import android.view.MenuI
import com.baidu.location.BDL
import com.baidu.location.BDLocationL
import com.baidu.location.LocationC
import com.baidu.location.LocationClientO
import com.baidu.mapapi.BMapM
import com.baidu.mapapi.map.LocationD
import com.baidu.mapapi.map.MapC
import com.baidu.mapapi.map.MapV
import com.baidu.mapapi.map.MyLocationO
import com.api.basestruct.GeoP
public class MainActivity extends Activity {
private static final String BD_KEY=&请在这里输入你的百度地图Key,这里我删除了我自己的,你自己填&;
//地图管理器
private BMapManager mBMapMan=
//地图视图
private MapView mMapView=
private LocationClient mLocationClient=
//我的位置覆盖物
private MyLocationOverlay myO
//位置在图层中的索引
private int myOverlayIndex=0;
//是否定位到我的位置
private boolean bmyLocal=
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBMapMan=new BMapManager(getApplication());
mBMapMan.init(BD_KEY, null);
setContentView(R.layout.activity_main);
//注意:请在试用setContentView前初始化BMapManager对象,否则会报错
setContentView(R.layout.activity_main);
mMapView=(MapView)findViewById(R.id.bmapsView);
mMapView.setBuiltInZoomControls(true);
//设置启用内置的缩放控件
MapController mMapController=mMapView.getController();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(point);//设置地图中心点
mMapController.setZoom(12);//设置地图zoom级别
////////////////////////定位功能代码开始
mLocationClient=new LocationClient(this);
mLocationClient.setAK(BD_KEY);
myOverlay=new MyLocationOverlay(mMapView);
LocationClientOption option=new LocationClientOption();
option.setOpenGps(true);
option.setAddrType(&all&);//返回的定位结果包含地址信息
option.setCoorType(&bd09ll&);//返回的定位结果是百度经纬度,默认值gcj02
//当不设此项,或者所设的整数值小于1000(ms)时,采用一次定位模式。
//option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.disableCache(true);//禁止启用缓存定位
option.setPoiNumber(5); //最多返回POI个数
option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息
mLocationClient.setLocOption(option);
//注册位置监听
mLocationClient.registerLocationListener(locationListener);
if(mLocationClient!=null&&!mLocationClient.isStarted())
mLocationClient.requestLocation();
mLocationClient.start();
Log.e(&LocSDK3&, &locClient is null or not started&);
private BDLocationListener locationListener=new BDLocationListener()
public void onReceiveLocation(BDLocation arg0) {
Dispose(arg0);
public void onReceivePoi(BDLocation arg0) {
Dispose(arg0);
private void Dispose(BDLocation location)
if(location==null)
StringBuffer sb = new StringBuffer(256);
sb.append(&time : &);
sb.append(location.getTime());
sb.append(&\nerror code : &);
sb.append(location.getLocType());
sb.append(&\nlatitude : &);
sb.append(location.getLatitude());
sb.append(&\nlontitude : &);
sb.append(location.getLongitude());
sb.append(&\nradius : &);
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation){
sb.append(&\nspeed : &);
sb.append(location.getSpeed());
sb.append(&\nsatellite : &);
sb.append(location.getSatelliteNumber());
else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append(&\naddr : &);
sb.append(location.getAddrStr());
//poiLocation
if(location.hasPoi()){
sb.append(&\nPoi:&);
sb.append(location.getPoi());
sb.append(&\nnoPoi information&);
//需要定位到我的位置?
if(bmyLocal)
double lat=location.getLatitude();
double lon=location.getLongitude();
LocationData data=new LocationData();
data.latitude=
data.longitude=
data.direction=2.0f;
myOverlay.setData(data);
//检查覆盖物是否存在,存在则修改,否则则添加
if(mMapView.getOverlays().contains(myOverlay))
mMapView.getOverlays().set(myOverlayIndex,myOverlay);
myOverlayIndex=mMapView.getOverlays().size();
mMapView.getOverlays().add(myOverlay);
GeoPoint geoPoint=new GeoPoint((int)(lat* 1E6),(int)(lon* 1E6));
mMapView.getController().setCenter(geoPoint);
mMapView.refresh();
Log.e(&定位结果:&,sb.toString());
//创建菜单
public boolean onCreateOptionsMenu(Menu menu)
//组、ID、排序、菜单名
menu.add(0,1,1,&我的位置&).setIcon(R.drawable.root_icon);
//处理菜单
public boolean onOptionsItemSelected(MenuItem item)
switch(item.getItemId())
//我的位置
mLocationClient.requestLocation();
mLocationClient.start();
protected void onDestroy(){
if(mLocationClient!=null&&mLocationClient.isStarted())
mLocationClient.stop();
mMapView.destroy();
if(mBMapMan!=null){
mBMapMan.destroy();
super.onDestroy();
protected void onPause(){
mMapView.onPause();
if(mBMapMan!=null){
mBMapMan.stop();
super.onPause();
protected void onResume(){
mMapView.onResume();
if(mBMapMan!=null){
mBMapMan.start();
super.onResume();
3、在Manifest.xml里注册和添加权限
&?xml version=&1.0& encoding=&utf-8&?&
&manifest xmlns:android=&/apk/res/android&
package=&com.android.test&
android:versionCode=&1&
android:versionName=&1.0&
&!-- 添加屏幕及版本支持 --&
&supports-screens android:largeScreens=&true&
android:normalScreens=&true&
android:smallScreens=&true&
android:resizeable=&true&
android:anyDensity=&true&/&
&uses-sdk android:minSdkVersion=&7& /&
&!-- 在sdcard中创建/删除文件的权限 --&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
&!-- 挂载和反挂载的权限 --&
&uses-permission android:name=&android.permission.MOUNT_UNMOUNT_FILESYSTEMS& /&
&!-- 读取手机状态 ,如来了新电话--&
&uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
&!-- 震动权限 --&
&uses-permission android:name=&android.permission.VIBRATE& /&
&!-- 网络访问权限 --&
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE& /&
&uses-permission android:name=&android.permission.ACCESS_WIFI_STATE& /&
&uses-permission android:name=&android.permission.CHANGE_WIFI_STATE& /&
&uses-permission android:name=&android.permission.INTERNET& /&
&!-- 百度地图定位功能所需权限 --&
&uses-permission android:name=&android.permission.ACCESS_FINE_LOCATION& /&
&permission android:name=&android.permission.BAIDU_LOCATION_SERVICE& /&
&uses-permission android:name=&android.permission.BAIDU_LOCATION_SERVICE& /&
&uses-permission android:name=&android.permission.ACCESS_COARSE_LOCATION& /&
&uses-permission android:name=&android.permission.ACCESS_MOCK_LOCATION& /&
&uses-permission android:name=&android.permission.ACCESS_GPS&/&
&uses-permission android:name=&android.permission.READ_LOGS& /&
&application
android:allowBackup=&true&
android:icon=&@drawable/icon&
android:label=&@string/app_name&
android:theme=&@android:style/Theme.Black&
android:persistent=&true& &
android:name=&.MainActivity&
android:label=&@string/app_name&
android:screenOrientation=&portrait&
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
&!-- 百度定位服务
android:permission=&android.permission.BAIDU_LOCATION_SERVICE&&--&
&service android:name=&com.baidu.location.f& android:enabled=&true& android:process=&:remote&&
&/service&
&/application&
&/manifest&Android 百度定位SDKv4.2及6.0_百度定位实例_安卓定位实例_DD博客
Android 百度定位SDKv4.2
收款微信号 dwtedx
支付宝帐户
比特币帐户
深度剖解各个领域业务流程、全面展示自己的所长及个人发展新思路
微信公众号 : (推荐)
备案信息 :
DD博客上的所有软件和源码Demo及相关资料均为软件商和个人工作总结或网友推荐及网络收集整理而来、仅供学习和研究使用、切勿用做商业用途、如有侵犯版权者、请来信到邮箱 : 指出、DD博客将立即修正、净化网络版权环境、同时DD博客也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害
& Copyright 2017. All rights reserved.2792人阅读
百度地图开发(3)
导入库文件
在下载页面下载最新的库文件。将liblocSDK2.4.so文件拷贝到libs/armeabi目录下。将locSDK2.4.jar文件拷贝到工程根目录下,并在工程属性-&Java Build Path-&Libraries中选择“Add JARs”,选定locSDK2.4.jar,确定后返回。这样您就可以在程序中使用百度定位API了。&
设置AndroidManifest.xml
为区分2.3版本service,需要将manifest file中的 intent filter声明为com.baidu.location.service_v2.4 在application标签中声明service组件
&service android:name=&com.baidu.location.f& android:enabled=&true& android:process=&:remote& android:permission=&android.permission.BAIDU_LOCATION_SERVICE&&
&intent-filter&
&action android:name=&com.baidu.location.service_v2.4&&&/action&
&/intent-filter&&/service&
声明使用权限
&permission android:name=&android.permission.BAIDU_LOCATION_SERVICE&&&/permission&&uses-permission android:name=&android.permission.BAIDU_LOCATION_SERVICE&&&/uses-permission&&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&
import相关类
import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
功能类的使用
初始化LocationClient类
此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
public LocationClient mLocationClient = null;public BDLocationListener myListener = new MyLocationListener();&public void onCreate() {
mLocationClient = new LocationClient(this);
//声明LocationClient类
mLocationClient.registerLocationListener( myListener );
//注册监听函数}
实现BDLocationListener接口
BDLocationListener接口有2个方法需要实现:
1.接收异步返回的定位结果,参数是BDLocation类型参数。
2.接收异步返回的POI查询结果,参数是BDLocation类型参数。
public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) {
if (location == null)
sb = new (256);
sb.append(&time&: &);
sb.append(location.getTime());
sb.append(&\nerror code&: &);
sb.append(location.getLocType());
sb.append(&\nlatitude&: &);
sb.append(location.getLatitude());
sb.append(&\nlontitude&: &);
sb.append(location.getLongitude());
sb.append(&\nradius&: &);
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation){
sb.append(&\nspeed&: &);
sb.append(location.getSpeed());
sb.append(&\nsatellite&: &);
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append(&\naddr&: &);
sb.append(location.getAddrStr());
logMsg(sb.toString()); }public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null){
sb = new (256);
sb.append(&Poi time&: &);
sb.append(poiLocation.getTime());
sb.append(&\nerror code&: &);
sb.append(poiLocation.getLocType());
sb.append(&\nlatitude&: &);
sb.append(poiLocation.getLatitude());
sb.append(&\nlontitude&: &);
sb.append(poiLocation.getLongitude());
sb.append(&\nradius&: &);
sb.append(poiLocation.getRadius());
if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append(&\naddr&: &);
sb.append(poiLocation.getAddrStr());
if(poiLocation.hasPoi()){
sb.append(&\nPoi:&);
sb.append(poiLocation.getPoi());
sb.append(&noPoi information&);
logMsg(sb.toString());
设置定位参数包括:定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。eg:
LocationClientOption option = new LocationClientOption();option.setOpenGps(true);option.setAddrType(&detail&);option.setCoorType(&gcj02&);option.setScanSpan(5000);option.disableCache(true);//禁止启用缓存定位option.setPoiNumber(5); //最多返回POI个数 option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息
mLocClient.setLocOption(option);
发起定位请求
发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
if (mLocClient != null && mLocClient.isStarted()) mLocClient.requestLocation();else
Log.d(&LocSDK_2.0_Demo1&, &locClient is null or not started&);
发起POI查询请求
发起POI查询请求。请求过程是异步的,定位结果在上面的监听函数onReceivePoi中获取。
if (mLocClient != null && mLocClient.isStarted()) mLocClient.requestPoi();
位置提醒使用
位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
//位置提醒相关代码mNotifyer = new NotifyLister();mNotifyer.SetNotifyLocation(42.37,113.6,3000,&gps&);//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)mLocationClient.registerNotify(mNotifyer);//注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
//BDNotifyListner实现public class NotifyLister extends BDNotifyListener{
public void onNotify(BDLocation mlocation, float distance){ mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
//取消位置提醒mLocationClient.removeNotifyEvent(mNotifyer);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3299620次
积分:20841
积分:20841
排名:第363名
原创:25篇
转载:808篇
评论:894条
(26)(1)(5)(3)(74)(30)(126)(18)(3)(1)(3)(7)(16)(43)(1)(5)(2)(2)(1)(18)(6)(3)(27)(10)(7)(6)(2)(7)(8)(1)(6)(27)(22)(9)(29)(30)(42)(19)(34)(10)(27)(83)(17)(17)用百度地图API实现Android定位功能(2.6版本为例)
在下载页面下载最新的库文件。
/map/geosdk-android-download.htm
将liblocSDK2.4.so文件拷贝到libs/armeabi目录下。将locSDK2.6.jar文件拷贝 到工程根目录下,并在工程属性-&Java Build Path-&Libraries中选择&Add
JARs&,选定locSDK2.6.jar,确定后返回。这样您就可以在程序中使用百度定位SDK了。
为区分旧版本service,需要将manifest file中的 intent filter声明为com.baidu.location.service_v2.6 在application标签中声明service组件。
&service&android:name=&com.baidu.location.f&&android:enabled=&true&&android:process=&:remote&&&&&&android:permission=&android.permission.BAIDU_LOCATION_SERVICE&&&&intent-filter&&&&&&&action&android:name=&com.baidu.location.service_v2.6&&&/action&&&/intent-filter&&&/service&&
声明使用权限
&permission&android:name=&android.permission.BAIDU_LOCATION_SERVICE&&&/permission&&&uses-permission&android:name=&android.permission.BAIDU_LOCATION_SERVICE&&&/uses-permission&&&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&&
import&com.baidu.location.BDL&import&com.baidu.location.BDLocationL&import&com.baidu.location.LocationC&import&com.baidu.location.LocationClientO&import&com.baidu.location.BDNotifyL&
此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
public&LocationClient&mLocationClient&=&null;&public&BDLocationListener&myListener&=&new&MyLocationListener();&&&public&void&onCreate()&{&mLocationClient&=&new&LocationClient(this);&&mLocationClient.registerLocationListener(&myListener&);&&}&
BDLocationListener接口有2个方法需要实现:
1.接收异步返回的定位结果,参数是BDLocation类型参数。
2.接收异步返回的POI查询结果,参数是BDLocation类型参数。
public&class&MyLocationListenner&implements&BDLocationListener&{&@Override&public&void&onReceiveLocation(BDLocation&location)&{&if&(location&==&null)&return&;&StringBuffer&sb&=&new&StringBuffer(256);&sb.append(&time&:&&);&sb.append(location.getTime());&sb.append(&\nerror&code&:&&);&sb.append(location.getLocType());&sb.append(&\nlatitude&:&&);&sb.append(location.getLatitude());&sb.append(&\nlontitude&:&&);&sb.append(location.getLongitude());&sb.append(&\nradius&:&&);&sb.append(location.getRadius());&if&(location.getLocType()&==&BDLocation.TypeGpsLocation){&sb.append(&\nspeed&:&&);&sb.append(location.getSpeed());&sb.append(&\nsatellite&:&&);&sb.append(location.getSatelliteNumber());&}&else&if&(location.getLocType()&==&BDLocation.TypeNetWorkLocation){&sb.append(&\naddr&:&&);&sb.append(location.getAddrStr());&}&&&logMsg(sb.toString());&}&public&void&onReceivePoi(BDLocation&poiLocation)&{&if&(poiLocation&==&null){&return&;&}&StringBuffer&sb&=&new&StringBuffer(256);&sb.append(&Poi&time&:&&);&sb.append(poiLocation.getTime());&sb.append(&\nerror&code&:&&);&sb.append(poiLocation.getLocType());&sb.append(&\nlatitude&:&&);&sb.append(poiLocation.getLatitude());&sb.append(&\nlontitude&:&&);&sb.append(poiLocation.getLongitude());&sb.append(&\nradius&:&&);&sb.append(poiLocation.getRadius());&if&(poiLocation.getLocType()&==&BDLocation.TypeNetWorkLocation){&sb.append(&\naddr&:&&);&sb.append(poiLocation.getAddrStr());&}&if(poiLocation.hasPoi()){&sb.append(&\nPoi:&);&sb.append(poiLocation.getPoi());&}else{&&&sb.append(&noPoi&information&);&}&logMsg(sb.toString());&}&}&
设置定位参数包括:定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。eg:
LocationClientOption&option&=&new&LocationClientOption();&option.setOpenGps(true);&option.setAddrType(&detail&);&option.setCoorType(&gcj02&);&option.setScanSpan(5000);&option.disableCache(true);&option.setPoiNumber(5);&&option.setPoiDistance(1000);&&option.setPoiExtraInfo(true);&&mLocClient.setLocOption(option);&
发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
if&(mLocClient&!=&null&&&&mLocClient.isStarted())&mLocClient.requestLocation();&else&Log.d(&LocSDK_2.0_Demo1&,&&locClient&is&null&or&not&started&);&
发起POI查询请求。请求过程是异步的,定位结果在上面的监听函数onReceivePoi中获取。
if&(mLocClient&!=&null&&&&mLocClient.isStarted())&mLocClient.requestPoi();&
位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
&mNotifyer&=&new&NotifyLister();&mNotifyer.SetNotifyLocation(42.37,113.6,3000,&gps&);&mLocationClient.registerNotify(mNotifyer);&&
&public&class&NotifyLister&extends&BDNotifyListener{&public&void&onNotify(BDLocation&mlocation,&float&distance){&mVibrator01.vibrate(1000);&}&}&
&mLocationClient.removeNotifyEvent(mNotifyer);&
定位SDK需要应用程序保证网络连接通畅。
定位SDK的调用必须在主线程中进行。
我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。
文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。

我要回帖

更多关于 android hipermission 的文章

 

随机推荐