定位功能已經是很多項目中都在使用的了,而且也比較簡單,只要按照第三方給出的文檔進行集成就可以了,起中高德的地圖個人感覺是集成比較簡單的了,這個定位功能也一樣。、
首先,是注冊一個高德賬號,這個就不用說了,然后就是創建一個項目,按照要求注冊sha1值,包名等。
需要注意一點,有時候你直接用電腦小黑窗弄到的sha1值是不對的,在高德地圖上會返回key值有誤!
public static String sHA1(Context context) { try { PackageInfo info = context.getPackageManager().getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES); byte[] cert = info.signatures[0].toByteArray(); MessageDigest md = MessageDigest.getInstance("SHA1"); byte[] publicKey = md.digest(cert); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < publicKey.length; i++) { String appendString = Integer.toHexString(0xFF & publicKey[i]) .toUpperCase(Locale.US); if (appendString.length() == 1) hexString.append("0"); hexString.append(appendString); hexString.append(":"); } String result = hexString.toString(); return result.substring(0, result.length()-1); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
用上面的方法,傳入上下文,返回值就是一個sha1值,用這個值去申請key值就可以了。
然后,在清單文件中配置高德的key值
<!--高德地圖--> <meta-data android:name="com.amap.api.v2.apikey" android:value="你自己的key值"/> <!--定位服務--> <service android:name="com.amap.api.location.APSService"></service> 添加權限
<user-permission android:name="android.premission.CALL_PHONE"/> <!--用于進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!--用于訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!--用于獲取運營商信息,用于支持提供運營商信息相關的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!--用于訪問wifi網絡信息,wifi信息會用于進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!--用于獲取wifi的獲取權限,wifi信息會用來進行網絡定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!--用于訪問網絡,網絡定位需要上網--> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <!--用于讀取手機當前的狀態--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!--用于寫入緩存數據到擴展存儲卡--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!--用于申請調用A-GPS模塊--> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission> <!--用于申請獲取藍牙信息進行室內定位--> <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
在添加依賴
//定位 compile 'com.amap.api:location:latest.integration'
創建Application類,記得在清單文件中注冊
public class MyApp extends Application { //聲明AMapLocationClientOption對象 public AMapLocationClientOption mLocationOption = null; //聲明AMapLocationClient類對象 public AMapLocationClient mLocationClient = null; //聲明定位回調監聽器 public AMapLocationListener mLocationListener = new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { } }; @Override public void onCreate() { super.onCreate(); //初始化定位 mLocationClient = new AMapLocationClient(getApplicationContext()); //設置定位回調監聽 mLocationClient.setLocationListener(mLocationListener); } } 注冊上 Application類
然后,就可以在需要的位置進行調用了,不過現在很多手機需要動態申請權限,所以就需要加上權限判斷
//權限申請
private static final int LOCATION_CODE = 1; private LocationManager lm;//【位置管理】public void quanxian(){ lm = (LocationManager) MainActivity.this.getSystemService(MainActivity.this.LOCATION_SERVICE); boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); if (ok) {//開了定位服務 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { Log.e("BRG","沒有權限"); // 沒有權限,申請權限。 // 申請授權。 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);// Toast.makeText(getActivity(), "沒有權限", Toast.LENGTH_SHORT).show(); } else { dingwei(); // 有權限了,去放肆吧。// Toast.makeText(getActivity(), "有權限", Toast.LENGTH_SHORT).show(); } } else { Log.e("BRG","系統檢測到未開啟GPS定位服務"); Toast.makeText(MainActivity.this, "系統檢測到未開啟GPS定位服務", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(intent, 1315); }}
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case LOCATION_CODE: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 權限被用戶同意。 dingwei(); } else { // 權限被用戶拒絕了。 Toast.makeText(MainActivity.this, "定位權限被禁止,相關地圖功能無法使用!",Toast.LENGTH_LONG).show(); } Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); finish(); } } }然后,就是在權限允許里面調用定位功能,
//聲明mlocationClient對象 public AMapLocationClient mlocationClient; //聲明mLocationOption對象 public AMapLocationClientOption mLocationOption = null; private void dingwei() { Log.e("BRG","走了定位"); mlocationClient = new AMapLocationClient(MainActivity.this); //初始化定位參數 mLocationOption = new AMapLocationClientOption(); //設置定位監聽 mlocationClient.setLocationListener( this); //設置定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅設備模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); //設置定位間隔,單位毫秒,默認為2000ms mLocationOption.setInterval(20000); //設置是否返回地址信息(默認返回地址信息) mLocationOption.setNeedAddress(true); //設置定位參數 mlocationClient.setLocationOption(mLocationOption); // 此方法為每隔固定時間會發起一次定位請求,為了減少電量消耗或網絡流量消耗, // 注意設置合適的定位時間的間隔(小間隔支持為1000ms),并且在合適時間調用stopLocation()方法來取消定位請求 // 在定位結束后,在合適的生命周期調用onDestroy()方法 // 在單次定位情況下,定位無論成功與否,都無需調用stopLocation()方法移除請求,定位sdk內部會移除 //啟動定位 mlocationClient.startLocation(); }
重寫方法,拿到地址返回值
@Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { Log.e("BRG","返回結果"+aMapLocation.getErrorCode()); if (aMapLocation.getErrorCode() == 0) { //可在其中解析amapLocation獲取相應內容。 String address = aMapLocation.getAddress(); }else { //定位失敗時,可通過ErrCode(錯誤碼)信息來確定失敗的原因,errInfo是錯誤信息,詳見錯誤碼表。 Log.e("AmapError","location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } } }到這里,簡單的一個定位功能就完成了,根據高德給出來的返回值列表,自己去取需要的AMapLocation內部的值吧:
http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。