2017-01-11 9 views
2

Я пытаюсь реализовать GPStracker в своем проекте, который я хочу использовать, чтобы получить пользователей lat, long и post code. Я следую этому руководству; http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/, однако, похоже, я не могу заставить код работать и после нескольких часов пытаться и исследовать, я не уверен, что мне следует делать. Я довольно новичок в Android, поэтому я, вероятно, делаю глупую ошибку.Как получить пользователей Расположение через GPS с целевым API 23 и выше

Когда я следуйте инструкциям в руководстве, как показано на веб-сайте размещены я получаю сообщение об ошибке на моем коде, говоря:

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException` 

на линиях:

  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(); 
         } 
        } 
       } 
      } 
     } 

и

public void stopUsingGPS(){ 
    if(locationManager != null){ 
     locationManager.removeUpdates(GPSTracker.this); 
    } 
} 

Я использую API 25, работая с фрагментами и находясь в Интернете, похоже, это проблема с API 23 и выше. У многих других есть похожие вопросы, но когда я пытаюсь дать ответы на них, я все равно не могу заставить его работать; например,

Я попытался реализации:

if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
     && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    return; 
} 

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

Я также включил следующие разрешения в моем проекте:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+2

Этот учебник ** четыре с половиной года **. В Android-годы это практически навсегда. Придерживайтесь учебных материалов, которые являются более свежими (в идеале, менее двух лет). FWIW, [здесь пример приложения, демонстрирующий получение местоположения, а также использование разрешений времени выполнения] (https://github.com/commonsguy/cw-omnibus/tree/master/Location/Classic). – CommonsWare

+0

:) правда сказать. Будем держать это в уме. Спасибо за ссылку – SumOne

ответ

2

Если ваши цели приложений API 23 или выше, вы должны запросить разрешение Место во время выполнения.

Добавьте этот код в вашей деятельности:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
private void checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 
      new AlertDialog.Builder(this) 
        .setTitle("Location Permission Needed") 
        .setMessage("This app needs the Location permission, please accept to use location functionality") 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          //Prompt the user once explanation has been shown 
          ActivityCompat.requestPermissions(MapLocationActivity.this, 
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
            MY_PERMISSIONS_REQUEST_LOCATION); 
         } 
        }) 
        .create() 
        .show(); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // location-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 

        //Permission was granted, do your thing! 
       } 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

Тогда просто позвоните checkLocationPermission() в onCreate() деятельности.

+0

Нужно ли включать это вместе с другим кодом из учебника или это будет работать самостоятельно? – SumOne

+0

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

+0

Включен ли GPS после разрешения на местоположение? –