【问题标题】:Android [LocationManager] requestLocationUpdates(), java.lang.RuntimeExceptionAndroid [LocationManager] requestLocationUpdates(), java.lang.RuntimeException
【发布时间】:2019-06-29 06:12:47
【问题描述】:

service 中请求位置更新时出现此错误。已授予定位权限,LocationManager 不为空,Provider 不为空。

LocationManager: [LocationManager] requestLocationUpdates(), 
    java.lang.RuntimeException
        at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1013)
        at android.location.LocationManager.requestLocationUpdates(LocationManager.java:595)
        at com.trackinglibrary.service.DataService.createAndRequestLocationUpdates(DataService.java:759)
        at com.trackinglibrary.service.DataService.onStartCommand(DataService.java:252)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3694)
        at android.app.ActivityThread.access$1600(ActivityThread.java:202)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:198)
        at android.app.ActivityThread.main(ActivityThread.java:6729)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我在onStartCommand()内部呼叫的位置代码:

@SuppressLint("MissingPermission")
    private void createAndRequestLocationUpdates() {
        try {

            if (!TrackThatUtils.isLocationEnabled(getApplicationContext())) {
                Log.e(TAG, "Location is disable.");
                return;
            }

            if (locationManager == null) {
                locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

                addProximityAlert();
            }

            if (locationManager == null || !locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Log.e(TAG, "Location provider is disable.");
                return;
            }

            // getting GPS status
            boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            Log.e(TAG, "Location provider is: " + isGPSEnabled);

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                    ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.

                Log.e(TAG, "== Error On onConnected() Permission not granted");
                //Permission not granted by user so cancel the further execution.
                return;
            }


            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
            criteria.setAltitudeRequired(false);
            criteria.setSpeedRequired(true);
            //setCostAllowed(true): This flag enables LocationManager to exchange “data packet” with
            // 3G/4G network base stations in order to get better location
            criteria.setCostAllowed(true);
            criteria.setBearingRequired(false);

            //API level 9 and up
            criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
            criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);

            String provider = locationManager.getBestProvider(criteria, true);

//          locationManager.requestLocationUpdates(gpsFreqInMillis, gpsFreqInDistance, criteria, locationListener, null);

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                    0, this);
            Log.i(TAG, "request for location updates..");
        } catch (SecurityException | IllegalArgumentException e) {
            Log.e(TAG, "Exception inside createAndRequestLocationUpdates(): " + e);
        }
    }

【问题讨论】:

  • 检查我的答案,它是一个完整的解决方案,使用 google api 客户端运行时权限,试试看,如果有帮助,请告诉我
  • 可能你正在从任何处理程序/线程调用requestLocationUpdates。尝试在 Activity 或 Fragment 的 onCreate() 中替换您的调用方法。
  • @Quicklearner 感谢您的快速回复。我在服务中使用此代码,并且我使用的是 LocationManager 未融合的 API
  • 使用 google api 客户端是一种很好且安全的技术 :) 我会说一个很好的做法

标签: java android location locationmanager runtimeexception


【解决方案1】:

根据documentationRuntimeException在调用线程没有Looper时被调用。在拨打LocationManager之前尝试拨打Looper.prepare()

【讨论】:

  • 不,在任何 Android Activity 和 Service 中默认调用 Looper。
【解决方案2】:

不要在共享首选项中存储 Location 类在我的情况下这是问题

【讨论】:

  • 我没有在共享偏好中存储位置
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2014-04-03
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多