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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

定位服务API案例

發(fā)布時(shí)間:2023/11/28 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定位服务API案例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

定位服務(wù)API案例
要使用定位服務(wù)API,需要確保設(shè)備已經(jīng)下載并安裝了HMS Core服務(wù)組件,并將Location Kit的SDK集成到項(xiàng)目中。
指定應(yīng)用權(quán)限

  1. Android提供了兩種位置權(quán)限: ACCESS_COARSE_LOCATION(粗略的位置權(quán)限)和ACCESS_FINE_LOCATION(精確的位置權(quán)限)。需要在“AndroidManifest.xml”文件中申請(qǐng)權(quán)限:
  2. 在Android Q版本中,如果需要應(yīng)用程序在后臺(tái)執(zhí)行時(shí)也具備持續(xù)定位能力,需要在“AndroidManifest.xml”文件中申請(qǐng)ACCESS_BACKGROUND_LOCATION權(quán)限:
  3. 在“AndroidManifest.xml”中添加后,還要在代碼中動(dòng)態(tài)申請(qǐng)一下權(quán)限(Android 6.0危險(xiǎn)權(quán)限要求):
  4. // Android SDK<=28 所需權(quán)限動(dòng)態(tài)申請(qǐng)
  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 所需權(quán)限動(dòng)態(tài)申請(qǐng),需添加“android.permission.ACCESS_BACKGROUND_LOCATION”權(quán)限
    
  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. }
    創(chuàng)建定位服務(wù)客戶端
    在項(xiàng)目中使用到定位服務(wù)的Activity中的onCreate()方法中創(chuàng)建一個(gè)FusedLocationProviderClient實(shí)例,通過(guò)該實(shí)例調(diào)用定位相關(guān)接口。
  29. // 定位交互接入對(duì)象
  30. private FusedLocationProviderClient fusedLocationProviderClient;
  31. // 定位請(qǐng)求信息對(duì)象
  32. private LocationRequest mLocationRequest;
  33. protected void onCreate(Bundle savedInstanceState) {
  34.  fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); 
    
  35. }
    說(shuō)明
    當(dāng)傳入?yún)?shù)為非Activity類型時(shí),如果使用FusedLocationProviderClient實(shí)例調(diào)用定位服務(wù)接口發(fā)生異常,就不會(huì)彈出UI交互界面提示用戶處理,只會(huì)返回錯(cuò)誤碼。例如:當(dāng)HMS Core不符合定位服務(wù)的版本要求時(shí),便會(huì)返回錯(cuò)誤碼907135003,此時(shí)需要手動(dòng)升級(jí)HMS Core。如果需要拉起升級(jí)引導(dǎo)界面,建議傳入Activity類型參數(shù)替代Context類型,創(chuàng)建FusedLocationProviderClient實(shí)例。
    檢查設(shè)備定位設(shè)置
    設(shè)備的相關(guān)定位設(shè)置會(huì)影響定位服務(wù)的定位結(jié)果,例如位置開關(guān)選項(xiàng)處于關(guān)閉狀態(tài)時(shí),將無(wú)法獲取到位置信息。因此,建議在持續(xù)獲取位置信息之前,先檢查設(shè)備設(shè)置是否滿足定位條件。定位服務(wù)提供了檢查設(shè)備定位相關(guān)設(shè)置的能力,通過(guò)LocationServices的getSettingsClient(Activity activity)獲取SettingsClient實(shí)例,然后調(diào)用checkLocationSettings(LocationSettingsRequest locationSettingsRequest)接口獲取定位設(shè)置結(jié)果,當(dāng)設(shè)置不滿足定位條件時(shí),可以調(diào)用startResolutionForResult接口用于彈框提示用戶打開對(duì)應(yīng)的權(quán)限(HMS Core 定位權(quán)限必須打開,Android Q版本必須選擇“始終允許”)。
  36. 調(diào)用getSettingsClient()接口獲取SettingsClient實(shí)例。
  37. SettingsClient settingsClient = LocationServices.getSettingsClient(this);
  38. 調(diào)用checkLocationSettings()檢查設(shè)備設(shè)置。
  39. LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
  40. mLocationRequest = new LocationRequest();
  41. builder.addLocationRequest(mLocationRequest);
  42. LocationSettingsRequest locationSettingsRequest = builder.build();
  43. // 檢查設(shè)備定位設(shè)置
  44. settingsClient.checkLocationSettings(locationSettingsRequest)
  45.  // 檢查設(shè)備定位設(shè)置接口成功監(jiān)聽回調(diào)
    
  46.  .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
    
  47.      @Override
    
  48.     public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
    
  49.         // 設(shè)置滿足定位條件,再發(fā)起位置請(qǐng)求
    
  50.         fusedLocationProviderClient
    
  51.             .requestLocationUpdates(mLocationRequest, mLocationCallback,Looper.getMainLooper())
    
  52.             // 請(qǐng)求位置更新接口成功監(jiān)聽回調(diào)
    
  53.             .addOnSuccessListener(new OnSuccessListener<Void>() {
    
  54.                 @Override
    
  55.                 public void onSuccess(Void aVoid) {
    
  56.                     // ...
    
  57.                 }
    
  58.             });
    
  59.     }
    
  60. })
    
  61. // 檢查設(shè)備定位設(shè)置接口失敗監(jiān)聽回調(diào)
    
  62. .addOnFailureListener(new OnFailureListener() {
    
  63.     @Override
    
  64.     public void onFailure(Exception e) {
    
  65.         // 設(shè)置不滿足定位條件
    
  66.         int statusCode = ((ApiException) e).getStatusCode();
    
  67.         switch (statusCode) {
    
  68.             case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
    
  69.                 try {
    
  70.                     ResolvableApiException rae = (ResolvableApiException) e;
    
  71.                     // 調(diào)用startResolutionForResult可以彈窗提示用戶打開相應(yīng)權(quán)限
    
  72.                     rae.startResolutionForResult(MainActivity.this, 0);
    
  73.                 } catch (IntentSender.SendIntentException sie) {
    
  74.                     // …
    
  75.                 }
    
  76.             break;
    
  77.         }
    
  78.     }
    
  79. });
    

持續(xù)獲取位置信息
如果希望應(yīng)用可以持續(xù)獲取設(shè)備位置,可以使用定位服務(wù)提供的requestLocationUpdates()接口。該接口根據(jù)入?yún)⑿问降牟煌?#xff0c;將以兩種不同的形式將位置信息返回。一種是通過(guò)調(diào)用已經(jīng)定義的LocationCallback類中onLocationResult()回調(diào)方法返回一個(gè)包含位置信息的LocationResult對(duì)象,另一種是將位置信息置于PendingIntent擴(kuò)展信息中返回。
當(dāng)應(yīng)用程序不再需要接收位置更新時(shí),應(yīng)當(dāng)停止位置更新,以便于降低功耗。要停止位置更新,可以調(diào)用removeLocationUpdates(),傳入與requestLocationUpdates()接口相對(duì)應(yīng)的LocationCallback或PendingIntent對(duì)象。這里以回調(diào)方式作為樣例,代碼如下。詳細(xì)的參數(shù)說(shuō)明請(qǐng)參見LocationService接口說(shuō)明。

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

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

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

獲取最后的已知位置
應(yīng)用可以調(diào)用getLastLocation()方法獲取設(shè)備最后的已知位置,大多情況下,該位置即為設(shè)備的當(dāng)前位置。代碼樣例如下:

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

說(shuō)明
getLastLocation()方法是從系統(tǒng)緩存中獲取位置信息的。如果獲取的位置信息為null,則可能是系統(tǒng)緩存已經(jīng)被清除;此時(shí)先調(diào)用requestLocationUpdates()方法獲取位置信息以刷新緩存,再調(diào)用getLastLocation()方法即可以獲取到位置信息。
使用模擬位置信息功能
具體操作步驟:打開“設(shè)置 > 系統(tǒng)和更新 > 開發(fā)人員選項(xiàng) > 選擇模擬位置信息應(yīng)用 > 選擇要模擬位置信息應(yīng)用”(如果沒有發(fā)現(xiàn)“開發(fā)人員選項(xiàng)”,請(qǐng)執(zhí)行如下操作:“設(shè)置 > 關(guān)于手機(jī) > 版本號(hào)”,連續(xù)點(diǎn)擊“版本號(hào)”7次,“開發(fā)人員選項(xiàng)”會(huì)出現(xiàn)在“系統(tǒng)與更新”頁(yè)面,再重復(fù)上述操作),代碼開發(fā)步驟如下:

  1. 在AndroidManifest.xml文件中配置模擬定位權(quán)限。
  2. <uses-permission
  3. android:name=“android.permission.ACCESS_MOCK_LOCATION”
  4. tools:ignore=“MockLocation,ProtectedPermissions” />
  5. 設(shè)置mock模式,調(diào)用setMockMode(boolean isMockMode)。
  6. // 設(shè)置mock模式,參數(shù)傳入ture:模擬模式;false:正常狀態(tài)
  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. 設(shè)置模擬位置信息,調(diào)用setMockLocation(Location mockLocation)。
  22. // 設(shè)置模擬位置信息
  23. final Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
  24. mockLocation.setLongitude(118.76);
  25. mockLocation.setLatitude(31.98);
  26. fusedLocationProviderClient.setMockLocation(mockLocation)
  27.  // 設(shè)置模擬位置信息成功監(jiān)聽回調(diào)
    
  28.  .addOnSuccessListener(new OnSuccessListener<Void>() {
    
  29.      @Override
    
  30.      public void onSuccess(Void aVoid) {
    
  31.         Log.i(TAG, "setMockLocation onSuccess");
    
  32.     }
    
  33. })
    
  34. // 設(shè)置模擬位置信息失敗監(jiān)聽回調(diào)
    
  35. .addOnFailureListener(new OnFailureListener() {
    
  36.     @Override
    
  37.     public void onFailure(Exception e) {
    
  38.         Log.i(TAG, "setMockLocation onFailure:" + e.getMessage());
    
  39.     }
    
  40. });
    

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。