我是靠谱客的博主 粗犷棉花糖,最近开发中收集的这篇文章主要介绍Android 6.0及以上版本定位权限开发问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在开发APP过程中,发现Android 6.0版本的百度定位无法使用,查阅资料后发现android 6.0及以上系统 权限管理变了,定位属于隐私权限,需要在运行时手动申请

关于Android5.0和Android6.0在权限方面的区别:

Android5.0

对于6.0以下的权限申请,需要在AndroidManifest.xml中进行相关配置
配置示例:

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

这些权限都是在安装之前需要你确认申请的权限信息,安装完成之后,手机的这些权限都开启,因此定位服务可以正常使用

Android6.0

对于Android6.0,因为其权限修改为动态申请,因此在安装完成启动APP之后,进入某些需要权限的页面Activity,手机会弹出提示框,进行权限申请,这个部分就是我们代码需要完成的部分
在CustomApplication中添加getPermissionList方法:

public List<String> getPermissionList(Activity activity){
        List<String> permission = new ArrayList<>();
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_FINE_LOCATION);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_COARSE_LOCATION);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.READ_PHONE_STATE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_WIFI_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_WIFI_STATE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.ACCESS_NETWORK_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.ACCESS_NETWORK_STATE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.INTERNET);
        if(ContextCompat.checkSelfPermission(activity, com.bupt.smart.smart.Manifest.permission.CHANGE_WIFI_STATE)!= PackageManager.PERMISSION_GRANTED)
            permission.add(com.bupt.smart.smart.Manifest.permission.CHANGE_WIFI_STATE);
        return permission;
    }

当你的Activty或者Fragment需要定位时:
首先自定义一个权限获取码,用于回调函数中做对应处理
private final int SDK_PERMISSION_REQUEST = 1;

//判断权限
/**
     *  onClick 集中处理函数
     *  @param v
     * */
    public void onClick(View v) {
        Intent intent;
        switch (v.getId()) {
            //跳转到地址页面
            case R.id.iv_upperlower:{
                intent = new Intent(this.getActivity(), LocationActivity.class);
                this.startActivity(intent);
                //this.getActivity().finish();
            }break;

            //刷新地址
            case R.id.iv_refresh:{
                //判断权限
                List<String> permission = application.getPermissionList(getActivity());
                if(permission.size()>0){
                // 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
                   requestPermissions(permission.toArray(new String[permission.size()]),SDK_PERMISSION_REQUEST);
                    return;
                }
                mLocationClient.stop();
                mLocationClient.start();

            }break;
        }
    }

在Activity的onRequestPermissionResult回调函数中做处理:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode,permissions,grantResults);
        switch (requestCode){
        // requestCode即所声明的权限获取码
            case SDK_PERMISSION_REQUEST:{
                mLocationClient.stop();
                mLocationClient.start();
            }break;
        }
    }

这样的权限申请只需要一次,之后启动该APP不需要再申请
权限添加越全越好!!!
很有可能因为某个看起来不是很重要的权限缺失导致百度地图无法使用

最后

以上就是粗犷棉花糖为你收集整理的Android 6.0及以上版本定位权限开发问题的全部内容,希望文章能够帮你解决Android 6.0及以上版本定位权限开发问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部