2017-02-06 11:38:13 qq_27733683 阅读数 6108
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4853 人正在学习 去看看 Frank Lee

问题描述:Android中百度地图进行定位,如果我们要将当前位置显示到地图上,在使用时我们会用到定位监听器,然后将获得到的位置对BaiduMap对象进行位置上的更新,达到显示当前位置的目的。由于我们在定位后还可能要进行自主的移动,则我们会用一个flag标识是否已经定位到当前的位置。但是在使用flag后,由于第一次定位,BaiduMap可能还未加载成功,导致地图无法移动到我们当前位置。

解决方式:在地图移动成功后再进行flag的修改。

改后的代码:

	/*移动到指定位置*/
	private void navigateTo(BDLocation location){
	    if (isFirstLocate){
	        LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
	        MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
	        mBaiduMap.animateMapStatus(update);
	        update = MapStatusUpdateFactory.zoomTo(16f);
	        mBaiduMap.animateMapStatus(update);
	        /*判断baiduMap是已经移动到指定位置*/
	        if (mBaiduMap.getLocationData()!=null)
	        if (mBaiduMap.getLocationData().latitude==location.getLatitude()
	                &&mBaiduMap.getLocationData().longitude==location.getLongitude()){
	            isFirstLocate = false;
	        }
	    }
	    MyLocationData.Builder locationBuilder =
	            new MyLocationData.Builder();
	    locationBuilder.latitude(location.getLatitude());
	    locationBuilder.longitude(location.getLongitude());
	    MyLocationData locationData = locationBuilder.build();
	    mBaiduMap.setMyLocationData(locationData);
	}
注:在描述中如果出现问题,希望大家能够指正。

2017-11-17 17:07:44 mingtiannihao0522 阅读数 5221
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4853 人正在学习 去看看 Frank Lee

一.注册百度地图开放平台,并创建一个应用

百度地图开放平台:http://lbsyun.baidu.com/
创建应用:http://lbsyun.baidu.com/apiconsole/key/create

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z41RK1wY-1571880127380)(http://img.blog.csdn.net/20171117164837129?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWluZ3RpYW5uaWhhbzA1MjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

注意此处需要SHA1 :

MAC下获取:输入命令: keytool -list -v -keystore ~/.android/debug.keystore
注:debug.keystore只是默认调试的签名钥
密码:android
这里写图片描述
window 自行百度,方法多得是

应用创建结束后。会得到一个key

二.下载相应的SDK

http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

三.打开或新建一个android项目,配置
1.添加SDK(jar + so):
a.将jar放到lib下
b.在main文件夹下新建jniLibs文件夹,将so文件放进去
这里写图片描述

2.配置build.gradle文件
这里写图片描述

3.添加AK
Android定位SDK自v4.0版本起,需要进行AK鉴权。开发者在使用SDK前,需完成AK申请,并在AndroidManifest.xml文件中,正确填写AK。
在Application标签中增加如下代码:

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

4.添加定位权限
使用定位SDK,需在Application标签中声明service组件,每个App拥有自己单独的定位service,代码如下:

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

除添加service组件外,使用定位SDK还需添加如下权限:

<!-- 这个权限用于进行网络定位-->
<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卡读取权限,用户写入离线定位数据-->

四.Activity中

利用定位SDK,不仅可以快速精准的获得经纬度信息,还可以获得当前地点的地址信息,便于开发者使用。

获取地址与获取经纬度使用方法一致,只需在配置定位SDK参数时,做相关的设置即可。此外,如果需要地址信息,需确保手机能够正常连接网络。

具体步骤如下:

1第一步,准备工作
在使用定位SDK进行具体开发工作之前,需获取开发密钥(AK),并对开发工程进行环境配置工作。详细介绍请参考项目创建部分的说明。 此外,Google在Android 6.0中引入了动态权限获取机制,开发者在使用定位SDK之前,请详细了解关于Android 6.0系统开发须知。
2第二步,初始化LocationClient类
请在主线程中声明LocationClient类对象,该对象初始化需传入Context类型参数。推荐使用getApplicationConext()方法获取全进程有效的Context。
核心代码段如下:

public LocationClient mLocationClient = null;
private MyLocationListener myListener = new MyLocationListener();
//BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口
//原有BDLocationListener接口暂时同步保留。具体介绍请参考后文中的说明
public void onCreate() {
    mLocationClient = new LocationClient(getApplicationContext());     
    //声明LocationClient类
    mLocationClient.registerLocationListener(myListener);    
    //注册监听函数
}

3第三步,配置定位SDK参数
此处请开发者注意,如果想获取地址信息,需在配置LocationClientOption类时做相应的设置。设置方法与获取经纬度中第三步类似,核心代码如下:

LocationClientOption option = new LocationClientOption();

option.setIsNeedAddress(true);
//可选,是否需要地址信息,默认为不需要,即参数为false
//如果开发者需要获得当前点的地址信息,此处必须为true

mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明

4第四步,实现BDAbstractLocationListener接口
Android定位SDK自v7.2版本起,对外提供了Abstract类型的监听接口BDAbstractLocationListener,用于实现定位监听。原有BDLocationListener暂时保留,推荐开发者升级到Abstract类型的新监听接口使用,该接口会异步获取定位结果,核心代码如下:

public class MyLocationListener implements BDAbstractLocationListener{
    @Override
    public void onReceiveLocation(BDLocation location){
        //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
        //以下只列举部分获取地址相关的结果信息
        //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
			
        String addr = location.getAddrStr();    //获取详细地址信息
        String country = location.getCountry();    //获取国家
        String province = location.getProvince();    //获取省份
        String city = location.getCity();    //获取城市
        String district = location.getDistrict();    //获取区县
        String street = location.getStreet();    //获取街道信息
    }
}

5第五步,获取定位地址信息
调用LocationClient的start()方法,发起请求,在BDAbstractLocationListener接口中,便可获得定位地址相关的信息。
详细信息请参考获取经纬度中第五步的介绍。

附上下载地址
http://download.csdn.net/download/mingtiannihao0522/10123215

2016-10-12 15:19:32 qq_34589749 阅读数 514
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4853 人正在学习 去看看 Frank Lee

前期的配置啥的就不说了,主要是上代码。

    private MapView mMapView = null;
    public BaiduMap mBaiduMap = null;
    private LocationClient mLocationClient = null;
    public BDLocationListener mListener = new MyLocationListener();

private void initMapView() {
mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        mMapView.showZoomControls(false);//屏蔽百度地图的放大按钮
        // 获取百度地图兵进行当前位置定位---------------------
        mBaiduMap.setMyLocationEnabled(true);
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(16).build()));
        mLocationClient = new LocationClient(mContext);
        mLocationClient.registerLocationListener(mListener);
        mBaiduMap.setMyLocationConfigeration(
                new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, null));
        initLocation();
        }

//设置定位的模式 坐标,需不需要开GPS等
    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);
        option.setCoorType("bd09ll");
        // option.setScanSpan(0);
        // option.setIsNeedAddress(true);
        option.setOpenGps(true);
        // option.setIsNeedLocationDescribe(true);
        mLocationClient.setLocOption(option);
    }
        //定位当前位置-----------------------------------
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub

            if (location == null) {
                return;
            }
            main_BDlocation = location;
            MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius()).direction(100)
                    .latitude(location.getLatitude()).longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(u);

            }

        }

    }
2015-05-29 00:41:35 u011240877 阅读数 2745
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4853 人正在学习 去看看 Frank Lee

百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口。 可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。

简单的说就是可以通过调用它绘制地图,也可以进行定位。而我这次使用百度 地图API要实现类似QQ发表说说时的定位功能:

这里写图片描述
这里写图片描述

1. 使用前准备:

这里写图片描述

百度地图SDK官网下载demo,里面有我们需要的jar包和so文件。
locSDK_XXX.jar包和 armeabi文件夹以及其中的liblocSDKX.so文件复制粘贴到libs文件夹下。并添加到构建路径。

至于密钥可以从官网获取,好像挺快,也可以直接用这个:

<!-- meta-data里添加密匙key,需要写在application中 -->  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="sGFSyZlrvnHGr9GipH70G6Nd" />

2. 代码:

定位还是比较简单的,只有2个类一个布局即可实现:

  • LocationApplication.java
package com.sxkeji.baidumapdemo;

import android.app.Application;
import android.util.Log;
import android.widget.TextView;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;

public class LocationApplication extends Application{
     public LocationClient mLocationClient;//定位SDK的核心类  
     public MyLocationListener mMyLocationListener;//自定义的监听类  
     public TextView mLocationResult,logMsg; 
     @Override
    public void onCreate() {
        super.onCreate();
        mLocationClient = new LocationClient(this.getApplicationContext());  
        mMyLocationListener = new MyLocationListener(); 
        //注册监听器
        mLocationClient.registerLocationListener(mMyLocationListener); 
    }
     /** 
         * 实现实位回调监听 
         */  
        public class MyLocationListener implements BDLocationListener {  
            //mLocationClient.start()启动定位时回调这个方法
            public void onReceiveLocation(BDLocation location) {  
                //Receive Location   
                StringBuffer sb = new StringBuffer(256);  
                sb.append("time : ");  
                sb.append(location.getTime());//获得当前时间  
//              sb.append("\nerror code : ");  
//              sb.append(location.getLocType());//获得erro code得知定位现状  
//              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){//通过GPS定位  
//                  sb.append("\nspeed : ");  
//                  sb.append(location.getSpeed());//获得速度  
//                  sb.append("\nsatellite : ");  
//                  sb.append(location.getSatelliteNumber());  
//                  sb.append("\ndirection : ");  
//                  sb.append("\naddr : ");  
                    sb.append(location.getAddrStr());//获得当前地址  
                    sb.append(location.getDirection());//获得方位  
                } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){//通过网络连接定位  
                    sb.append("\naddr : ");  
                    sb.append(location.getAddrStr());//获得当前地址  
                    //运营商信息  
//                  sb.append("\noperationers : ");  
//                  sb.append(location.getOperators());//获得经营商?  
                }  
                logMsg(sb.toString());  
                Log.i("BaiduLocationApiDem", sb.toString());  
            }  
        }  

        /** 
         * 显示请求字符串 
         * @param str 
         */  
        public void logMsg(String str) {  
            try {  
                if (mLocationResult != null)  
                    mLocationResult.setText(str);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }
}

MainActivity.java

package com.sxkeji.baidumapdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;

public class MainActivity extends Activity {
    private LocationClient mLocationClient;//定位SDK的核心类  
    private TextView LocationResult;  
    private Button startLocation;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLocationClient = ((LocationApplication)getApplication()).mLocationClient;  

        LocationResult = (TextView)findViewById(R.id.tv);  
         ((LocationApplication)getApplication()).mLocationResult = LocationResult;//调用LocationApplication,获得需要的信息  
        startLocation = (Button)findViewById(R.id.add);  
        startLocation.setOnClickListener(new OnClickListener() {  

            public void onClick(View v) {  
                InitLocation();//初始化  
                if(startLocation.getText().equals("开启定位")){  
                    mLocationClient.start();  
                    startLocation.setText("停止定位");  
                }else{  
                    mLocationClient.stop();  
                    startLocation.setText("开启定位");  
                }  
            }  
        });  

    }
    @Override  
    protected void onStop() {  
        mLocationClient.stop();  
        super.onStop();  
    }  

    private void InitLocation(){  
        LocationClientOption option = new LocationClientOption();  
        option.setLocationMode(LocationMode.Hight_Accuracy);//设置高精度定位定位模式  
        option.setCoorType("bd09ll");//设置百度经纬度坐标系格式  
        option.setScanSpan(1000);//设置发起定位请求的间隔时间为1000ms  
        option.setIsNeedAddress(true);//反编译获得具体位置,只有网络定位才可以  
        mLocationClient.setLocOption(option);  
    }  

}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <Button 
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="开启定位"/>
</RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sxkeji.baidumapdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <!-- 定位权限 -->  
    <!-- 这个权限用于进行网络定位 --> 
    <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>  


    <application  
        android:name="com.sxkeji.baidumapdemo.LocationApplication"  
        android:allowBackup="true"  
        android:icon="@drawable/ic_launcher"  
        android:label="@string/app_name"  
        android:theme="@style/AppTheme" >  
        <service  
            android:name="com.baidu.location.f"  
            android:enabled="true"  
            android:process=":remote" >  
            <intent-filter>  
                <action android:name="com.baidu.location.service_v2.2" >  
                </action>  
            </intent-filter>  
        </service>  

        <!-- meta-data里添加密匙key,需要写在application中 -->  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="sGFSyZlrvnHGr9GipH70G6Nd" />  

        <activity  
            android:name="com.sxkeji.baidumapdemo.MainActivity"  
            android:label="@string/app_name" >  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  

                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>  


</manifest>

以上就是全部代码,运行后就可以得到当前时间与具体位置:
这里写图片描述

3.可能出现的bug:

百度定位SDK错误:Couldn’t load locSDK3: findLibrary returned null

根据错误提示是无法找到locSDK3这个库,但是又明明在armeabi中加入了liblocSDK3.so。被这个问题困扰了很久。在做NDK开发的时候,NDK编译的so有时会在armeabi和armeabi-v7a中分别放置一份。突然想到上面的错误是不是也是因为这个原因。

然后在项目的libs目录下新建一个文件夹,命名为armeabi-v7a,然后将liblocSDK3.so复制一份到该文件夹。

再次运行项目,发现错误已经解决。

拭心记于2015/5/29 0:40 http://blog.csdn.net/u011240877

点击查看拭心Android实习生期间的收获分享

点击查看Android中文API,总有你不知道的

2018-03-26 14:36:19 ASFang 阅读数 2424
  • Android 开发 第三方SDK 百度定位SDK

    百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、、高效的定位功能。 主要内容包括简介 密钥申请 环境配置、定位SDK使用,获取当前位置信息 等知识

    4853 人正在学习 去看看 Frank Lee

说明:通过定位sdk获取的BDLocation类中包含了当前位置的:经纬度,省、市、区、街道等地址信息。如果应用只需要获取用户当前位置所在的市、县、区等信息,那么定位sdk就可以满足你的需求。如果要具体显示位置在哪,除了通过定位sdk获取经纬度之外,还需要通过百度地图来显示。

效果图:

参考百度定位开发文档:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/get-location/latlng

一、引入定位的so包

注意:我这个是续接上一篇的

Android入门之——百度地图开发(一)

二、添加定位权限

 

<!-- 这个权限用于进行网络定位-->
<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.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卡读取权限,用户写入离线定位数据-->

 

三、在Application标签中声明service组件

 

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

四、代码

1.定义四个变量

BaiduMap mBaiduMap;//定义地图实例

public LocationClient mLocationClient = null;//定义LocationClient 
private MyLocationListener myListener = new MyLocationListener();//继承BDAbstractLocationListener的class
boolean ifFrist = true;//判断是否是第一次进去

2.onCreat方法

 mBaiduMap = mMapView.getMap();//获取地图实例对象
        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        //设置定位图标是否有箭头
        mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true,null));
        //声明LocationClient类
        mLocationClient = new LocationClient(getApplicationContext());
        //注册监听函数
        mLocationClient.registerLocationListener(myListener);

初始化LocationClientOption

 LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选,设置定位模式,默认高精度
        //LocationMode.Hight_Accuracy:高精度;
        //LocationMode. Battery_Saving:低功耗;
        //LocationMode. Device_Sensors:仅使用设备;

        option.setCoorType("bd09ll");
        //可选,设置返回经纬度坐标类型,默认gcj02
        //gcj02:国测局坐标;
        //bd09ll:百度经纬度坐标;
        //bd09:百度墨卡托坐标;
        //海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标

        option.setScanSpan(1000);
        //可选,设置发起定位请求的间隔,int类型,单位ms
        //如果设置为0,则代表单次定位,即仅定位一次,默认为0
        //如果设置非0,需设置1000ms以上才有效

        option.setOpenGps(true);
        //可选,设置是否使用gps,默认false
        //使用高精度和仅用设备两种定位模式的,参数必须设置为true

        option.setLocationNotify(true);
        //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false

        option.setIgnoreKillProcess(false);
        //可选,定位SDK内部是一个service,并放到了独立进程。
        //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)

        option.SetIgnoreCacheException(false);
        //可选,设置是否收集Crash信息,默认收集,即参数为false

        option.setWifiCacheTimeOut(5 * 60 * 1000);
        //可选,7.2版本新增能力
        //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位

        option.setEnableSimulateGps(false);
        //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
        option.setIsNeedAddress(true);

LocationClient设置LocationClientOption参数

mLocationClient.setLocOption(option);//将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用

3.开启定位

 @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
        //调用LocationClient的start()方法,便可发起定位请求
        mLocationClient.start();
    }

4.MyLocationListener实现

 public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明

            double latitude = location.getLatitude();    //获取纬度信息
            double longitude = location.getLongitude();    //获取经度信息
            float radius = location.getRadius();    //获取定位精度,默认值为0.0f

            String coorType = location.getCoorType();
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准

            int errorCode = location.getLocType();
            Log.i("---------", location.getCityCode() + "---" + latitude + "--" + longitude + "----" + coorType + "--" + location.getCountry() + "--" + location.getCity() + "--" + location.getAddrStr());
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明

          /*  // 构造定位数据
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();

            // 设置定位数据
            mBaiduMap.setMyLocationData(locData);*/

            if (ifFrist) {
                LatLng ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
                // 移动到某经纬度
                mBaiduMap.animateMapStatus(update);
                update = MapStatusUpdateFactory.zoomBy(5f);
                // 放大
                mBaiduMap.animateMapStatus(update);

                ifFrist = false;
            }

            // 显示个人位置图标
            MyLocationData.Builder builder = new MyLocationData.Builder();
            builder.latitude(location.getLatitude());
            builder.longitude(location.getLongitude());
            MyLocationData data = builder.build();
            mBaiduMap.setMyLocationData(data);
        }
    }

5.activity销毁时候销毁定位

 @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
    }

至此定位就可以出来,不清楚的可以看注释也可以留言提问;

 

没有更多推荐了,返回首页