基于百度地图的GPS简单定位——详细注释
来源:互联网 发布:如何查看软件源码 编辑:程序博客网 时间:2024/06/03 22:02
基于百度地图的GPS简单定位——详细注释
由于开发需要,简单学习了基于百度地图的GPS定位,实现了获取当地经纬度及详细地址。并附有官方demo。需要注意的是,必须先注册百度开发者账号,(http://developer.baidu.com),然后获取API Key (http://developer.baidu.com/map/index.php?title=android-locsdk)。将获得的API Key写入AndroidManifest.xml文件。
先来看效果图:
工程目录如下:(注意导入libs,由于空间有限,布局文件没显示,分别为activity_main.xml和location.xml)
具体代码如下:
1、MainActivity.java
package com.android.baidugps;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;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;public class MainActivity extends Activity {private static final String TAG = "BaiduGPS";private TextView locationInfoTextView = null;private TextView latitudeTextView = null;private TextView longitudeTextView = null; private Button startButton , secondButton; private LocationClient mLocationClient = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* * * */ secondButton = (Button)findViewById(R.id.secondActivity); secondButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent i = new Intent(MainActivity.this, MyActivityTest.class);startActivity(i);}}); locationInfoTextView = (TextView) this.findViewById(R.id.addrText); latitudeTextView = (TextView) this.findViewById(R.id.latiText); longitudeTextView = (TextView) this.findViewById(R.id.longText); startButton = (Button) this.findViewById(R.id.getButton); mLocationClient = ((LocationApplication)getApplication()).mLocationClient; ((LocationApplication)getApplication()).mLocationResult = locationInfoTextView;// mLocationClient = new LocationClient(this); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); // 打开gps option.setCoorType("bd09ll"); // 设置坐标类型,总共有几个类型具体的可以查看百度文档说明 option.setScanSpan(20000); // 设置定位间隔时间 option.setAddrType("all"); // 设置返回类型,all = 表示返回所有的数据 option.setProdName("施肥专家"); //设置产品线名称。 //强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。// option.setPriority(LocationClientOption.NetWorkFirst); mLocationClient.setLocOption(option); mLocationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { if(location == null) return; Log.i(TAG, "定位当前位置成功!"); String city = location.getAddrStr(); System.out.println(TAG + location.getStreet()); //街道 System.out.println(TAG+ location.getStreetNumber()); System.out.println(TAG + location.getAddrStr()); //完整地址 System.out.println(TAG + location.getAltitude()); System.out.println(TAG + location.getCity()); System.out.println(TAG + location.getCityCode()); System.out.println(TAG + location.getCoorType()); // System.out.println(TAG + location.getDerect()); System.out.println(TAG + location.getDistrict()); //地区 System.out.println(TAG + location.getProvince()); System.out.println(TAG + location.getSatelliteNumber()); System.out.println(TAG + location.getSpeed()); // String ownerLocation = location.getAddrStr(); String ownerLatitude = String.valueOf(location.getLatitude()); String ownerLongtitude = String.valueOf(location.getLongitude()); locationInfoTextView.setText("城市:" + city); latitudeTextView.setText("纬度为:" + ownerLatitude); longitudeTextView.setText("经度为:" + ownerLongtitude); } }); startButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) { Log.d(TAG,"Button clicked"); if (mLocationClient == null) { Log.d(TAG,"mLocationClient null"); return; } if (mLocationClient.isStarted()) { Log.d(TAG,"mLocationClient isStarted"); startButton.setText("Start"); mLocationClient.stop(); }else { Log.d(TAG,"mLocationClient stop"); startButton.setText("Stop"); mLocationClient.start(); /* *当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。 *调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。 *如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求, *返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。 *定时定位时,调用一次requestLocation,会定时监听到定位结果。 */ mLocationClient.requestLocation(); } }}); }// 当Activity重新运行时,需要在onResume()函数中重新开启定位: @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); if(mLocationClient.isStarted()) mLocationClient.stop(); }// 当Activity暂停运行时,需要在onPause()函数中关闭定位: @Override protected void onDestroy() { super.onDestroy(); if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.stop(); mLocationClient = null; } }}
2、MyActivityTest.java ---官方Demo片段
package com.android.baidugps;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TextView;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.LocationClientOption.LocationMode;public class MyActivityTest extends Activity{private LocationClient mLocationClient;private TextView LocationResult,ModeInfor;private Button startLocation;private RadioGroup selectMode,selectCoordinates;private EditText frequence;private LocationMode tempMode = LocationMode.Hight_Accuracy;private String tempcoor="gcj02";private CheckBox checkGeoLocation;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.location);mLocationClient = ((LocationApplication)getApplication()).mLocationClient;LocationResult = (TextView)findViewById(R.id.textView1);ModeInfor= (TextView)findViewById(R.id.modeinfor);ModeInfor.setText(getString(R.string.hight_accuracy_desc)); ((LocationApplication)getApplication()).mLocationResult = LocationResult; frequence = (EditText)findViewById(R.id.frequence); checkGeoLocation = (CheckBox)findViewById(R.id.geolocation);startLocation = (Button)findViewById(R.id.addfence);startLocation.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubInitLocation();if(startLocation.getText().equals(getString(R.string.startlocation))){mLocationClient.start();startLocation.setText(getString(R.string.stoplocation));}else{mLocationClient.stop();startLocation.setText(getString(R.string.startlocation));}}});selectMode = (RadioGroup)findViewById(R.id.selectMode);selectCoordinates= (RadioGroup)findViewById(R.id.selectCoordinates);selectMode.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {// TODO Auto-generated method stubString ModeInformation = null;switch (checkedId) {case R.id.radio_hight:tempMode = LocationMode.Hight_Accuracy;ModeInformation = getString(R.string.hight_accuracy_desc);break;case R.id.radio_low:tempMode = LocationMode.Battery_Saving;ModeInformation = getString(R.string.saving_battery_desc);break;case R.id.radio_device:tempMode = LocationMode.Device_Sensors;ModeInformation = getString(R.string.device_sensor_desc);break;default:break;}ModeInfor.setText(ModeInformation);}});selectCoordinates.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {// TODO Auto-generated method stubswitch (checkedId) {case R.id.radio_gcj02:tempcoor="gcj02";break;case R.id.radio_bd09ll:tempcoor="bd09ll";break;case R.id.radio_bd09:tempcoor="bd09";break;default:break;}}});}@Overrideprotected void onStop() {// TODO Auto-generated method stubmLocationClient.stop();super.onStop();}private void InitLocation(){LocationClientOption option = new LocationClientOption();option.setLocationMode(tempMode);//设置定位模式option.setCoorType(tempcoor);//返回的定位结果是百度经纬度,默认值gcj02int span=1000;try {span = Integer.valueOf(frequence.getText().toString());} catch (Exception e) {// TODO: handle exception}option.setScanSpan(span);//设置发起定位请求的间隔时间为5000msoption.setIsNeedAddress(checkGeoLocation.isChecked());mLocationClient.setLocOption(option);}}
3、LocationApplication .java ---主Application,主要实现回调
package com.android.baidugps;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.GeofenceClient;import com.baidu.location.LocationClient;import android.app.Application;import android.app.Service;import android.os.Vibrator;import android.util.Log;import android.widget.TextView;/** * 主Application */public class LocationApplication extends Application {public LocationClient mLocationClient;public GeofenceClient mGeofenceClient;public MyLocationListener mMyLocationListener;public TextView mLocationResult,logMsg;public TextView trigger,exit;public Vibrator mVibrator;@Overridepublic void onCreate() {super.onCreate();mLocationClient = new LocationClient(this.getApplicationContext());mMyLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(mMyLocationListener);mGeofenceClient = new GeofenceClient(getApplicationContext());mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);}/** * 实现实位回调监听 */public class MyLocationListener implements BDLocationListener {@Overridepublic 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());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());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();}}/** * 高精度地理围栏回调 * @author jpren * */}
4、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:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:id="@+id/addrText" android:text="@string/hello_world" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@id/addrText" android:id="@+id/latiText" android:text="@string/hello_world" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@id/latiText" android:id="@+id/longText" android:text="@string/hello_world" /> <Button android:id="@+id/getButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="获得经纬度"/> <Button android:id="@+id/secondActivity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/getButton" android:layout_centerInParent="true" android:text="启动百度官方Demo"/> </RelativeLayout>
5、location.xml ---官方Demo布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#ff0000"> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2.89" android:text=" " android:textAppearance="?android:attr/textAppearanceLarge" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 定位模式" android:textAppearance="?android:attr/textAppearanceLarge" /><RadioGroup android:id="@+id/selectMode" android:layout_width="wrap_content" android:layout_height="match_parent" > <RadioButton android:id="@+id/radio_hight" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="高精度" /> <RadioButton android:id="@+id/radio_low" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="低功耗" /> <RadioButton android:id="@+id/radio_device" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="仅设备" /></RadioGroup> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="坐标系" android:textAppearance="?android:attr/textAppearanceLarge" /><RadioGroup android:id="@+id/selectCoordinates" android:layout_width="wrap_content" android:layout_height="match_parent" > <RadioButton android:id="@+id/radio_gcj02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="gcj02(国测局加密经纬度坐标)" /> <RadioButton android:id="@+id/radio_bd09ll" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="bd09ll(百度加密经纬度坐标)" /> <RadioButton android:id="@+id/radio_bd09" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="bd09(百度加密墨卡托坐标)" /></RadioGroup> </LinearLayout> </LinearLayout> <TextView android:id="@+id/modeinfor" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2.88" android:text=" " /> <LinearLayout android:layout_width="278dp" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="定位时间间隔(ms):" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/frequence" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:hint="1000" android:inputType="number" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2.89" android:orientation="horizontal" > <TextView android:id="@+id/geofencelog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="反地理编码" android:textAppearance="?android:attr/textAppearanceLarge" /> <CheckBox android:id="@+id/geolocation" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" " /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.50" android:gravity="center|top" android:orientation="vertical" > <Button android:id="@+id/addfence" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开启定位" /> </LinearLayout></LinearLayout>
6、AndroidManifest.xml ---主配置文件(权限及申请的API KEY)
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.baidugps" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" 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> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <application android:name="com.android.baidugps.LocationApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <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> <activity android:name="com.android.baidugps.MyActivityTest" ></activity> <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需要写在application中 --> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="3kESaoVifZvh0KU35sGF9ylx" /> </application></manifest>
工程下载地址:http://download.csdn.net/download/xiaobailong24/8428773
百度地图SDK下载地址:http://developer.baidu.com/map/static/doc/output/BaiduLocSDK_v5.0.rar
0 0
- 基于百度地图的GPS简单定位——详细注释
- 百度地图API安卓版的GPS定位
- android 百度地图GPS定位
- 百度地图系列03——简单地图定位
- 用手机gps定位获得准确的百度地图经纬度
- gps定位Qt界面百度地图api的介绍
- 关于百度地图GPS/IP定位的相关说明
- 基于百度地图的手机定位
- 百度地图简单定位
- 百度地图定位功能的简单应用
- 简单百度地图的定位开发
- 百度地图实现简单的定位功能
- Android 百度地图的简单定位
- 百度地图的简单使用与定位
- 使用百度地图结合GPS进行定位
- Android之百度地图GPS定位
- 百度地图通过GPS定位导航
- 百度地图运动轨迹GPS定位
- ubuntu14.04安装jdk
- Coursera台大机器学习课程笔记3 – 机器学习的可能性
- 南塔产业带新春提示:春天减肥新计划
- Xcode6为什么干掉pch(Precompile Prefix Header)&amp;如何添加pch文件
- Xilinx FPGA开发板 Digilent Spartan-3E 学习资料
- 基于百度地图的GPS简单定位——详细注释
- 黑马程序员——集合概述
- PHP基础知识点简单回顾:变量、函数以及PHP基本格式
- 项目时间估计
- MySQL Server参数优化 - innodb_file_per_table(独立表空间)
- Add Binary
- GNU make学习
- iOS 高级开发技巧 2.对象、消息、运行期 (2-4) 大集合
- Js Div拖动