Android位置管理器错误“退出,并在onLocationChanged第152行“ 1”上显示错误”

时间:2018-09-06 16:42:43

标签: java android geolocation

我的Android应用中有一个位置管理器,有时可以正常工作。有时我会运行该应用程序,它将获得位置更新(有一些错误)。有时我会运行它,它只会每两秒钟抛出一次此错误,而不会收到任何位置更新:

E/IzatSvc_PassiveLocListener: Exiting with error onLocationChanged line 152 "1"

这是我的课程,用于管理位置事件:

package com.company.AppName;

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;

public class LocationListenerService extends JobService {
  private static final String TAG = "LocationListenerService";
  private LocationManager locationManager = null;
  private LocationListener locationListener = null;
  private String locationProvider = null;

  public LocationListenerService() {}

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
  }

  @Override
  public boolean onStartJob(JobParameters params) {
    Log.i(TAG, "onStartJob");
    startLocationManager(params);
    return true;
  }

  @Override
  public boolean onStopJob(JobParameters params) {
    Log.i(TAG, "onStopJob");
    return false;
  }

  public void startLocationManager(JobParameters params) {
    if(locationManager != null) return;

    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
  //    criteria.setPowerRequirement(Criteria.POWER_LOW);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);

    locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    locationProvider = locationManager.getBestProvider(criteria, true);
    locationListener = new LocationListener();

    if (locationProvider != null) {
      Log.v(TAG, "Location provider: " + locationProvider);
    } else {
      Log.e(TAG, "Location provider is null. Location events will not work.");
      return;
    }

    if (locationListener == null) {
      Log.e(TAG, "Location listener is null. Location events will not work.");
      return;
    }

    // Finish job after first time updating location with the server
    NativeApp.shared().getLocationData((NativeApp app, String response) -> {
      Log.i(TAG, "Received location data response. Finishing job.");
      jobFinished(params, true);
    });

    try {
      locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);
    } catch (java.lang.SecurityException ex) {
      Log.e(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
      Log.e(TAG, "network provider does not exist, " + ex.getMessage());
    }
  }

  private class LocationListener implements android.location.LocationListener {
    @Override
    public void onLocationChanged(Location location) {
      if(location == null) {
        Log.w(TAG, "onLocationChanged skipped: null location");
        return;
      }
      Log.i(TAG, "onLocationChanged: " + location.toString());
      NativeApp.shared().updateLocation(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
      Log.i(TAG, "onProviderDisabled: " + provider);
    }

    @Override
    public void onProviderEnabled(String provider) {
      Log.i(TAG, "onProviderEnabled: " + provider);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
      Log.i(TAG, "onStatusChanged: " + provider);
    }
  }
}

为什么会这样?为什么位置更新有时会起作用,而其他时候却不起作用?

编辑:放弃了几个小时并重新运行后,该应用仍在反复引发错误,但在大约10秒钟后记录了此错误并开始接收位置更新:

E/XTCC-6.1.2.10: [FDAL_OSListener] handleLocationUpdate:  failed: 2
D/LocationManagerService: incoming location: gps
I/LgeGnssLocationProvider: Intent - android.location.GPS_FIX_CHANGE
D/LgeGnssLocationProvider: GPS_FIX_CHANGE_ACTION! , mGpsNavigating =true
D/LocationManagerService: incoming location: gps

设备/版本信息:

该设备是运行Android 8.0.0的LG G6(LG-H872)

这是我的AndroidManifest.xml文件的内容:

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.company.AppName" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" android:name="org.apache.cordova.camera.FileProvider">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/camera_provider_paths" />
        </provider>
        <service android:enabled="true" android:name="com.company.AppName.LocationListenerService" android:permission="android.permission.BIND_JOB_SERVICE" />
        <service android:exported="false" android:name="com.company.AppName.AppFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26" />
</manifest>

3 个答案:

答案 0 :(得分:4)

long milliseconds = 5000; // 5 seconds
float minimusDistance = 5.5; // 5.5m distance from current location
locationManager.requestLocationUpdates(locationProvider, milliseconds, minimusDistance, locationListener);

尝试此代码段。希望它能解决您的问题。

这只是在发生,因为这个原因,您没有提供获取位置更新的最小间隔和最小距离。这就是为什么您会收到此错误。

这里是链接,请查看- requestLocationUpdates

答案 1 :(得分:2)

此位置更新根据Android版本而有所不同。最近,Android在 oreo 中引入了background location limits,它表示:

  

当您的应用位于前台时,您应该会收到位置信息   根据您的要求进行更新。当您的应用进入   背景,您的应用只会收到几次位置更新   每小时(以后可能会调整位置更新间隔   基于系统影响和开发人员的反馈。

出于以下原因,Android建议使用融合的位置API,您必须针对以下情况考虑使用它:

  

如果您的应用需要访问包含以下内容的位置记录   频繁更新,请使用融合位置的批处理版本   提供者API元素,例如FusedLocationProviderApi接口。   当您的应用在后台运行时,此API会收到   用户位置比非批处理API更为频繁。保持在   请注意,您的应用仍然只能批量接收更新   每小时几次。

请参考以下链接以获取更好的方法:

https://github.com/googlesamples/android-play-location/tree/master/LocationUpdatesForegroundService/app

https://codelabs.developers.google.com/codelabs/background-location-updates-android-o/index.html#0

注意:仅当您的应用不再位于前台时,“ O”背景位置限制才会生效。

如果以上两个链接对您不起作用,请告诉我。

答案 2 :(得分:0)

我遇到了同样的问题,因为我的设备(通用移动GM8d )8.1操作系统已更新为Android 9(Pie)。之后,我尝试通过 LocationManager 通过以下方式进行定位:

LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 
      0, 
      0,
      new LocationListener() {
          @Override
          public void onLocationChanged(Location location) {
              double latitude = location.getLatitude();
              double longitude = location.getLongitude();
          }
      });

但是,在更新Android 9之后,我遇到了同样的错误。解决方案请按照以下步骤操作:

  1. 重新启动设备。
  2. 之后,打开地图应用程序(地图)。这样,GPS将被本机系统激活。
  3. 然后,清除应用程序的缓存和存储,然后从设备上卸载它。
  4. 在Android Studio的顶部栏中,依次选择“文件”>“使缓存无效/重新启动...”
  5. 最后,在设备上运行应用程序
  6. 位置将在13-24秒内显示,具体取决于您所在的地区。

完成!

相关问题