2015-11-06 3 views
2

Я пытаюсь реализовать разрешение времени выполнения для местоположения. Реализация выглядит следующим образом:Android 6.0 Разрешение на размещение

public class MyLocationManager implements android.location.LocationListener, ActivityCompat.OnRequestPermissionsResultCallback { 

    private static LocationManager m_locationManager; 
    private static final int REQUEST_COARSE_LOCATION = 999; 
    private static final int REQUEST_FINE_LOCATION = 998; 

    private String provider; 
    private Context mContext; 

    public void startListenLocation(Context context) { 

     this.mContext = context; 
     m_locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 

     ... 

     if (Build.VERSION.SDK_INT >= 23 && ((ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)) != PackageManager.PERMISSION_GRANTED)) { 
      ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION) ; 
     } else { 
      Location location = m_locationManager.getLastKnownLocation(provider); 
     } 

     ... 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_COARSE_LOCATION: { 

       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        //compiler error on the following line 
        Location myLocation = m_locationManager.getLastKnownLocation(provider); 
       } else { 
        //Permission denied 
       } 
       return; 
      } 
     } 
    } 
} 

Я получаю синтаксическую ошибку, когда я звоню getLastKnownLocation() в onRequestPermissionResult(). Он говорит мне снова проверить разрешение, даже если я уже это сделал. Так может кто-нибудь сказать, что случилось с моей реализацией здесь

ответ

2

Метод getLastKnownLocation помечаются:

@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) 

по этой причине вы получите предупреждение:

вызова требуется разрешение, которое может быть отвергнуто пользователем: код должен явно проверять, доступно ли разрешение (с checkPermission) или явно обрабатывать потенциальную безопасностьException

У вас есть два варианта, чтобы избежать предупреждения:

  1. Добавить комментарий перед вызовом getLastKnownLocation:

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
        switch (requestCode) { 
         case REQUEST_COARSE_LOCATION: 
         { 
          if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
           //noinspection ResourceType 
           Location myLocation = m_locationManager.getLastKnownLocation(provider); 
          } else { 
           //Permission denied 
          } 
          return; 
         } 
        } 
    } 
    
  2. рефакторинга кода, добавьте метод getLastKnownLocationIfAllowed:

    public void startListenLocation(Context context) { 
    
        this.mContext = context; 
        m_locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
    
        if (!getLastKnownLocationIfAllowed()) 
         ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION); 
    } 
    
    private boolean getLastKnownLocationIfAllowed() { 
        if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
         Location location = m_locationManager.getLastKnownLocation(provider); 
         return true; 
        } 
    
        return false; 
    } 
    

    В вашей деятельности:

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
        switch (requestCode) { 
         case REQUEST_COARSE_LOCATION: { 
          if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
           myLocationManager.getLastKnownLocationIfAllowed(); 
          } else { 
           //Permission denied 
          } 
          return; 
         } 
        } 
    } 
    
Смежные вопросы