1

Я использовал следующий код и диалог, который запрашивает разрешения, как ожидается. Но когда я нажимаю «разрешить», он ничего не делает. Сообщение журнала не отображается так, как будто разрешение не было предоставлено, поэтому я перешел к моим параметрам, чтобы проверить, включено ли местоположение, и оно было отключено. Разве это не должно было быть, потому что я предоставил доступ к моему местоположению? Если я вручную включил его, а затем снова запустил приложение, как только он запросит мое разрешение, он будет работать и отображает сообщение журнала, но не является полным требованием разрешений (через диалог), чтобы включить местоположение (когда он выключен), если пользователь нажимает «разрешить»? Я что-то не так? Следует отметить, что я бегу приложение на api23Не удается включить местоположение на android api23?

есть это код в моем OnCreate:

mApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 

mApiClient.connect(); 

    // Create the LocationRequest object 
     mLocationRequest = LocationRequest.create() 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
       .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
       .setFastestInterval(1 * 1000); // 1 second, in milliseconds 

и это мой OnConnected метод:

public void onConnected(@Nullable Bundle bundle) { 
      //start the service 
//checking and asking for permission 

      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        ActivityCompat.requestPermissions(this, 
          new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
          MY_PERMISSION_ACCESS_FINE_LOCATION); 
       } 
       // 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. 
       return; 
      } 
      Location location = LocationServices.FusedLocationApi.getLastLocation(mApiClient); 

      if (location == null) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mApiClient, mLocationRequest, this); 

      } else { 
       //If everything went fine lets get latitude and longitude 
       currentLatitude = location.getLatitude(); 
       currentLongitude = location.getLongitude(); 
       Log.v("currentLatitude",currentLatitude + " WORKS " + currentLongitude + ""); 
      } 

    } 
+0

Разрешение приложения полностью отличается от настройки местоположения. Для запроса пользователя включить режим местоположения см. Здесь: http://stackoverflow.com/a/31816683/4409409 –

ответ

2

попробовать этот код:

private LocationCoord gps = null; 
private static final int PERMISSION_REQUEST_CODE = 1; 

В OnCreate():

//GPS Manage 
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    boolean gps_enabled = false; 
    boolean network_enabled = false; 

    try { 
     gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
    } catch (Exception ex) { 
    } 

    try { 
     network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } catch (Exception ex) { 
    } 

    if (!gps_enabled && !network_enabled) { 
     // notify user 
     AlertDialog.Builder dialog = new AlertDialog.Builder(this); 
     dialog.setMessage("Allow ImHere to access this device's location?"); 
     dialog.setPositiveButton("Allow", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface paramDialogInterface, int paramInt) { 
       // TODO Auto-generated method stub 
       Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(myIntent); 
       //get gps 
      } 
     }); 
     dialog.setNegativeButton("Deny", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface paramDialogInterface, int paramInt) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     dialog.show(); 
    } 

    gps = new LocationCoord(this); 

@Override 
protected void onStart() { 
    super.onStart(); 

    // permission android 6.0 
    if (!checkPermission()) { 
     requestPermission(); 
    } 

} 


private boolean checkPermission(){ 
    int result = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    if (result == PackageManager.PERMISSION_GRANTED) return true; 
    else return false; 
} 

private void requestPermission(){ 
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE); 
} 

Вы будете нуждаться в этом разрешения на Manifest.xml:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

Вы можете получить LoocationCord.java здесь: https://github.com/toomyy94/ImHere-Chatbot/blob/master/app/src/main/java/pt/ua/tomasr/imhere/modules/LocationCoord.java

+1

спасибо, это работает. –

1

вам может потребоваться добавить зависимость в вашем файле build.gradle:

compile 'com.google.android.gms:play-services-location:10.0.1

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

  • Нет связанных вопросов^_^