【问题标题】:Android: LocationManager service stops updating when set to NETWORK_PROVIDERAndroid:LocationManager 服务在设置为 NETWORK_PROVIDER 时停止更新
【发布时间】:2014-04-14 14:01:15
【问题描述】:

对,情况如下;

我们开发了一款应用,它每 5 到 10 分钟检查一次用户的位置,以查找特定位置的内容。为此,我创建了一个服务来固定在后台(因此即使应用程序不直接在前台也可以更新),其中创建了一个 LocationController 来检查最新的已知位置。完成后,它会进行清理并将位置发送到数据库(这是此概念的必要条件)。

只要我使用 GPS_PROVIDER 检查位置,这一切都很好。但是,当我将它切换到 NETWORK_PROVIDER 时,它可能会在完全死亡之前再次检查位置。

我已尝试多种选项来防止此问题,但当我交换该 1 设置时,更新服务似乎没有任何效果。

这里有一些sn-ps应该与服务相关:

更新服务:

 @Override
public void onCreate() {
    super.onCreate();
    Log.d("Debug", "Created service");
    PowerManager mgr = (PowerManager)getSystemService(Context.POWER_SERVICE);
    wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();
    IntentFilter filter = new IntentFilter();
    filter.addAction(UPDATE_ACTION);

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Log.d("Starting", "Starting Service");

    mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    mAlarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

    Intent i = new Intent(UPDATE_ACTION);
    alarmManagerPendingIntent = PendingIntent.getBroadcast(this, 0, i, 0);
    alarmManagerPendingIntent.cancel();
    mAlarmManager.cancel(alarmManagerPendingIntent);

    mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                AlarmManager.INTERVAL_FIFTEEN_MINUTES,
                AlarmManager.INTERVAL_FIFTEEN_MINUTES, 
                alarmManagerPendingIntent);

    mLocationController = new LocationController(this, this);

    updateHandler = new Handler();

    return START_STICKY;
}

位置控制器:

private LocationListener locationListener = new LocationListener() {
    private boolean didSendLocation;
    public void onLocationChanged(Location location) {
        mLastLocation = location;
        mCallback.locationUpdate(location,false);
        didSendLocation = true;
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.d("Debug", "Status changed: "+status);
        Location _lastLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        Log.d("Debug", "Last location: "+_lastLocation); 
        if(!didSendLocation)
        {

            mCallback.locationUpdate(_lastLocation,false);
        }
        didSendLocation = false;
    }

    public void onProviderEnabled(String provider) {
        Log.d("Debug", "Provider Enabled");
    }

    public void onProviderDisabled(String provider) {
        Log.d("Debug", "Provider disabled");
    }
};

public LocationController(Context mContext, LocationControllerCallback callback) {
    this.mContext = mContext;
    mCallback = callback;
    Log.d("Debug", "Created LocationController");
    mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000, 100, locationListener);
    mLastLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

    mCallback.locationUpdate(mLastLocation,true);
}

所以,代码就像现在一样工作,但是当我交换时:

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000, 100, locationListener);

mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 300000, 100, locationListener);

它将不再更新。有什么想法吗?

【问题讨论】:

    标签: android service location locationmanager


    【解决方案1】:

    当您使用它来获取位置更新时:

    mLocationManager.requestLocationUpdates(...)
    

    您不需要AlarmManager 方法作为requestLocationUpdates 方法的第一个参数已经充当“计时器”。请参阅here 了解更多信息。

    此外,您可能需要在 AndroidManifest.xml 文件中包含以下指令:

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
    

    如果没有这些权限,无论您使用哪个提供程序,requestLocationUpdates 方法都可能无法按预期工作。

    更新 1:

    我会在 Service 中初始化您的 LocationController 类,例如:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        this.mLocationController = new LocationController(this);
        return Service.START_NOT_STICKY;
    }
    

    然后,在一个activity(MainActivity或你项目中的另一个activity)的onResume方法中启动上述Service,并在同一个activity的onPause方法中暂停该Service。

    【讨论】:

    • locationcontroller 使用 LocationControllerCallback 引用 UpdateService,所以我相信我之前尝试过,但由于无法完成回调,它最终停止工作。至于清单,COARSE 和 FINE 位置已经在那里,但我会尝试添加 CONTROL_LOCATION_UPDATES。
    • 更新 1:当应用程序在后台(并且可能被 Android 杀死)时,这是否仍允许位置更新继续?出于这个原因,该服务专门运行,因为该应用程序可以在外出开始时使用,并且仍然可以在您的位置上保持最新状态,比如说,3 小时后您的手机放在口袋里。
    • 好吧,您可能需要更改为 Service.START_STICKY; 在您的情况下。但请先尝试Service.START_NOT_STICKY,然后再进行更改以查看它是否满足您的要求。
    • 嗯,这种情况现在正在使用,但遗憾的是似乎并没有解决问题。使用 NETWORK_PROVIDER 时,它似乎只更新 1 或 2 次,但使用 GPS_PROVIDER 时它仍然有效 :(
    • 不工作?在真实设备上还是在 AVD 上?请详细说明。请注意,如果您使用LocationManager.NETWORK_PROVIDER,您可能需要启用使用无线网络选项。否则,如果您使用 LocationManager.GPS_PROVIDER,请启用 使用 GPS 卫星 选项。这些选项可在 设置 | 中找到。 Android 设备上的定位服务 菜单选项。
    【解决方案2】:

    如果它特定于 NETWORK_PROVIDER,您可能会看到以下错误: https://code.google.com/p/android/issues/detail?id=57707

    最初的错误报告将三星 Galaxy S3 列为受影响的设备。

    为了帮助排除故障 - 您可能还想尝试在 GPS Benchmark app 中选择 NETWORK_PROVIDER(完全公开 - 它是我的应用程序),以查看此应用程序是否表现出相同的行为。如果是这样,则可能是设备问题。

    如果您确定您遇到了上述问题,如果您希望看到它得到修复,请务必在问题页面上加注星标。

    【讨论】:

    • 谢谢,我查过了,不是设备问题。所以至少这意味着我可以看看应该可以解决的问题:p
    【解决方案3】:

    我已通过切换到 Google Play Fused Location 提供商解决了这个问题。可以在这里找到更详细的帖子:https://stackoverflow.com/a/19282976/3532181

    遗憾的是,标准网络提供商在更新方面似乎太不可靠了,从 8 分钟内的更新到向应用发送新更新之前的几小时不等。

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题。我能够通过添加所需的权限来解决这个问题。该问题与新的后台服务限制有关。

      <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
      

      Check this documentation for better understanding.

      【讨论】:

        猜你喜欢
        • 2017-10-06
        • 1970-01-01
        • 2015-08-23
        • 2016-01-06
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多