基于百度地图的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
原创粉丝点击