日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

定位服务API案例

發布時間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定位服务API案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定位服務API案例
要使用定位服務API,需要確保設備已經下載并安裝了HMS Core服務組件,并將Location Kit的SDK集成到項目中。
指定應用權限

  1. Android提供了兩種位置權限: ACCESS_COARSE_LOCATION(粗略的位置權限)和ACCESS_FINE_LOCATION(精確的位置權限)。需要在“AndroidManifest.xml”文件中申請權限:
  2. 在Android Q版本中,如果需要應用程序在后臺執行時也具備持續定位能力,需要在“AndroidManifest.xml”文件中申請ACCESS_BACKGROUND_LOCATION權限:
  3. 在“AndroidManifest.xml”中添加后,還要在代碼中動態申請一下權限(Android 6.0危險權限要求):
  4. // Android SDK<=28 所需權限動態申請
  5. if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
  6.  Log.i(TAG, "android sdk <= 28 Q");
    
  7.  if (ActivityCompat.checkSelfPermission(this,
    
  8.      Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
    
  9.      && ActivityCompat.checkSelfPermission(this,
    
  10.          Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    
  11.      String[] strings =
    
  12.          {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
    
  13.     ActivityCompat.requestPermissions(this, strings, 1);
    
  14. }
    
  15. } else {
  16. // Android SDK>28 所需權限動態申請,需添加“android.permission.ACCESS_BACKGROUND_LOCATION”權限
    
  17. if (ActivityCompat.checkSelfPermission(this,
    
  18.     Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
    
  19.     && ActivityCompat.checkSelfPermission(this,
    
  20.         Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
    
  21.     && ActivityCompat.checkSelfPermission(this,
    
  22.         "android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
    
  23.     String[] strings = {android.Manifest.permission.ACCESS_FINE_LOCATION,
    
  24.         android.Manifest.permission.ACCESS_COARSE_LOCATION,
    
  25.         "android.permission.ACCESS_BACKGROUND_LOCATION"};
    
  26.     ActivityCompat.requestPermissions(this, strings, 2);
    
  27. }
    
  28. }
    創建定位服務客戶端
    在項目中使用到定位服務的Activity中的onCreate()方法中創建一個FusedLocationProviderClient實例,通過該實例調用定位相關接口。
  29. // 定位交互接入對象
  30. private FusedLocationProviderClient fusedLocationProviderClient;
  31. // 定位請求信息對象
  32. private LocationRequest mLocationRequest;
  33. protected void onCreate(Bundle savedInstanceState) {
  34.  fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); 
    
  35. }
    說明
    當傳入參數為非Activity類型時,如果使用FusedLocationProviderClient實例調用定位服務接口發生異常,就不會彈出UI交互界面提示用戶處理,只會返回錯誤碼。例如:當HMS Core不符合定位服務的版本要求時,便會返回錯誤碼907135003,此時需要手動升級HMS Core。如果需要拉起升級引導界面,建議傳入Activity類型參數替代Context類型,創建FusedLocationProviderClient實例。
    檢查設備定位設置
    設備的相關定位設置會影響定位服務的定位結果,例如位置開關選項處于關閉狀態時,將無法獲取到位置信息。因此,建議在持續獲取位置信息之前,先檢查設備設置是否滿足定位條件。定位服務提供了檢查設備定位相關設置的能力,通過LocationServices的getSettingsClient(Activity activity)獲取SettingsClient實例,然后調用checkLocationSettings(LocationSettingsRequest locationSettingsRequest)接口獲取定位設置結果,當設置不滿足定位條件時,可以調用startResolutionForResult接口用于彈框提示用戶打開對應的權限(HMS Core 定位權限必須打開,Android Q版本必須選擇“始終允許”)。
  36. 調用getSettingsClient()接口獲取SettingsClient實例。
  37. SettingsClient settingsClient = LocationServices.getSettingsClient(this);
  38. 調用checkLocationSettings()檢查設備設置。
  39. LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
  40. mLocationRequest = new LocationRequest();
  41. builder.addLocationRequest(mLocationRequest);
  42. LocationSettingsRequest locationSettingsRequest = builder.build();
  43. // 檢查設備定位設置
  44. settingsClient.checkLocationSettings(locationSettingsRequest)
  45.  // 檢查設備定位設置接口成功監聽回調
    
  46.  .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
    
  47.      @Override
    
  48.     public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
    
  49.         // 設置滿足定位條件,再發起位置請求
    
  50.         fusedLocationProviderClient
    
  51.             .requestLocationUpdates(mLocationRequest, mLocationCallback,Looper.getMainLooper())
    
  52.             // 請求位置更新接口成功監聽回調
    
  53.             .addOnSuccessListener(new OnSuccessListener<Void>() {
    
  54.                 @Override
    
  55.                 public void onSuccess(Void aVoid) {
    
  56.                     // ...
    
  57.                 }
    
  58.             });
    
  59.     }
    
  60. })
    
  61. // 檢查設備定位設置接口失敗監聽回調
    
  62. .addOnFailureListener(new OnFailureListener() {
    
  63.     @Override
    
  64.     public void onFailure(Exception e) {
    
  65.         // 設置不滿足定位條件
    
  66.         int statusCode = ((ApiException) e).getStatusCode();
    
  67.         switch (statusCode) {
    
  68.             case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
    
  69.                 try {
    
  70.                     ResolvableApiException rae = (ResolvableApiException) e;
    
  71.                     // 調用startResolutionForResult可以彈窗提示用戶打開相應權限
    
  72.                     rae.startResolutionForResult(MainActivity.this, 0);
    
  73.                 } catch (IntentSender.SendIntentException sie) {
    
  74.                     // …
    
  75.                 }
    
  76.             break;
    
  77.         }
    
  78.     }
    
  79. });
    

持續獲取位置信息
如果希望應用可以持續獲取設備位置,可以使用定位服務提供的requestLocationUpdates()接口。該接口根據入參形式的不同,將以兩種不同的形式將位置信息返回。一種是通過調用已經定義的LocationCallback類中onLocationResult()回調方法返回一個包含位置信息的LocationResult對象,另一種是將位置信息置于PendingIntent擴展信息中返回。
當應用程序不再需要接收位置更新時,應當停止位置更新,以便于降低功耗。要停止位置更新,可以調用removeLocationUpdates(),傳入與requestLocationUpdates()接口相對應的LocationCallback或PendingIntent對象。這里以回調方式作為樣例,代碼如下。詳細的參數說明請參見LocationService接口說明。

  1. 設置持續定位請求參數。
  2. LocationRequest mLocationRequest = new LocationRequest();
  3. // 設置位置更新的間隔(單位為毫秒)
  4. mLocationRequest.setInterval(10000);
  5. // 設置定位類型
  6. mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
  7. 定義位置更新回調。
  8. LocationCallback mLocationCallback;
  9. mLocationCallback = new LocationCallback() {
  10.  @Override        
    
  11.  public void onLocationResult(LocationResult locationResult) {        
    
  12.      if (locationResult != null) {        
    
  13.          // 處理位置回調結果
    
  14.      }        
    
  15.  }        
    
  16. };
  17. 調用requestLocationUpdates()進行持續定位。
  18. fusedLocationProviderClient
  19.  .requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())        
    
  20.  .addOnSuccessListener(new OnSuccessListener<Void>() {        
    
  21.      @Override        
    
  22.      public void onSuccess(Void aVoid) {        
    
  23.          // 接口調用成功的處理
    
  24.      }        
    
  25.  })
    
  26.  .addOnFailureListener(new OnFailureListener() {        
    
  27.     @Override        
    
  28.     public void onFailure(Exception e) {        
    
  29.        // 接口調用失敗的處理
    
  30.     }        
    
  31. });
    

說明
如果接口調用成功,獲取位置信息失敗,請參見接口調用成功,獲取不到位置信息。
4. 調用removeLocationUpdates()停止位置更新。

  1. // 注意:停止位置更新時,mLocationCallback必須與requestLocationUpdates方法中的LocationCallback參數為同一對象。
  2. fusedLocationProviderClient.removeLocationUpdates(mLocationCallback)
  3.  // 停止位置更新成功監聽回調
    
  4.  .addOnSuccessListener(new OnSuccessListener<Void>() {        
    
  5.      @Override        
    
  6.      public void onSuccess(Void aVoid) {      
    
  7.         //...
    
  8.      }        
    
  9.  })
    
  10. // 停止位置更新失敗監聽回調
    
  11. .addOnFailureListener(new OnFailureListener() {        
    
  12.     @Override        
    
  13.     public void onFailure(Exception e) {      
    
  14.        // ...
    
  15.     }        
    
  16. });
    

獲取最后的已知位置
應用可以調用getLastLocation()方法獲取設備最后的已知位置,大多情況下,該位置即為設備的當前位置。代碼樣例如下:

  1. // 獲取最后的已知位置
  2. Task task = fusedLocationProviderClient.getLastLocation()
  3.  // 獲取最后的已知位置成功監聽回調
    
  4.  .addOnSuccessListener(new OnSuccessListener<Location>() {        
    
  5.      @Override      
    
  6.      public void onSuccess(Location location) {        
    
  7.          if (location == null) {        
    
  8.             return;        
    
  9.          }        
    
  10.         // 成功時Location對象處理邏輯
    
  11.         // ...
    
  12.     }        
    
  13. })
    
  14. // 獲取最后的已知位置失敗監聽回調
    
  15. .addOnFailureListener(new OnFailureListener() {        
    
  16.     @Override        
    
  17.     public void onFailure(Exception e) {        
    
  18.        // ...
    
  19.     }        
    
  20. });
    

說明
getLastLocation()方法是從系統緩存中獲取位置信息的。如果獲取的位置信息為null,則可能是系統緩存已經被清除;此時先調用requestLocationUpdates()方法獲取位置信息以刷新緩存,再調用getLastLocation()方法即可以獲取到位置信息。
使用模擬位置信息功能
具體操作步驟:打開“設置 > 系統和更新 > 開發人員選項 > 選擇模擬位置信息應用 > 選擇要模擬位置信息應用”(如果沒有發現“開發人員選項”,請執行如下操作:“設置 > 關于手機 > 版本號”,連續點擊“版本號”7次,“開發人員選項”會出現在“系統與更新”頁面,再重復上述操作),代碼開發步驟如下:

  1. 在AndroidManifest.xml文件中配置模擬定位權限。
  2. <uses-permission
  3. android:name=“android.permission.ACCESS_MOCK_LOCATION”
  4. tools:ignore=“MockLocation,ProtectedPermissions” />
  5. 設置mock模式,調用setMockMode(boolean isMockMode)。
  6. // 設置mock模式,參數傳入ture:模擬模式;false:正常狀態
  7. boolean mockFlag = true;
  8. fusedLocationProviderClient.setMockMode(mockFlag)
  9.  .addOnSuccessListener(new OnSuccessListener<Void>() {
    
  10.      @Override
    
  11.      public void onSuccess(Void aVoid) {
    
  12.          Log.i(TAG, "setMockMode onSuccess");
    
  13.      }
    
  14.  })
    
  15. .addOnFailureListener(new OnFailureListener() {
    
  16.     @Override
    
  17.     public void onFailure(Exception e) {
    
  18.         Log.i(TAG, "setMockMode onFailure:" + e.getMessage());
    
  19.     }
    
  20. });
    
  21. 設置模擬位置信息,調用setMockLocation(Location mockLocation)。
  22. // 設置模擬位置信息
  23. final Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
  24. mockLocation.setLongitude(118.76);
  25. mockLocation.setLatitude(31.98);
  26. fusedLocationProviderClient.setMockLocation(mockLocation)
  27.  // 設置模擬位置信息成功監聽回調
    
  28.  .addOnSuccessListener(new OnSuccessListener<Void>() {
    
  29.      @Override
    
  30.      public void onSuccess(Void aVoid) {
    
  31.         Log.i(TAG, "setMockLocation onSuccess");
    
  32.     }
    
  33. })
    
  34. // 設置模擬位置信息失敗監聽回調
    
  35. .addOnFailureListener(new OnFailureListener() {
    
  36.     @Override
    
  37.     public void onFailure(Exception e) {
    
  38.         Log.i(TAG, "setMockLocation onFailure:" + e.getMessage());
    
  39.     }
    
  40. });
    

總結

以上是生活随笔為你收集整理的定位服务API案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。