2015-11-06 89 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; 
      } 
     } 
    } 
} 

我得到一個語法錯誤,當我在onRequestPermissionResult()打電話getLastKnownLocation()。它告訴我再次檢查許可,即使我已經這樣做了。因此,誰能告訴什麼是錯我的執行這裏

回答

2

方法getLastKnownLocation標註有:

@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) 

因爲這個原因,你得到警告:

呼叫要求可能被拒絕的權限用戶:代碼應明確檢查,看是否許可可用(用的checkPermission)或明確處理潛在拋出:SecurityException

你有兩個選擇,以避免該警告:

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