android端實現手機定位百度地圖實現
單獨無聊的單機程式並沒有意思,我們何不在程式裡面加上有趣的網路呢,
這次我們主要是講關於Android手機的定位系統,本次使用的是百度定位。
下面表格是提供的兩個我們後面需要的地址
百度定位下載地址 | http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all |
獲取密匙地址 | http://lbsyun.baidu.com/apiconsole/key |
選中點選開發包,現在完成後會是一個壓縮包,解壓完後會有如下檔案和資料夾:
這裡的我們需要把這些檔案放到我們寫專案裡面,根據路徑,我們在專案工程的路徑裡面找到libs資料夾,把BaiduLBS_Android.jar檔案放到libs資料夾裡面,在src/main資料夾下建立jniLibs資料夾,把剩下的資料夾放到jniLibs資料夾裡面,這個時候因為我們的這些檔案都是複製進去的,所以這個時候我們的這些程式根本起不到作用,所以這個時候我們需要重構下,點選介面上的這個按鈕即可。等待完成。
首先,因為我們的需要的是定位功能,所以我們要加入如下許可權:
android.permission.ACCESS_COARSE_LOCATION | 訪問CellID或 |
android.permission.ACCESS_FINE_LOCATION | 允許一個程式訪問精良位置(如GPS) |
android.permission.ACCESS_WIFI_STATE | 允許程式訪問Wi-Fi狀態資訊 |
android.permission.ACCESS_NETWORK_STATE | 允許程式訪問網路資訊 |
android.permission.CHANGE_WIFI_STATE | 允許程式改變Wi-Fi連線狀態 |
android.permission.READ_PHONE_STATE |
讀取手機狀態 |
android.permission.WRITE_EXTERNAL_STORAGE | 外部儲存寫許可權 |
android.permission.INTERNET | 網路套接字訪問許可權(網路訪問許可權) |
android.permission.MOUNT_UNMOUNT_FILESYSTEMS | 允許建立與刪除許可權 |
android.permission.WAKE_LOCK | 保持螢幕喚醒 |
一定要加入這些許可權。這是還需要在程式中註冊服務
這個時候就用到了我們申請的key值:
這樣我們的AndroidManifest.xml就配置完成了
那麼就先來展示我們寫的程式碼,稍後進行程式碼解釋:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationLisener());
setContentView(R.layout.activity_main);
initView();
initLocation();
List<String> permissions = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissions.isEmpty()) {
String[] permission_q = permissions.toArray(new String[permissions.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permission_q, 1);
} else {
requestLocation();
}
}
在onCreate方法中,我們需要建立一個LocationClient的例項,這個的構造引數是一個context引數,這裡用過getApplicationContext方法來獲取一個遷居的context引數,然後通過registerLocationListener來註冊一個監聽器,每當獲得到定位的資訊時,就會呼叫這個監聽器。
上面我們說到這個程式我們用到了很多的許可權,其中包括危險許可權和普通許可權,所以在這裡我們有四個許可權四危險許可權,所以在這裡我們還是要再次申請下許可權,因為在這四個全險中,有兩個許可權是在一個許可權組裡面的,所以我只需要申請這個許可權組就可以了。
我們這裡的申請許可權的方式是,判斷許可權是否處於授權許可狀態,如果不是授權許可狀態,將許可權加入List集合中,在再次申請許可權的時候講集合裡面你的資料轉換成字串陣列的格式通過ActivityCompat.requestpermissions來再次申請許可權。
這裡我需要一個requestLocation方法來開啟定位
private void requestLocation() {
mLocationClient.start();
}
當定位成功後就要回調定位監聽
public class MyLocationLisener implements BDLocationListener{
@Override
public void onReceiveLocation(final BDLocation bdLocation) {
runOnUiThread(new Runnable() {
@Override
public void run() {
StringBuilder builder = new StringBuilder();
builder.append("緯度:").append(bdLocation.getLatitude()).append("\n");
builder.append("經度:").append(bdLocation.getLongitude()).append("\n");
builder.append("城市:").append(bdLocation.getCity());
textView.setText(builder);
}
});
}
}
這個當定位成功後,可以通過bdLocation#方法的方式來獲取到想要的資料
這裡我還要一個請求許可權的結果,判斷是否有許可權並給出提示
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for(int result:grantResults){
if(result != PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"許可授權才能使用此功能",Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
}else{
Toast.makeText(MainActivity.this,"發生未知錯誤",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
下部分的程式碼是Android介面佈局程式碼,這裡就不做出解釋
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/showLocation"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
這個是Android執行後的結果,這個結果只是讓大家看下,因為這個程式使用的是模擬器執行的程式,所以裡面的資料獲取的好像是錯誤的,大家把程式放到了真機上執行就可以獲取出正確的資訊