開發工具 Android Studio
這裏用到的地位功能分爲兩種,一種是GPS定位功能,更加準確,室內不可用信號較弱,不過對手機的硬件有相應的要求
第二種是網絡定位功能,在室內也能使用,相對來說沒有那麼準確。
用到的第三方包是百度地圖BaiduLBS_Android.jar開發流程如下:
1.需要申請一個APIkey,去百度地圖官網申請一個賬號網址如下:http://developer.baidu.com/user/reg
完成相應的註冊,只用填寫帶有“*”號的部分,驗證完成後跳轉到http://lbsyun.baidu.com/apiconsolekey然後
同意開發者協議,創建一個應用,其中截圖如下:
其中AK是我申請到的百度地圖的APIkey
點擊創建應用,分類按下列選擇
其中的發佈版本的SHA1相信大家已經熟悉怎麼填寫了吧,就是打開Android studio的右邊Gradle界面,其中的
app->Tasks->android->signingRepoert點擊運行
其中的SHA1就是暫時得到的發佈版本的,暫時先使用這個發佈版本和開發版相同,填寫好之後點擊申請,可以得到引用的APIkey。
接下來就是下載LBS.SDK訪問的網站如下:
http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all
選擇其中兩個基礎的定位功能分別是基礎定位和基礎室內定位如下:
點擊下載完後之後解壓獲得LBS_android.jar的包,然後導入到libs文件下,然後把剩下的所有文件導入到src->main的新建文件夾jniLibs文件夾下,最後sync項目一下就可以使用了
接下來創建我們自己的main_activity_xml文件如下;
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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" android:orientation="vertical" tools:context="com.example.administrator.lbstest.MainActivity"> <TextView android:id="@+id/position_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone"/> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"/> </LinearLayout>
其中添加的MapView控件是爲了繪製百度地圖的圖像的控件
在AndroidManifest.xml文件中添加相應的權限和添加API_KEY.和授權定位權限如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.lbstest"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_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.INTERNET"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="XpaueacTI9uEUwy1OPSDTZ0lA9CfEFCA" /> <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> </application> </manifest>
記得在APP的build.gradle文件中導入要用到的庫
compile fileTree(dir:'libs',include:['*.jar'])
最後MainActivity代碼如下:
package com.example.administrator.lbstest; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; 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.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient; private TextView positionText; //繪製地圖的控件 private MapView mapView; //創建地圖的總控制器來實現地圖的操作 private BaiduMap baiduMap; //判斷是否是第一次定位 private boolean isFirstLocate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new MyLocationListener()); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.bmapView); //獲取地圖控制器對象 baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); init(); } //創建一個控制地圖更新到當前位置的方法 private void navigateTo(BDLocation location){ if(isFirstLocate){ //通過LagLng的方法實現更新地圖位置的操作 LatLng ll = new LatLng(location.getLatitude(),location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(16f); baiduMap.animateMapStatus(update); isFirstLocate = false; } //在地圖中顯示我的位置 MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData = locationBuilder.build(); baiduMap.setMyLocationData(locationData); } private void init() { positionText = (TextView) findViewById(R.id.position_text_view); //判斷是否授予權限 List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if(!permissionList.isEmpty()){ String [] permissions = permissionList.toArray(new String [permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this,permissions,1); }else { requestLocation(); } } //這三種方法是爲了實現資源的即使的釋放和管理 @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); mapView.onDestroy(); baiduMap.setMyLocationEnabled(false); } private void requestLocation() { initLocation(); mLocationClient.start(); } private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); option.setIsNeedAddress(true); mLocationClient.setLocOption(option); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case 1: if(grantResults.length > 0){ for (int result :grantResults ){ if(result != PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"必須同意所有權限才能使用本程序",Toast.LENGTH_SHORT).show(); finish(); return; } } requestLocation(); }else { Toast.makeText(this,"發生未知錯誤",Toast.LENGTH_SHORT).show(); finish(); } break; default: } } public class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation bdLocation) { // StringBuilder currentPosition = new StringBuilder(); // //定位的詳細信息 // currentPosition.append("緯度:").append(bdLocation.getLatitude()).append("\n"); // currentPosition.append("經線:").append(bdLocation.getLongitude()).append("\n"); // currentPosition.append("國家:").append(bdLocation.getCountry()).append("\n"); // currentPosition.append("省份:").append(bdLocation.getProvince()).append("\n"); // currentPosition.append("城市:").append(bdLocation.getCity()).append("\n"); // currentPosition.append("區:").append(bdLocation.getDistrict()).append("\n"); // currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n"); // currentPosition.append("定位方式:"); // if (bdLocation.getLocType() == BDLocation.TypeGpsLocation){ // currentPosition.append("GPS"); // }else if(bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){ // currentPosition.append("網絡"); // } // positionText.setText(currentPosition); //將值傳入navigateTo方法實現重新繪製地圖操作 if (bdLocation.getLocType() == BDLocation.TypeGpsLocation || bdLocation.getLocType() == BDLocation.TypeNetWorkLocation){ navigateTo(bdLocation); } } } }
運行程序實現效果圖如下:
(因爲運用虛擬機運行,GPS的定位功能錯誤,沒有做找到位置使用的默認的位置如下)