Android检查位置权限错误

Posted

技术标签:

【中文标题】Android检查位置权限错误【英文标题】:Android check Location permission error 【发布时间】:2018-09-08 10:47:45 【问题描述】:
public class GPSService extends Service implements LocationListener  


// saving the context for later use
private final Context mContext;

// if GPS is enabled
boolean isGPSEnabled = false;
// if Network is enabled
boolean isNetworkEnabled = false;
// if Location co-ordinates are available using GPS or Network
public boolean isLocationAvailable = false;

// Location and co-ordinates coordinates
Location mLocation;
double mLatitude;
double mLongitude;

// Minimum time fluctuation for next update (in milliseconds)
private static final long TIME = 30000;
// Minimum distance fluctuation for next update (in meters)
private static final long DISTANCE = 20;

// Declaring a Location Manager
protected LocationManager mLocationManager;

public GPSService(Context context) 
    this.mContext = context;
    mLocationManager = (LocationManager) mContext
            .getSystemService(LOCATION_SERVICE);



/**
 * Returs the Location
 *
 * @return Location or null if no location is found
 */
public void getLocation() 
    try 


        // Getting GPS status
        isGPSEnabled = mLocationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // If GPS enabled, get latitude/longitude using GPS Services
        if (isGPSEnabled) 
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
            
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
            if (mLocationManager != null) 
                mLocation = mLocationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (mLocation != null) 
                    mLatitude = mLocation.getLatitude();
                    mLongitude = mLocation.getLongitude();
                    isLocationAvailable = true; // setting a flag that
                    // location is available
                    return;
                
            
        

        // If we are reaching this part, it means GPS was not able to fetch
        // any location
        // Getting network status
        isNetworkEnabled = mLocationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (isNetworkEnabled) 
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
            
            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
            if (mLocationManager != null) 
                mLocation = mLocationManager
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if (mLocation != null) 
                    mLatitude = mLocation.getLatitude();
                    mLongitude = mLocation.getLongitude();
                    isLocationAvailable = true; // setting a flag that
                                                // location is available
                    return;
                
            
        
        // If reaching here means, we were not able to get location neither
        // from GPS not Network,
        if (!isGPSEnabled) 
            // so asking user to open GPS
            askUserToOpenGPS();
        

     catch (Exception e) 
        e.printStackTrace();
    
    // if reaching here means, location was not available, so setting the
    // flag as false
    isLocationAvailable = false;


/**
 * Gives you complete address of the location
 * 
 * @return complete address in String
 */
public String getLocationAddress() 

    if (isLocationAvailable) 

        Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
        // Get the current location from the input parameter list
        // Create a list to contain the result address
        List<Address> addresses = null;
        try 
            /*
             * Return 1 address.
             */
            addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
         catch (IOException e1) 
            e1.printStackTrace();
            return ("IO Exception trying to get address:" + e1);
         catch (IllegalArgumentException e2) 
            // Error message to post in the log
            String errorString = "Illegal arguments "
                    + Double.toString(mLatitude) + " , "
                    + Double.toString(mLongitude)
                    + " passed to address service";
            e2.printStackTrace();
            return errorString;
        
        // If the reverse geocode returned an address
        if (addresses != null && addresses.size() > 0) 
            // Get the first address
            Address address = addresses.get(0);
            /*
             * Format the first line of address (if available), city, and
             * country name.
             */
            /* Return the text */
            return String.format(
                    "%s, %s, %s",
                    // If there's a street address, add it
                    address.getMaxAddressLineIndex() > 0 ? address
                            .getAddressLine(0) : "",
                    // Locality is usually a city
                    address.getLocality(),
                    // The country of the address
                    address.getCountryName());
         else 
            return "No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.";
        
     else 
        return "Location Not available";
    





/**
 * get latitude
 * 
 * @return latitude in double
 */
public double getLatitude() 
    if (mLocation != null) 
        mLatitude = mLocation.getLatitude();
    
    return mLatitude;


/**
 * get longitude
 * 
 * @return longitude in double
 */
public double getLongitude() 
    if (mLocation != null) 
        mLongitude = mLocation.getLongitude();
    
    return mLongitude;


/**
 * close GPS to save battery
 */
public void closeGPS() 
    if (mLocationManager != null) 
        mLocationManager.removeUpdates(GPSService.this);
    


/**
 * show settings to open GPS
 */
public void askUserToOpenGPS() 
    AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);

    // Setting Dialog Title
    mAlertDialog.setTitle("Location not available, Open GPS?")
    .setMessage("Activate GPS to use use location services?")
    .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialog, int which) 
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
            
        )
        .setNegativeButton("Cancel",new DialogInterface.OnClickListener() 
            public void onClick(DialogInterface dialog, int which) 
                dialog.cancel();
                
            ).show();


/** 
 * Updating the location when location changes
 */
@Override
public void onLocationChanged(Location location) 
    mLatitude = location.getLatitude();
    mLongitude = location.getLongitude();


@Override
public void onProviderDisabled(String provider) 


@Override
public void onProviderEnabled(String provider) 


@Override
public void onStatusChanged(String provider, int status, Bundle extras) 
  

   @Override
   public IBinder onBind(Intent arg0) 
    return null;
   


在权限检查部分,我的应用程序每次都会崩溃......

java.lang.NullPointerException:尝试调用虚拟方法'int android.content.Context.checkSelfPermission(java.lang.String)' 空对象引用 android.content.ContextWrapper.checkSelfPermission(ContextWrapper.java:745) 在 com.example.fritzmaier.mysimplelistview.GPSService.getLocation(GPSService.java:72)

崩溃于:

  if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
                checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
            

【问题讨论】:

你是否也获得了清单的权限? 那在我的清单中 【参考方案1】:

使用ActivityCompat 使用此权限检查

if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
        return;
    

【讨论】:

“无法解析方法getActivity()”和“getContext()” 使用你的上下文,使用this关键字而不是getActivity() java.lang.NullPointerException:尝试在同一行中的空对象引用上调用虚拟方法“int android.content.Context.checkPermission(java.lang.String, int, int)” 我是说在你的课堂上传递你的上下文你有mContext你可以传递这个。【参考方案2】:

使用两种方式.. 1.

  if (ContextCompat.checkSelfPermission(webView.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) 
          

2.ActivityCompat方式。

【讨论】:

以上是关于Android检查位置权限错误的主要内容,如果未能解决你的问题,请参考以下文章

强制关闭 Android 位置权限

android获取GPS权限

android获取GPS权限

android获取GPS权限

Android位置权限错误

Android 谷歌地图我的位置权限