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);
【问题讨论】:
你是否也获得了清单的权限?使用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检查位置权限错误的主要内容,如果未能解决你的问题,请参考以下文章