如何将具有最后位置的 LocationResult 发送到 PendingIntent

Posted

技术标签:

【中文标题】如何将具有最后位置的 LocationResult 发送到 PendingIntent【英文标题】:How to send LocationResult with last location to PendingIntent 【发布时间】:2017-10-02 21:25:00 【问题描述】:

如何发送PendingIntentLocationResult

我想使用相同的PendingIntent 来接收位置更改以接收最后一个位置。

查看代码的最后几行:

// Create pending intent for a service which received location changes
Intent locationIntent = new Intent(getApplicationContext(), LocationIntentService.class);
PendingIntent pendingIntent = PendingIntent.getService(
        getApplicationContext(),
        0,
        locationIntent,
        PendingIntent.FLAG_UPDATE_CURRENT
    );

// Start listening to location changes
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, pendingIntent);

// Get last location
Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

// Send last location
if(lastLocation != null) 
   // How to send it to the pending intent?
   // Result result = LocationResult.create( ... )
   // pendingIntent.send(result)

【问题讨论】:

您需要从FusedLocationApi 中找出Intent 中包含的额外内容。然后您可以通过添加相同的附加功能来“模拟”自己。 谢谢。正确,附加键是 FusedLocationProviderApi.KEY_LOCATION_CHANGED 但由于某种原因已被弃用。我看到LocationResulthasResult(intent)extractResults(intent) 可以从意图中读取,但我看不到相反的方式,如何设置LocationResult 来附加意图。我看到有一个writeToParcel,但不知道它是如何工作的 您应该添加调试日志并转储您从FusedLocationApi 获得的Intent,然后我可以帮助您模拟它。 【参考方案1】:

检查LocationResult.extractResult(intent) 的代码可以看出LocationResult 只不过是在Intent 中插入了一个带有特定ID 的Parcelable。以下 Kotlin 函数在给定的 Intent 中插入 List<Location> 作为 LocationResult

private const val EXTRA_LOCATION_RESULT = "com.google.android.gms.location.EXTRA_LOCATION_RESULT"

@VisibleForTesting(otherwise = VisibleForTesting.NONE)
fun insertResult(intent: Intent, locations: List<Location>) 
    val result = LocationResult.create(locations)
    intent.putExtra(EXTRA_LOCATION_RESULT, result)

注意:FusedLocationApi 已被弃用,而应使用 FusedLocationProviderClient。我已经应用上面的解决方案对BroadcastReceiverFusedLocationProviderClient接收更新进行单元测试

【讨论】:

以上是关于如何将具有最后位置的 LocationResult 发送到 PendingIntent的主要内容,如果未能解决你的问题,请参考以下文章

FusedLocationProviderClient 在多次 LocationRequest 后停止给出 locationResult

解组时找不到类:com.google.android.gms.location.LocationResult

FusedLocationProvider 有时会给出错误的位置

如何在最后一个位置将对象添加到 NSOrderedSet?

将具有分割号的字符串配置按指定位置进行过滤

如何将具有属性/权限的目录从一个位置复制到另一个位置?