一:方法一
6.0以及6.0以上 需求动态申请:
1.清单文件
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2.java代码(写,读,定位)
private void checkLocationReadWritePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED&& ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { } else { //不具有获取权限,需要进行权限申请 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION}, GET_LOCATION_WRITE_PERMISSION_REQUEST); } } else { } }
private final int GET_LOCATION_WRITE_PERMISSION_REQUEST = 103;
返回数据:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if(requestCode==GET_LOCATION_WRITE_PERMISSION_REQUEST){ //读写,定位 int size = 0; if (grantResults.length >= 1) { int writeResult = grantResults[0]; //读内存权限 boolean writePermissionGranted = writeResult == PackageManager.PERMISSION_GRANTED;//写内存权限 if (!writePermissionGranted) { size++; } //写内存权限 int readGranted = grantResults[1]; boolean readPermissionGranted = readGranted == PackageManager.PERMISSION_GRANTED;//读内存权限 if (!readPermissionGranted) { size++; } //定位权限 int locationResult = grantResults[2]; boolean locationPermissionGranted = locationResult == PackageManager.PERMISSION_GRANTED; //定位权限 if (!locationPermissionGranted) { size++; } if (size == 0) { } else { Toast.makeText(this, "请到设置-权限管理中开启", Toast.LENGTH_SHORT).show(); } } } }
总结:
方法一在部分手机(vivo,等)不可以正确判断是否被授权定位信息,都是返回1(不管是允许还是拒绝)
方法二:(一位群友(大飞机)告之)
如果有百度地图就幸福了^.^,根据里面的onReceiveLocation来做判断
/** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if(location == null){ LogUitl.e("==============MyLocationListenner======null"); return; } int locType=location.getLocType(); if(62==locType || 63==locType || 67==locType || (161<locType && locType<168)){ LogUitl.e("==============MyLocationListenner======查看权限"); }else{ LogUitl.e("==============MyLocationListenner======返回数据"); } } public void onReceivePoi(BDLocation poiLocation) { } }
权限页面跳转:
Intent localTntent=new Intent(); localTntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if(Build.VERSION.SDK_INT>=9){ localTntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); localTntent.setData(Uri.fromParts("package", getPackageName(),null)); }else if(Build.VERSION.SDK_INT<=8){ localTntent.setAction(Intent.ACTION_VIEW); localTntent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails"); localTntent.putExtra("com.android.setting.ApplicationPkgName",getPackageName()); } startActivity(localTntent);
定位(集合)跳转:
Intent i=new Intent(); i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(i);