Android动态权限,gradle 版本问题

4 篇文章 0 订阅
1 篇文章 0 订阅

我们使用较大的gradle 版本导致的动态权限关闭的问题:
这种情况主要出现在Android 6.0、7.0、8.0、9.0的手机中出现较明显
1.网络请求Http网络协议请求失败问题:
在工程的res 文件中创建xml 文件夹,其次创建一个network_security_config.xml文件:
文件内容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

其次在Android的清单文件中(AndroidManifest.xml)中的
添加下面的代码部分,重新编译,一下就可以使用http 网络协议了。

<application
	  android:networkSecurityConfig="@xml/network_security_config"
	  ...
	  >
  1. 摄像头调用中,权限获取失败问题:
//PackageManager 类中的静态变量: public static final int PERMISSION_GRANTED = 1;
PackageManager.PERMISSION_GRANTED
//检测摄像头权限
        if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1)
        {
            if (ContextCompat.checkSelfPermission(this,
                    android.Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
                //先判断有没有权限 ,没有就在这里进行权限的申请
                ActivityCompat.requestPermissions(this,
                        new String[]{android.Manifest.permission.CAMERA},0);

            }else {
                //说明已经获取到摄像头权限了 想干嘛干嘛
            }
        }else {
            //这个说明系统版本在6.0之下,不需要动态获取权限。

        }


  @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode)
        {
            case 0:
                if (grantResults.length>0&&grantResults[0]!= PackageManager.PERMISSION_GRANTED){
                   //提醒用户手动开启权限
               
                }
                break;
            default:
                break;

        }


    }

3.地图定位中位置权限Gps 获取失败问题

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // Android M Permission check
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) ==
                    PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) ==
                            PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            } else {
                ActivityCompat.requestPermissions(this, new String[]{
                                Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION},
                        1);
            }
        }



@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
            case 2:
                if (grantResults[0] == PERMISSION_GRANTED) {
                    // TODO request success  设置位置定位
          
                }
                break;
            case 3:
            //获取位置权限成功!
                break;
        }
    }

如果我们是用的Android studio 版本号小于3.0那么当前的软件会兼容,如果Android studio 的版本大于3.0那么可以按照上面的方法解决权限访问失败的问题
一般我们可以在Android studio 中新建一个工程,那么作为案例我们可以参照它的gradle 的插件版本,和gradle 版本解决当前动态依赖库的兼容问题,以便导入原来的工程代码

将高版本的Android Studio 换成低于3.0版本的编译工具时,需要注意动态库的格式变化如:

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}



中的google 要换成:
buildscript {
    repositories {
        maven {url 'https://maven.google.com'}
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        maven {url 'https://maven.google.com'}
        jcenter()
    }
}

才能获取到当前的依赖库的代码,不然找不到会出现:
Error:(5, 0) Gradle DSL method not found: ‘google()’ Possible causes:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile'junit:junit:4.12'
    androidTestCompile 'com.android.support.test:runner:1.0.2'
    configurations.all {
        resolutionStrategy.force 'com.android.support:support-annotations:26.0.0-alpha1'
    }
}

如果出现下面的问题:
Error:Execution failed for task ‘:app:mockableAndroidJar’. > java.util.zip.ZipException: invalid entry compressed size (expected 34531 but got 34245 bytes)
那么需要我们添加如下的脚本配置:
File -> Settings -> Build, Execution, Deployment -> Compiler
添加 “Command-line Options”: -x :app:mockableAndroidJar
然后重新编译

gradle 版本号对应的Android 插件版本

Android Studio 历史版本

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值