其他分享
首页 > 其他分享> > android-addProximityAlert无法按预期工作

android-addProximityAlert无法按预期工作

作者:互联网

ios sdk具有强大的区域监视功能.我在android中需要这样的东西,我认为我们有两种选择.地理围栏和LocationManager.

Geofencing的示例和bug确实很整洁,因此我更喜欢LocationManager.除了其中一个以外,Etingting在LocationManager中都可以正常工作.如果将当前位置添加为ProximityAlert,则立即触发“ ENTERING”,但这是我的当前位置,并不意味着我进入了该区域.因此,如果我在区域中,则每次启动我的应用程序时都会触发“ ENTERING”.(即使我不动)

仅当用户真正进入区域时,我才能解决此问题并引发事件?

这是我为自己的位置添加PeddingIntents的方式.

    LocationManager locationManager =  (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);

    for(Place p : places)
    {
        Log.e("location", p.location);

        Bundle extras = new Bundle();
        extras.putString("name", p.displayName);
        extras.putString("id", p.id);
        Intent intent = new Intent(CommandTypes.PROX_ALERT_INTENT);
        intent.putExtra(CommandTypes.PROX_ALERT_INTENT, extras);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,Integer.parseInt(p.id), intent,PendingIntent.FLAG_CANCEL_CURRENT);
        float radius = 50f;
        locationManager.addProximityAlert(p.lat,
                p.lon, radius, 1000000, pendingIntent);

    }       

接收者

public class ProximityReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    final String key = LocationManager.KEY_PROXIMITY_ENTERING;
    final Boolean entering = intent.getBooleanExtra(key, false);

    Bundle b = intent.getBundleExtra(CommandTypes.PROX_ALERT_INTENT);
    String id = b.getString("id");
    Log.e("here" + id, "here");

    if (entering) {
        Log.e(TAG,"entering");
    } else {
        Log.e(TAG,"leaving");
    }
} 

表现

   <receiver android:name=".ProximityReceiver">
        <intent-filter>
            <action android:name="ACTION_PROXIMITY_ALERT" />
        </intent-filter>            
    </receiver>

非常感谢你

PS:iOS没有这个问题,他们的文档对此做了解释.

注册授权应用后,将立即开始监视地理区域.但是,不要期望立即收到事件.只有过境会产生事件.因此,如果在注册时用户的位置已经在区域内,则位置管理器不会自动生成事件.相反,您的应用必须在生成事件并将其发送给委托人之前,等待用户越过区域边界.也就是说,您可以使用CLLocationManager类的requestStateForRegion:方法来检查用户是否已经在区域边界内.

解决方法:

编辑:自从我编写此代码以来,geofence API中新增了一个东西“ setInitialTrigger”,它可以解决此问题:

https://developers.google.com/android/reference/com/google/android/gms/location/GeofencingRequest.Builder#setInitialTrigger%28int%29

是的,这很麻烦,很不幸,这是Android和IOS地理围栏有所不同的要点之一.

如果Android知道您在地理围栏内,则Android会发出警报,或者您在地理围栏内添加地理围栏.

我解决此问题的方法是在广播接收者中使用一个“宽限期”.基本上,当我创建Geofence时,我将其创建时间存储在sharedpreferences中,然后在onReceive中检查该值.

这样,所有“即时”匹配都会被过滤掉.也许3分钟对于其他人来说太长了,但是它对我有效,这取决于我如何使用我的应用程序中的地理围栏.

private static final Long MIN_PROXALERT_INTERVAL = 18000l; // 3 mins in milliseconds

long geofenceCreationTime = session.getPrefs().getCurrentGeofenceCreation();
long elapsedSinceCreation = now - geofenceCreationTime;
if(elapsedSinceCreation < CREATIONTIME_GRACE_PERIOD){
        if (ApplicationSession.DEBUG) {
            Log.d(TAG, "elapsedSinceCreation;"+elapsedSinceCreation+";less than;"+CREATIONTIME_GRACE_PERIOD+";exiting");
        }
        return;

    }

希望你明白我的意思.

希望能帮助到你.

标签:geofencing,android-geofence,locationmanager,location,android
来源: https://codeday.me/bug/20191122/2059476.html