百度定位SDK5.0用法

导入库文件

相关下载最新的库文件。将so文件的压缩文件解压出来,把对应架构下的so文件放入开发者自己APP的对应架构下的文件夹中(我只把所有的文件复制到lib文件夹下,即拷贝到libs目录下,如下图所示),建议全部放入,程序兼容性会大大提升,将locSDK_5.0.jar文件拷贝到工程的libs目录下(注意需要在项目属性的java Build Path中加入),这样您就可以在程序中使用百度定位SDK了。

 

设置AndroidManifest.xml

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

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

声明使用权限

<!-- 这个权限用于进行网络定位-->
<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>

导入相关类就不说了,Eclipse到时候会自动帮我们导入

 

 

设置AcessKey

 

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

设置AccessKey,在application标签中加入(具体需要安全码组成:数字签名+;+包名,数字签名在window--preference--Android----Build下的SHA1 fingerprint;包名就不说了)

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

完整的Mamifest.xml文件内容如下:

 

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

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />
    <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>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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>

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

        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="YI2f1rlaXdxEGFnzuKALtglP" />
    </application>

</manifest>
View Code

相关的功能函数,参见官方文档,下面贴代码

MainActivity.java

package com.example.servicedemo;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

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该类
//如果使用地理围栏功能,需要import如下类
public class MainActivity extends Activity {
    Button sendButton;
    MsgReceiver msgReceiver;
    TextView resultView;
    public static final String MY_RECEIVER = "com.example.servicedemo.MyService";
    /**
     * 测试百度定位
     */
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendButton = (Button) findViewById(R.id.button1);
        resultView = (TextView)findViewById(R.id.textView1);
        sendButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method
//                Intent intent = new Intent(MY_RECEIVER);//启动服务
//                startService(intent);
                //启动定位
                if (mLocationClient == null) {
                    return;
                }
                if (mLocationClient.isStarted()) {
                    mLocationClient.stop();
                }else {
                    mLocationClient.start();
                    mLocationClient.requestLocation();
                }
            }
        });
        mLocationClient = new LocationClient(getApplicationContext()); //声明Location
        mLocationClient.setLocOption(setUp());//设置定位条件
        mLocationClient.registerLocationListener( myListener );    //注册定位监听函数
        msgReceiver = new MsgReceiver();
         IntentFilter intentFilter = new IntentFilter();  
            intentFilter.addAction("com.example.servicedemo.LOCATION");//过滤器  
            registerReceiver(msgReceiver, intentFilter);  
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
//        Intent intent = new Intent(MY_RECEIVER);//启动服务
//        stopService(intent);
//        unregisterReceiver(msgReceiver);
        if (mLocationClient != null && mLocationClient.isStarted()) {

            mLocationClient.unRegisterLocationListener(myListener);//取消监听函数
            mLocationClient.stop();
            mLocationClient =null;
        }
        super.onDestroy();
    }
    public class MyLocationListener implements BDLocationListener{//实现BDLocationListener接口

        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub
            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){//获取error code
            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());
        } 

        System.out.println(sb.toString());
        resultView.setText(sb.toString());
        }
        
    }
    /**
     * 定位参数设置
     */
    public LocationClientOption setUp() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
        option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
        option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
        option.setIsNeedAddress(true);//返回的定位结果包含地址信息
        option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
        return option;
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public class MsgReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            // 拿到进度,更新UI
            int progress = intent.getIntExtra("progress", 0);
            System.out.println(progress);
        }
    }
}
View Code

本来想弄个service的,但是看看开发文档,貌似已经在service中运行了,所以反而觉得没有必要了,不过开始写了就贴下吧,好得也可以复习下Activity和Service之间通过广播通信是咧(注意MainActivity.java中注释的部分):

 

MyService.java

 

package com.example.servicedemo;

import com.baidu.location.LocationClient;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {

	/**
	 * 进度条的最大值
	 */
	public static final int MAX_PROGRESS = 100;
	/**
	 * 进度条的进度值
	 */
	private int progress = 0;
	
	private Intent intent = new Intent("com.example.servicedemo.LOCATION");

	/**
	 * 模拟下载任务,每秒钟更新一次
	 */
	public void startDownLoad() {
		new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				while (progress < MAX_PROGRESS) {
					progress += 5;

					// 发送Action为com.example.communication.LOCATION的广播
					intent.putExtra("progress", progress);
					sendBroadcast(intent);

					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

				}
			}
		}).start();
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("onstart service_binder");
		return null;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		startDownLoad();
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}

}

来张效果图:呵呵,定位效果很快,不想调用系统自带的有时候返回null的结果!

 

 


******************************************************************************************************************2015-05-04 08:35:30*******************************************************************************************************************************************

最近简单的封装了下,上面的百度定位使用方法:

BaiduSDK.java (PS:属性中我只设置了经纬度信息的获取,其他的比如地址什么的,可以参考修改下)

 

package com.example.baidusdk;

import android.content.Context;

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;

public class BaiduSDK {
    private double longitude,latitude;
    
    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    private LocationClient mLocationClient;
    public BDLocationListener myListener = new MyLocationListener();

//    public BaiduSDK(LocationClient mLocationClient) {
//        super();
//        this.mLocationClient = mLocationClient;
//    }
    public BaiduSDK() {
        super();
        // TODO Auto-generated constructor stub
    }

    public void setup(Context context) {
        mLocationClient = new LocationClient(context);
        mLocationClient.setLocOption(setUp());// 设置定位条件
        mLocationClient.registerLocationListener( myListener );
    }
    public void sendRequest() {
        if (mLocationClient == null) {
            return;
        }
        if (mLocationClient.isStarted()) {
            mLocationClient.stop();
        }else {
            mLocationClient.start();
            mLocationClient.requestLocation();
        }
    }
    public void unRegisterLocationListener() {
        if (mLocationClient != null && mLocationClient.isStarted()) {

            mLocationClient.unRegisterLocationListener(myListener);//取消监听函数
            mLocationClient.stop();
            mLocationClient =null;
        }
    }

    public LocationClientOption setUp() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
        option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
        option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
        option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
        option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
        return option;
    }

    public class MyLocationListener implements BDLocationListener {// 实现BDLocationListener接口

        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub
            if (location == null)
                return;
            setLatitude(location.getLatitude());// 获取维度
            setLongitude(location.getLongitude());// 获取经度
//            System.out.println(getLatitude()+"维度-----经度"+getLongitude());
        }

    }
}
View Code

 

 

 

简单的使用:

 

package com.example.baidusdk;

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

public class Test extends Activity {
    TextView textView;
    BaiduSDK baiduLocation;
    Button button, checkButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
        textView = (TextView) findViewById(R.id.textView1);
        button = (Button) findViewById(R.id.button1);
        checkButton = (Button) findViewById(R.id.button2);
        baiduLocation = new BaiduSDK();//实例化类
        baiduLocation.setup(this);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                baiduLocation.sendRequest();//发送定位请求
            }
        });
        checkButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                System.out.println(baiduLocation.getLatitude() + "<--1--->"
                        + baiduLocation.getLongitude());
            }
        });

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        baiduLocation.unRegisterLocationListener();
    }

}
View Code

 

 

 

**************************************************************************************************************************************************************************************************************************************************************************************

2015年4月7日星期二 更新下,在地图中标记显示的定位信息

用的是百度地图SDK:

 

工程配置

 

第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加),拷贝完成后的工程目录如下图所示;

1.JPG

第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。

通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。

注意:由于adt插件升级,若您使用Eclipse adt 22的话,需要对开发环境进行相应的设置,方法如下:

1. 在Eclipse 中选中工程,右键选 Properties->Java Build Path->Order and Export 使 Android Private Libraries处于勾选状态;

2. Project -> clean-> clean all .

显示百度地图

百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:

第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

第二步:在AndroidManifest中添加开发密钥、所需权限等信息;

(1)在application中添加开发密钥

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

2)添加所需权限

<uses-permission android:name="android.permission.GET_ACCOUNTS" />  
<uses-permission android:name="android.permission.USE_CREDENTIALS" />  
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />  
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
<uses-permission android:name="android.permission.READ_PHONE_STATE" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
<uses-permission android:name="android.permission.BROADCAST_STICKY" />  
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

第三步,在布局xml文件中添加地图控件;

<com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

第四步,在应用程序创建时初始化 SDK引用的Context 全局变量:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法之前实现  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
    }  
}

注意:在SDK各功能组件使用之前都需要调用

SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中

第五步,创建地图Activity,管理地图生命周期;

public class MainActivity extends Activity {  
    MapView mMapView = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法之前实现  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
        //获取地图控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);  
    }  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
        mMapView.onDestroy();  
    }  
    @Override  
    protected void onResume() {  
        super.onResume();  
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
        mMapView.onResume();  
        }  
    @Override  
    protected void onPause() {  
        super.onPause();  
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
        mMapView.onPause();  
        }  
    }

完成以上步骤后,运行程序,即可在您的应用中显示如下地图,标记的话参考开发者可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息

//定义Maker坐标点  
LatLng point = new LatLng(39.963175, 116.400244);  
//构建Marker图标  
BitmapDescriptor bitmap = BitmapDescriptorFactory  
    .fromResource(R.drawable.icon_marka);  
//构建MarkerOption,用于在地图上添加Marker  
OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap);  
//在地图上添加Marker,并显示  
mBaiduMap.addOverlay(option);
basicmap1.png
注意:一开始显示的地图的位置一直都是北京的,如何让地图一开始就显示我们所需要的位置呢?只需要在oncreate()方法中调用
LatLng ll = new LatLng(32.205364, 119.524887);//自定义开始的位置
		MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
		mBaiduMap.setMapStatus(u);



 

posted @ 2015-05-04 08:44  tomi_mint  阅读(1047)  评论(0编辑  收藏  举报