同时适用于 android 6.0 与 5.0 的权限问题的解决办法(以地理位置信息为例)
访问量: 5072
今天我们的手机app 遇到的问题是 在小米5上 一用就崩溃.
后来使用腾讯的云测试,发现是我们的地理位置信息不对造成的. error log:
10-28 15:36:22.799: D/AndroidRuntime(30373): Shutting down VM
10-28 15:36:22.799: D/AndroidRuntime(30373): --------- beginning of crash
10-28 15:36:22.800: E/AndroidRuntime(30373): FATAL EXCEPTION: main
10-28 15:36:22.800: E/AndroidRuntime(30373): Process: com.tuling, PID: 30373
10-28 15:36:22.800: E/AndroidRuntime(30373): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tuling/com.tuling.MainActivity}: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
10-28 15:36:22.800: E/AndroidRuntime(30373): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2432)
解决办法: (感觉java代码好啰嗦)
Log.d(TAG, "======before get location..");
// for android 6.0
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "== in android 6.0, getting permission");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
} else{
Log.d(TAG, "== in android 5.0");
get_location();
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
get_location();
} else {
Log.d(TAG, "=== NOT got granted");
}
return;
}
}
}
private void get_location() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new TulingLocationListener());
// locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, locationListener);
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria, false);
// Location location = locationManager.getLastKnownLocation(bestProvider);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Log.d(TAG, "=====location===" + location);
if (null != location) {
Log.d(TAG, "开始设置经纬度");
lat1 = location.getLatitude();
long1 = location.getLongitude();
} else {
// beijing office location
lat1 = 39.993669;
long1 = 116.470126;
}
Log.d(TAG, "======after get location..=== lat:" + lat1 + "===lon:" + long1);
showFragment(TRAVEL_ASSISTANT_CODE);
}