关于Android6.0 百度定位权限问题

在android 6.0 之前,系统默认把权限都给应用,6.0 之后系统动态的分配权限给应用。

本文主要是说一下Android 6.0 之后百度定位动态分配权限的问题。

在我上一篇博客中提到 android studio 运行百度给的demo 时,一直报key 验证失败的问题, 替换为这个key

DD279b2a90afdf0ae7a3796787a0742e

问题就可以解决了,具体原因不详。 有知道的大神希望留言给指教一下!


进入正题:

下面我们看一下 百度定位需要的权限

<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />

使用百度定位,需要在AndroidManifest 文件中配置如上权限,其中 ACCESS_COARSE_LOCATION ,ACCESS_FINE_LOCATION ,READ_SETTINGS,WRITE_EXTERNAL_STORAGE。需要动态分配

我们先顶一个String 数组,保存需要检查的权限。如下

private static final String[] PERMISSIONS_CONTACT = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE} ;

定义一个请求码

private static final int REQUEST_CONTACTS = 1000

首先我们在启动定位之前要先判断 当前的版本,如果版本大于等于23 我们要动态给权限,如果小于23 我们就直接启动。

if (Build.VERSION.SDK_INT>=23)
{
    showSetPermission();
}else
{
    mLocClient.start();
}

下面我们看下showSetPermission()代码

 

private void showContacts()
{
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
            || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
        requestSetPermissions();
    }else
    {
        mLocClient.start();
    }
}

这个方法很简单,就是判断一下需要的权限有没有给,如果有给权限就启动,没有给权限就去设置权限

private void requestSetPermissions(View view) {

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE))
    {
        Snackbar.make(view, "permission_contacts_rationale",
                Snackbar.LENGTH_INDEFINITE)
                .setAction("ok", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        ActivityCompat.requestPermissions(LocationDemo.this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);
                    }
                })
                .show();
    }else
    {
        ActivityCompat.requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);
    }
}

这个方法是用来弹出提示框,请求用户赋予权限。

 

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
    if (requestCode==REQUEST_CONTACTS){
        if (PermissionUtil.verifyPermissions(grantResults)) {
            mLocClient.start();
        } else {
            Toast.makeText(getApplicationContext(),"授权不通过",Toast.LENGTH_SHORT).show();
        }
    }else{
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

改方法接收返回的 权限结果,判断是否权限授予成功,成功则执行需要权限的代码,不成功则提示用户。


在fragment 中使用权限 写法有些不一样,主要是

requestPermissions()

方法不能再使用

  ActivityCompat.requestPermissions(LocationDemo.this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);

而应该使用fragment.requestPermissions();

不然权限返回结果会回到activity 的onRequestPermissionsResult 方法中,而应该回到fragment的onRequestPermissionsResult方法中。

时间比较仓促,如果有不懂得欢迎加QQ群像我提问。谢谢!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值