谷歌地图和被动提供者

时间:2012-03-08 15:24:25

标签: android location locationmanager

我正在与被动提供商合作,使用此代码。

Intent intent = new Intent(PASSIVE_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, pi);

我在AndroidManifest.xml中定义广播接收器

<receiver
    android:name="passiveLocationReceiver"
    android:enabled="true" >
        <intent-filter>
            <action android:name="com.passive_location_update" />
        </intent-filter>
</receiver>

passiveLocationReceiver是

public class passiveLocationReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (!PASSIVE_ACTION.equals(action))
            return;

        Log.d("chitacan","Passive Provider Event!!!");
        }
    }

此代码适用于其他地理位置应用程序(Facebook,foursquare等) 但是对于“Google Map”应用程序,它没有。(d.android.com解释了“PASSIVE_PROVIDER”,可以在其他应用程序请求位置时更新。)

即使我可以通过“Google Map”应用程序查看我的位置,但我无法从被动提供程序获取任何事件。(我看不到passiveLocationReceiver的日志消息。)

好吧,我试图在命令行中转储LocationManager的状态,

$adb shell dumpsys location

然而,LocationManager的状态并没有改变任何东西。看起来像“谷歌地图”应用程序 不使用LocationManager。

当“Google Map”应用程序更新我的位置时,有没有办法获得被动事件? 或者我做错了什么?

2 个答案:

答案 0 :(得分:2)

最近的Google地图和其他地图服务使用基于Google Play服务的新版位置API。他们不仅仅依赖GPS或网络提供商,而且他们使用“融合”的。因此,传统的PASSIVE_PROVIDER无法使用“融合”方法捕获位置更新。

您最好将新的API与LocationClient和LocationRequest一起使用PRIORITY_NO_POWER。检查以下代码

        LocationRequest lRequest = LocationRequest.create()
                                              .setPriority(LocationRequest.PRIORITY_NO_POWER)
                                              .setInterval(mMIN_LOCATION_UPDATE_INTERVERAL_IN_MILLISECONDS);

    Intent locationIntent = new Intent(mPASSIVE_LOCATION_INTENT_ACTION_STRING);
    mPassiveLocationPendingIntent = PendingIntent.getBroadcast(mContext, 0, locationIntent ,PendingIntent.FLAG_UPDATE_CURRENT);
    mPassiveLocationClient.requestLocationUpdates(lRequest, mPassiveLocationPendingIntent);

答案 1 :(得分:0)

requestLocationUpdates仅接收位置值的更改或“更新”。 Google地图将广播GPS位置提供商提供的位置值更改。

如果从模拟器进行测试,请尝试为模拟位置输入新值。否则,边走边试试。

但是,我也注意到Wi-Fi(网络)位置的变化不是来自谷歌地图,就像来自其他类似的应用程序一样。

在你的情况下 - 也许GPS未启用,或者它没有从当前状态改变位置,因此你没有收到该听众的位置任何“更新”。 (我发现这个主题是因为我想知道为什么谷歌地图没有广播Wi-Fi位置变化,如果有人想出来的话)