在代码:

locationManager.requestLocationUpdates(provider,60000,50,getListener()); 中报以下的错误:

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`

在AndroidManifest.xml中加入了以下的权限还是有错:

百度了下,大意是:

调用需要的权限可能被用户拒绝:代码应该显式地检查权限是否可用(用checkPermission)或显式地处理一个潜在的“SecurityException”

这是在使用 Android marshmallow(API 23)时出现的

参考以下代码解决:

public class MainActivity extends AppCompatActivity {

/* GPS Constant Permission */

private static final int MY_PERMISSION_ACCESS_COARSE_LOCATION = 11;

private static final int MY_PERMISSION_ACCESS_FINE_LOCATION = 12;

/* Position */

private static final int MINIMUM_TIME = 10000; // 10s

private static final int MINIMUM_DISTANCE = 50; // 50m

/* GPS */

private String mProviderName;

private LocationManager mLocationManager;

private LocationListener mLocationListener;

@Override

protected void onCreate(Bundle savedInstanceState) {

...

mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

// Get the best provider between gps, network and passive

Criteria criteria = new Criteria();

mProviderName = mLocationManager.getBestProvider(criteria, true);

// API 23: we have to check if ACCESS_FINE_LOCATION and/or ACCESS_COARSE_LOCATION permission are granted

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED

|| ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

// No one provider activated: prompt GPS

if (mProviderName == null || mProviderName.equals("")) {

startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));

}

// At least one provider activated. Get the coordinates

switch (mProviderName) {

case "passive":

mLocationManager.requestLocationUpdates(mProviderName, MINIMUM_TIME, MINIMUM_DISTANCE, this);

Location location = mLocationManager.getLastKnownLocation(mProviderName);

break;

case "network":

break;

case "gps":

break;

}

// One or both permissions are denied.

} else {

// The ACCESS_COARSE_LOCATION is denied, then I request it and manage the result in

// onRequestPermissionsResult() using the constant MY_PERMISSION_ACCESS_FINE_LOCATION

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {

ActivityCompat.requestPermissions(this,

new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},

MY_PERMISSION_ACCESS_COARSE_LOCATION);

}

// The ACCESS_FINE_LOCATION is denied, then I request it and manage the result in

// onRequestPermissionsResult() using the constant MY_PERMISSION_ACCESS_FINE_LOCATION

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

}

}

}

@Override

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

switch (requestCode) {

case MY_PERMISSION_ACCESS_COARSE_LOCATION: {

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted

} else {

// permission denied

}

break;

case MY_PERMISSION_ACCESS_FINE_LOCATION: {

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted

} else {

// permission denied

}

break;

}

}

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐