2016-07-10 1 views
2

Я создал свой собственный класс Java для обработки места:Странная ошибка в коде, чтобы получить текущее местоположение с андроида

public class MyLocationHandler extends Service implements LocationListener { 

...... 

public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

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

      // getting network status 
      isNetworkEnabled = locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       // First get location from Network Provider 
       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("Network", "Network"); 
        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
       // if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "GPS Enabled"); 
         if (locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return location; 
    } 

....... 

} 

И это выдержка из build.gradle:

android { 
     compileSdkVersion 23 
     buildToolsVersion "24.0.0" 

     defaultConfig { 
      applicationId "com.mobile.appoperator" 
      minSdkVersion 15 
      targetSdkVersion 23 
      versionCode 1 
      versionName "1.0" 
     } 

ПРОБЛЕМА: Проблема в том, что мне нужно добавить checkSelfPermission, но это не действие, и если я его добавлю, я не могу запустить приложение на Android версии старше api lvl 23.

Итак, как я могу справиться с этой проблемой?

+0

Ответы в этой теме могут быть полезны для ya: http://stackoverflow.com/questions/32292675/how-to-request-permissions-from-a-service-in-android-marshmallow. FWIK, без использования библиотек, вы не можете запрашивать разрешения без доступа к активности. С помощью библиотеки поддержки android support-v4 вы можете запросить разрешения в своих фрагментах и ​​действиях обратно совместимым образом с помощью ContextCompat, FragmentCompat и ActivityCompat. Если вы не можете найти способ запроса разрешений в своей службе, я бы вместо этого рекомендовал запрашивать разрешения для первого запуска в вашей деятельности или фрагменте. –

ответ

2

Я выполняю свою работу внутри службы, и да, я в настоящее время не запрашиваю разрешения, потому что по какой-то причине вы должны быть внутри действия, чтобы сделать это;

Вот что я вместо этого:

private void updateUserLocation(){ 
    if (Build.VERSION.SDK_INT >= 23 && 
      ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED && 
      ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 

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

    if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ 

     LocationListener listener = new GpsListener(); 

     Looper.prepare(); 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener); 
     Looper.loop(); 

    }else { 
     if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 

      LocationListener listener = new GpsListener(); 

      Looper.prepare(); 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); 
      Looper.loop(); 
     } 
    } 
} 

Лучший подход фактически просить пользователя предоставить вам разрешение, чтобы сделать это рано, возможно, в первой активности приложения, как Логин (тогда они будут видеть в каком-нибудь окне, объясняющем, почему вам нужно включить GPS или такое разрешение в вашем приложении.

Если пользователь отклонил запрос на получение разрешения, вам придется перенаправить ваше приложение - в основном, грустно и делать то, что вы сделали бы без функций местоположения.

РЕЗЮМЕ

В общем, так как вы только попросить пользователя предоставить разрешение, возможно, один раз, вы можете сделать это при их входе в систему (так как после того, как они предоставляют разрешение, они тогда не будет предлагать), то при на самом деле получение обновлений местоположения, вы можете просто проверить, как я делаю ниже и двигаться дальше!

Надеюсь, это поможет вам добраться куда-нибудь.

Смежные вопросы