LocationService.javapackage example.com.baidumaptest;/** * Created by cherish on 2017/2/6. */import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.LocationClientOption.LocationMode;import android.content.Context;/** * * @author baidu * */public class LocationService { PRivate LocationClient client = null; private LocationClientOption mOption,DIYoption; private Object objLock = new Object(); /*** * * @param locationContext */ public LocationService(Context locationContext){ synchronized (objLock) { if(client == null){ client = new LocationClient(locationContext); client.setLocOption(getDefaultLocationClientOption()); } } } /*** * * @param listener * @return */ public boolean registerListener(BDLocationListener listener){ boolean isSuccess = false; if(listener != null){ client.registerLocationListener(listener); isSuccess = true; } return isSuccess; } public void unregisterListener(BDLocationListener listener){ if(listener != null){ client.unRegisterLocationListener(listener); } } /*** * * @param option * @return isSuccessSetOption */ public boolean setLocationOption(LocationClientOption option){ boolean isSuccess = false; if(option != null){ if(client.isStarted()) client.stop(); DIYoption = option; client.setLocOption(option); isSuccess = true; } return isSuccess; } public LocationClientOption getOption(){ return DIYoption; } /*** * * @return DefaultLocationClientOption */ public LocationClientOption getDefaultLocationClientOption(){ if(mOption == null){ mOption = new LocationClientOption(); mOption.setLocationMode(LocationMode.Hight_Accuracy);//可選,默認(rèn)高精度,設(shè)置定位模式,高精度,低功耗,僅設(shè)備 mOption.setCoorType("bd09ll");//可選,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系,如果配合百度地圖使用,建議設(shè)置為bd09ll; mOption.setScanSpan(10000);//可選,默認(rèn)0,即僅定位一次,設(shè)置發(fā)起定位請求的間隔需要大于等于1000ms才是有效的 mOption.setIsNeedAddress(true);//可選,設(shè)置是否需要地址信息,默認(rèn)不需要 mOption.setIsNeedLocationDescribe(true);//可選,設(shè)置是否需要地址描述 mOption.setNeedDeviceDirect(false);//可選,設(shè)置是否需要設(shè)備方向結(jié)果 mOption.setLocationNotify(false);//可選,默認(rèn)false,設(shè)置是否當(dāng)gps有效時按照1S1次頻率輸出GPS結(jié)果 mOption.setIgnoreKillProcess(true);//可選,默認(rèn)true,定位SDK內(nèi)部是一個SERVICE,并放到了獨立進程,設(shè)置是否在stop的時候殺死這個進程,默認(rèn)不殺死 mOption.setIsNeedLocationDescribe(true);//可選,默認(rèn)false,設(shè)置是否需要位置語義化結(jié)果,可以在BDLocation.getLocationDescribe里得到,結(jié)果類似于“在北京天安門附近” mOption.setIsNeedLocationPoiList(true);//可選,默認(rèn)false,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到 mOption.SetIgnoreCacheException(false);//可選,默認(rèn)false,設(shè)置是否收集CRASH信息,默認(rèn)收集 mOption.setIsNeedAltitude(false);//可選,默認(rèn)false,設(shè)置定位時是否需要海拔信息,默認(rèn)不需要,除基礎(chǔ)定位版本都可用 } return mOption; } public void start(){ synchronized (objLock) { if(client != null && !client.isStarted()){ client.start(); } } } public void stop(){ synchronized (objLock) { if(client != null && client.isStarted()){ client.stop(); } } }}MainActivity.javapackage example.com.baidumaptest;import android.Manifest;import android.annotation.TargetApi;import android.app.Activity;import android.content.pm.PackageManager;import android.os.Build;import android.os.Bundle;import android.util.Log;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.MapPoi;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.TextureMapView;import com.baidu.location.BDLocationListener;import com.baidu.mapapi.model.LatLng;import java.util.ArrayList;public class MainActivity extends Activity { private TextureMapView mMapView = null; public BDLocationListener myListener = new MyLocationListener(); public LocationService locationService; public static BaiduMap baiduMap; public static MapStatusUpdate msu; private final int SDK_PERMISSION_REQUEST = 127; private String permissionInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getapplicationContext()); setContentView(R.layout.activity_main); mMapView = (TextureMapView) findViewById(R.id.bmapView); locationService = new LocationService(getApplicationContext()); locationService.registerListener(myListener); //注冊監(jiān)聽函數(shù) baiduMap = mMapView.getMap(); getPersimmions(); baiduMap.setMyLocationEnabled(true);//開啟定位圖層 msu = MapStatusUpdateFactory.zoomTo(18); baiduMap.animateMapStatus(msu); baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { Log.e("onClick",latLng.latitude+","+latLng.longitude); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); } @Override protected void onDestroy() { super.onDestroy(); //在activity執(zhí)行onDestroy時執(zhí)行mMapView.onDestroy(),實現(xiàn)地圖生命周期管理 mMapView.onDestroy(); locationService.unregisterListener(myListener); } @Override protected void onResume() { super.onResume(); //在activity執(zhí)行onResume時執(zhí)行mMapView. onResume (),實現(xiàn)地圖生命周期管理 mMapView.onResume(); locationService.start(); } @Override protected void onPause() { super.onPause(); //在activity執(zhí)行onPause時執(zhí)行mMapView. onPause (),實現(xiàn)地圖生命周期管理 mMapView.onPause(); locationService.stop(); } @TargetApi(23) private void getPersimmions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ArrayList<String> permissions = new ArrayList<String>(); /*** * 定位權(quán)限為必須權(quán)限,用戶如果禁止,則每次進入都會申請 */ // 定位精確位置 if(checkSelfPermission(Manifest.permission.access_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); } if(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); } /* * 讀寫權(quán)限和電話狀態(tài)權(quán)限非必要權(quán)限(建議授予)只會申請一次,用戶同意或者禁止,只會彈一次 */ // 讀寫權(quán)限 if (addPermission(permissions, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { permissionInfo += "Manifest.permission.WRITE_EXTERNAL_STORAGE Deny /n"; } // 讀取電話狀態(tài)權(quán)限 if (addPermission(permissions, Manifest.permission.READ_PHONE_STATE)) { permissionInfo += "Manifest.permission.READ_PHONE_STATE Deny /n"; } if (permissions.size() > 0) { requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION_REQUEST); } } } @TargetApi(23) private boolean addPermission(ArrayList<String> permissionsList, String permission) { if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { // 如果應(yīng)用沒有獲得對應(yīng)權(quán)限,則添加到列表中,準(zhǔn)備批量申請 if (shouldShowRequestPermissionRationale(permission)){ return true; }else{ permissionsList.add(permission); return false; } }else{ return true; } } @TargetApi(23) @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // TODO Auto-generated method stub super.onRequestPermissionsResult(requestCode, permissions, grantResults); }}MyLocationListener.javapackage example.com.baidumaptest;import android.util.Log;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.Poi;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.map.Overlay;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.model.LatLng;import java.util.List;/** * Created by cherish on 2017/2/5. */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定位結(jié)果 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){// 網(wǎng)絡(luò)定位結(jié)果 sb.append("/naddr : "); sb.append(location.getAddrStr()); //運營商信息 sb.append("/nOperationers : "); sb.append(location.getOperators()); sb.append("/ndescribe : "); sb.append("網(wǎng)絡(luò)定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結(jié)果 sb.append("/ndescribe : "); sb.append("離線定位成功,離線定位結(jié)果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("/ndescribe : "); sb.append("服務(wù)端網(wǎng)絡(luò)定位失敗,可以反饋IMEI號和大體定位時間到loc-bugs@baidu.com,會有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("/ndescribe : "); sb.append("網(wǎng)絡(luò)不同導(dǎo)致定位失敗,請檢查網(wǎng)絡(luò)是否通暢"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("/ndescribe : "); sb.append("無法獲取有效定位依據(jù)導(dǎo)致定位失敗,一般是由于手機的原因,處于飛行模式下一般會造成這種結(jié)果,可以試著重啟手機"); } sb.append("/nlocationdescribe : "); sb.append(location.getLocationDescribe());// 位置語義化信息 List<Poi> list = location.getPoiList();// POI數(shù)據(jù) if (list != null) { sb.append("/npoilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("/npoi= : "); sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); } } Log.i("BaiduLocationApiDem", sb.toString()); MainActivity.msu = MapStatusUpdateFactory.newLatLng(new LatLng(location.getLatitude(),location.getLongitude())); MainActivity.baiduMap.setMapStatus(MainActivity.msu); // 構(gòu)造定位數(shù)據(jù) MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius())// .direction(location.getDirection())// 方向 .latitude(location.getLatitude())// .longitude(location.getLongitude())// .build(); // 設(shè)置定位數(shù)據(jù) MainActivity.baiduMap.setMyLocationData(locData); /*LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);*///功能未明無視,設(shè)置新中心點 /*BitmapDescriptor mCurrentMarker= BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); OverlayOptions option = new MarkerOptions() .position(ll) .icon(mCurrentMarker); MainActivity.baiduMap.addOverlay(option);//設(shè)置覆蓋物圖標(biāo)*/ }}Utils.javapackage example.com.baidumaptest;/** * Created by cherish on 2017/2/6. */public class Utils { public final static String CoorType_GCJ02 = "gcj02"; public final static String CoorType_BD09LL= "bd09ll"; public final static String CoorType_BD09MC= "bd09"; /*** *61 : GPS定位結(jié)果,GPS定位成功。 *62 : 無法獲取有效定位依據(jù),定位失敗,請檢查運營商網(wǎng)絡(luò)或者wifi網(wǎng)絡(luò)是否正常開啟,嘗試重新請求定位。 *63 : 網(wǎng)絡(luò)異常,沒有成功向服務(wù)器發(fā)起請求,請確認(rèn)當(dāng)前測試手機網(wǎng)絡(luò)是否通暢,嘗試重新請求定位。 *65 : 定位緩存的結(jié)果。 *66 : 離線定位結(jié)果。通過requestOfflineLocaiton調(diào)用時對應(yīng)的返回結(jié)果。 *67 : 離線定位失敗。通過requestOfflineLocaiton調(diào)用時對應(yīng)的返回結(jié)果。 *68 : 網(wǎng)絡(luò)連接失敗時,查找本地離線定位時對應(yīng)的返回結(jié)果。 *161: 網(wǎng)絡(luò)定位結(jié)果,網(wǎng)絡(luò)定位定位成功。 *162: 請求串密文解析失敗。 *167: 服務(wù)端定位失敗,請您檢查是否禁用獲取位置信息權(quán)限,嘗試重新請求定位。 *502: key參數(shù)錯誤,請按照說明文檔重新申請KEY。 *505: key不存在或者非法,請按照說明文檔重新申請KEY。 *601: key服務(wù)被開發(fā)者自己禁用,請按照說明文檔重新申請KEY。 *602: key mcode不匹配,您的ak配置過程中安全碼設(shè)置有問題,請確保:sha1正確,“;”分號是英文狀態(tài);且包名是您當(dāng)前運行應(yīng)用的包名,請按照說明文檔重新申請KEY。 *501~700:key驗證失敗,請按照說明文檔重新申請KEY。 */ public static float[] EARTH_WEIGHT = {0.1f,0.2f,0.4f,0.6f,0.8f}; // 推算計算權(quán)重_地球 //public static float[] MOON_WEIGHT = {0.0167f,0.033f,0.067f,0.1f,0.133f}; //public static float[] MARS_WEIGHT = {0.034f,0.068f,0.152f,0.228f,0.304f};}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"> <com.baidu.mapapi.map.TextureMapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /></LinearLayout>AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="example.com.baidumaptest"> <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> <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="KZj8EdRhai6a2DrGSgH7BGuOBnBD6fK9" /> </application> <!-- 這個權(quán)限用于進行網(wǎng)絡(luò)定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 這個權(quán)限用于訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會用于進行網(wǎng)絡(luò)定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 獲取運營商信息,用于支持提供運營商信息相關(guān)的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 這個權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會用來進行網(wǎng)絡(luò)定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 用于讀取手機當(dāng)前的狀態(tài)--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 寫入擴展存儲,向擴展卡寫入數(shù)據(jù),用于寫入離線定位數(shù)據(jù)--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 訪問網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡讀取權(quán)限,用戶寫入離線定位數(shù)據(jù)--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/></manifest>主要so文件需要導(dǎo)入到main》jniLibs
新聞熱點
疑難解答