我们使用较大的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"
...
>
- 摄像头调用中,权限获取失败问题:
//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:
- The project ‘…’ may be using a version of the Android Gradle plug-in that does not contain the method (e.g. ‘testCompile’ was added in 1.1.0). Up
如果修改后出现:
Conflict with dependency ‘com.android.support:support-annotations’ …
那么就是版本的冲突问题,需要我们强制转化:
如app的gradle文件作如下声明,让annotations 强制转换为提示的版本(message窗口显示):
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
然后重新编译