百度地图定位v6.1.3--1.官方demo实践分析

来源:互联网 发布:网络接口都有哪些 编辑:程序博客网 时间:2024/03/29 06:42

前言:基本的小白知识可以去前面或百度开放API脑补。

(一):申请开发Key

(二)下载SDK

  我们要使用Baidu地图开发,我们首先要去下载开发sdk库,下载地址:http://developer.baidu.com/map/sdkandev-download.htm

(三)下面创建项目

1.下载上面lib包,创建demo项目把jar和.so文件引入进去如下:

 2.自定义Applicaiton,实现实时位置回调监听

package com.example.testbdmaplocation;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;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;import java.util.List;/** * 主Application,所有百度定位SDK的接口说明请参考线上文档:http://developer.baidu.com/map/loc_refer/index.html * * 百度定位SDK官方网站:http://developer.baidu.com/map/index.php?title=android-locsdk */public class LocationApplication extends Application {    public LocationClient mLocationClient;    public MyLocationListener mMyLocationListener;    public TextView mLocationResult;    public Vibrator mVibrator;    @Override    public void onCreate() {        super.onCreate();        mLocationClient = new LocationClient(this.getApplicationContext());        mMyLocationListener = new MyLocationListener();        mLocationClient.registerLocationListener(mMyLocationListener);        mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);    }    /**     * 实现实时位置回调监听     */    public class MyLocationListener implements BDLocationListener {        @Override        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());            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("\nheight : ");                sb.append(location.getAltitude());// 单位:米                sb.append("\ndirection : ");                sb.append(location.getDirection());                sb.append("\naddr : ");                sb.append(location.getAddrStr());                sb.append("\ndescribe : ");                sb.append("gps定位成功");            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果                sb.append("\naddr : ");                sb.append(location.getAddrStr());                //运营商信息                sb.append("\noperationers : ");                sb.append(location.getOperators());                sb.append("\ndescribe : ");                sb.append("网络定位成功");            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果                sb.append("\ndescribe : ");                sb.append("离线定位成功,离线定位结果也是有效的");            } else if (location.getLocType() == BDLocation.TypeServerError) {                sb.append("\ndescribe : ");                sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {                sb.append("\ndescribe : ");                sb.append("网络不同导致定位失败,请检查网络是否通畅");            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {                sb.append("\ndescribe : ");                sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");            }                       logMsg(sb.toString());            Log.i("BaiduLocationApiDem", sb.toString());           // mLocationClient.setEnableGpsRealTimeTransfer(true);        }    }    /**     * 显示请求字符串     * @param str     */    public void logMsg(String str) {        try {            if (mLocationResult != null)                mLocationResult.setText(str);        } catch (Exception e) {            e.printStackTrace();        }    }}

2:MainActivity.java程序入口,点击选择其他页面

package com.example.testbdmaplocation;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {private ListView FunctionList ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FunctionList = (ListView)findViewById(R.id.functionList);FunctionList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));}       @Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();FunctionList.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubClass TargetClass = null; switch (arg2) {case 0:TargetClass = LocationActivity.class;break;case 1:TargetClass = NotifyActivity.class;break;//case 2 ://TargetClass = QuestActivity.class;//break;default:break;}if(TargetClass != null){Intent intent = new Intent(MainActivity.this, TargetClass);startActivity(intent);}}});}private List<String> getData(){                 List<String> data = new ArrayList<String>();        data.add("基础定位功能");        data.add("位置消息提醒");        data.add("常见问题说明");                 return data;    }}
3:LocationActivity.java发起定位请求,并显示结果

package com.example.testbdmaplocation;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.LocationClientOption.LocationMode;import android.app.Activity;import android.os.Bundle;import android.text.method.ScrollingMovementMethod;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;public class LocationActivity 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;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.location);        mLocationClient = ((LocationApplication)getApplication()).mLocationClient;        LocationResult = (TextView)findViewById(R.id.textView1);        LocationResult.setMovementMethod(ScrollingMovementMethod.getInstance());        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() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                initLocation();                if(startLocation.getText().equals(getString(R.string.startlocation))){                    mLocationClient.start();//定位SDK start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request                    mLocationClient.requestLocation();                                        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() {            @Override            public void onCheckedChanged(RadioGroup group, int checkedId) {                // TODO Auto-generated method stub                String 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() {            @Override            public void onCheckedChanged(RadioGroup group, int checkedId) {                // TODO Auto-generated method stub                switch (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;                }            }        });    }    @Override    protected void onStop() {        // TODO Auto-generated method stub        mLocationClient.stop();        super.onStop();    }    private void initLocation(){        LocationClientOption option = new LocationClientOption();        option.setLocationMode(tempMode);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备        option.setCoorType(tempcoor);//可选,默认gcj02,设置返回的定位结果坐标系,        int span=1000;        try {            span = Integer.valueOf(frequence.getText().toString());        } catch (Exception e) {            // TODO: handle exception        }        option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的        option.setIsNeedAddress(checkGeoLocation.isChecked());//可选,设置是否需要地址信息,默认不需要        option.setOpenGps(true);//可选,默认false,设置是否使用gps        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果        option.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死               mLocationClient.setLocOption(option);    }}

4:NotifyActivity.java开启位置提醒:

package com.example.testbdmaplocation;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.BDNotifyListener;import com.baidu.location.LocationClient;import android.app.Activity;import android.app.Service;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Vibrator;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class NotifyActivity extends Activity{    private Button startNotify;    private Vibrator mVibrator;    private LocationClient mLocationClient;    private NotiftLocationListener listener;    private double longtitude,latitude;    private NotifyLister mNotifyLister;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.notify);        listener = new NotiftLocationListener();        mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);        startNotify = (Button)findViewById(R.id.notifystart);        mLocationClient  = new LocationClient(this);        mLocationClient.registerLocationListener(listener);        startNotify.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                if(startNotify.getText().toString().equals("开启位置提醒")){                    mLocationClient.start();                    startNotify.setText("关闭位置提醒");                }else{                    if(mNotifyLister!=null){                        mLocationClient.removeNotifyEvent(mNotifyLister);                        startNotify.setText("开启位置提醒");                    }                }            }        });    }    @Override    protected void onStop() {        // TODO Auto-generated method stub        super.onStop();        mLocationClient.removeNotifyEvent(mNotifyLister);        mLocationClient = null;        mNotifyLister= null;        listener = null;    }    private Handler notifyHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            super.handleMessage(msg);            mNotifyLister = new NotifyLister();            mNotifyLister.SetNotifyLocation(latitude,longtitude, 3000,"gcj02");//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)            mLocationClient.registerNotify(mNotifyLister);        }    };    public class NotiftLocationListener implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {            //Receive Location            longtitude = location.getLongitude();            latitude = location.getLatitude();            notifyHandler.sendEmptyMessage(0);        }    }    public class NotifyLister extends BDNotifyListener{        public void onNotify(BDLocation mlocation, float distance){            mVibrator.vibrate(1000);//振动提醒已到设定位置附近            Toast.makeText(NotifyActivity.this, "震动提醒", Toast.LENGTH_SHORT).show();        }    }}


5:加入权限配置:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.testbdmaplocation"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="21" />    <application        android:name="com.example.testbdmaplocation.LocationApplication"        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>   <activity android:name="com.example.testbdmaplocation.LocationActivity"/>   <activity android:name="com.example.testbdmaplocation.NotifyActivity"/>                <!-- 百度定位权限配置start -->        <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>        <!-- 开发者申请的key -->        <meta-data            android:name="com.baidu.lbsapi.API_KEY"            android:value="HMA42siusR667AOHmeE70m6y" />    </application>    <!-- 这个权限用于进行网络定位 -->    <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.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" />    <!-- 百度定位权限配置end --></manifest>


1 0