1.MainActivity.java
package fanxiaoli.mapbaidu; import android.app.Activity; import android.app.Notification; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.Poi; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.MapView; import java.util.List; public class MainActivity extends Activity { private LocationClient mLocationClient; private TextView LocationResult; private Button startLocation; private LocationClient client = null; private LocationClientOption mOption; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // TODO Auto-generated method stub // -----------demo view config ------------ setContentView(R.layout.activity_main); LocationResult = (TextView) findViewById(R.id.textView1); LocationResult.setMovementMethod(ScrollingMovementMethod.getInstance()); startLocation = (Button) findViewById(R.id.addfence); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener( mListener ); //注册监听函数 initLocation(); } //显示请求字符串 @param str public void logMsg(String str) { final String s = str; try { if (LocationResult != null){ new Thread(new Runnable() { @Override public void run() { LocationResult.post(new Runnable() { @Override public void run() { LocationResult.setText(s); } }); } }).start(); } //LocationResult.setText(str); } catch (Exception e) { e.printStackTrace(); } } //Stop location service @Override protected void onStop() { // TODO Auto-generated method stub mLocationClient.unRegisterLocationListener(mListener); //注销掉监听 mLocationClient.stop();//停止定位服务 super.onStop(); } private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系 int span=1000; option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true); //可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true); //可选,默认false,设置是否使用gps option.setLocationNotify(true); //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果 option.setIsNeedLocationDescribe(true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false); //可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false); //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要 mLocationClient.setLocOption(option); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); startLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (startLocation.getText().toString().equals(getString(R.string.startlocation))) { mLocationClient.start();// 定位SDK Log.w("11111","222222"); // start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request startLocation.setText(getString(R.string.stoplocation)); } else { mLocationClient.stop(); startLocation.setText(getString(R.string.startlocation)); } } }); } /***** * * 定位结果回调,重写onReceiveLocation方法,可以直接拷贝如下代码到自己工程中修改 * */ private BDLocationListener mListener = new BDLocationListener() { @Override public void onReceiveLocation(BDLocation location) { // TODO Auto-generated method stub if (null != location && location.getLocType() != BDLocation.TypeServerError) { StringBuffer sb = new StringBuffer(256); sb.append("time : "); /** * 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间; * location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变 */ sb.append(location.getTime()); sb.append("\nlocType : ");// 定位类型 sb.append(location.getLocType()); sb.append("\nlocType description : ");// *****对应的定位类型说明***** sb.append(location.getLocTypeDescription()); sb.append("\nlatitude : ");// 纬度 sb.append(location.getLatitude()); sb.append("\nlontitude : ");// 经度 sb.append(location.getLongitude()); sb.append("\nradius : ");// 半径 sb.append(location.getRadius()); sb.append("\nCountryCode : ");// 国家码 sb.append(location.getCountryCode()); sb.append("\nCountry : ");// 国家名称 sb.append(location.getCountry()); sb.append("\ncitycode : ");// 城市编码 sb.append(location.getCityCode()); sb.append("\ncity : ");// 城市 sb.append(location.getCity()); sb.append("\nDistrict : ");// 区 sb.append(location.getDistrict()); sb.append("\nStreet : ");// 街道 sb.append(location.getStreet()); sb.append("\naddr : ");// 地址信息 sb.append(location.getAddrStr()); sb.append("\nUserIndoorState: ");// *****返回用户室内外判断结果***** sb.append(location.getUserIndoorState()); sb.append("\nDirection(not all devices have value): "); sb.append(location.getDirection());// 方向 sb.append("\nlocationdescribe: "); sb.append(location.getLocationDescribe());// 位置语义化信息 sb.append("\nPoi: ");// POI信息 if (location.getPoiList() != null && !location.getPoiList().isEmpty()) { for (int i = 0; i < location.getPoiList().size(); i++) { Poi poi = (Poi) location.getPoiList().get(i); sb.append(poi.getName() + ";"); } } if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 sb.append("\nspeed : "); sb.append(location.getSpeed());// 速度 单位:km/h sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber());// 卫星数目 sb.append("\nheight : "); sb.append(location.getAltitude());// 海拔高度 单位:米 sb.append("\ngps status : "); sb.append(location.getGpsAccuracyStatus());// *****gps质量判断***** sb.append("\ndescribe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 // 运营商信息 if (location.hasAltitude()) {// *****如果有海拔高度***** sb.append("\nheight : "); sb.append(location.getAltitude());// 单位:米 } 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.w("11111",sb.toString()); } } public void onConnectHotSpotMessage(String s, int i) { } }; }
2.activity_main.xml
<?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" > <Button android:id="@+id/addfence" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/startlocation" /> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="200dp" android:layout_weight="2.89" android:scrollbars="vertical" android:text=" "/> </LinearLayout>
3.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fanxiaoli.mapbaidu"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 声明百度定位API的定位服务 --> <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 android:name="com.baidu.lbsapi.API_KEY" android:value="9btbAGANSImzBs0WxxuIrOUc7mYjIM4R"/> </application> <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" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 这个权限用于进行网络定位 --> <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> </manifest>
4.strings.xml
<resources> <string name="app_name">MapBaidu</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="startlocation">开始定位</string> <string name="stoplocation">停止定位</string> <string name="error_code_desc">错误码说明</string> <string name="diy_call_back">自定义回调</string> <string name="diy_call_back_ps">ps:网络定位由于精度低于gps,计算距离会有部分偏差</string> <string name="qa_title">常见问题</string> <string name="hight_accuracy_desc">高精度定位模式下,会同时使用GPS、Wifi和基站定位,返回的是当前条件下精度最好的定位结果</string> <string name="saving_battery_desc">低功耗定位模式下,仅使用网络定位即Wifi和基站定位,返回的是当前条件下精度最好的网络定位结果</string> <string name="device_sensor_desc">仅用设备定位模式下,只使用用户的GPS进行定位。这个模式下,由于GPS芯片锁定需要时间,首次定位速度会需要一定的时间</string> <string name="error_code_detail"> 61 : GPS定位结果\n 62 : 扫描整合定位依据失败。此时定位结果无效。\n 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。\n 65 : 定位缓存的结果。\n 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果\n 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果\n 68 : 网络连接失败时,查找本地离线定位时对应的返回结果\n 161: 表示网络定位结果\n 162~167: 服务端定位失败\n 502:key参数错误\n 505:key不存在或者非法\n 601:key服务被开发者自己禁用\n 602:key mcode不匹配\n 501~700:key验证失败\n</string> <string name="qa_callback">问题反馈:\n 邮件格式格式:\n 1) 手机标识(移动联通IMEI,电信MEID)\n 2) 问题发生时间;\n 3)定位类型:失败(给出返回码),或者不准(给出真实位置)等;\n 4)具体描述:细节描述,可以给出问题发生的频率或者APP名称,sdk版本等,也可以加上附件如日志,贴图等\n </string> <string name="qa_callback_mail">反馈邮箱:loc-bugs@baidu.com</string> </resources>
5.build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "fanxiaoli.mapbaidu" minSdkVersion 19 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { jniLibs.srcDirs = ['libs'] } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.2.0' testCompile 'junit:junit:4.12' compile files('libs/BaiduLBS_Android.jar') }