文章目录
看客需知
本期主要记录,在Android SDK30及以上版本遇到的开发问题和兼容问题;
笔者是从compileSdkVersion 25升级到 30的,因为升级了as版本顺带也升级sdk嘛;
由于as版本过高,gradle默认版本为7.1;
SDK30对应Android系统是11;
只适合有Android开发基础的朋友看;
开发相关信息
As开发版本
Android Studio Bumblebee | 2021.1.1 Patch 3
Build #AI-211.7628.21.2111.8309675, built on March 17, 2022
Runtime version: 11.0.11+9-b60-7590822 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
项目信息
minSdkVersion 21
targetSdkVersion 30
gradle-6.7.1
com.android.tools.build:gradle:4.2.0
ext.kotlin_version = '1.7.10'
网络访问处理
加入网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
app依然无法访问网络!
问题原因
9.0及以上系统已经默认不支持http请求,谷歌公司默认要求是加密的链接
解决方法
方法1
把http改成https,需要后台接口开发人员进行修改。
方法2
可以把targetSdkVersion 改成27或者以下。
方法3
在res目录里创建xml文件夹,加入network_security_config.xml文件
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
在AndroidManifest.xml文件里的application标签属性上加入android:networkSecurityConfig="@xml/network_security_config"
即可正常的使用http协议的请求
创建文件和写入内容
权限不用多说,需要用代码获取或是手动添加。
运行时创建文件报错如下:
HwRemoteInputMethodManager: isCasting false because IHwDistributedWindowManager is invalid.
写入失败的原因
因为你用到的Environment.getExternalStorageDirectory()已经过时了(@Deprecated)
解决方法
在AndroidManifest.xml的application里写入android:requestLegacyExternalStorage="true"
将获取根目录的方法改为context.getExternalFilesDir("myFile" )即可。
路径为:内存卡根目录\Android\data\(一般是项目里的applicationId包路径 )\files\myFile
如果想直接写入files根目录,可以传控:context.getExternalFilesDir(null )
封装方法如下:
public static void writeFileTxt(Context context,String content,String name){
try {
File file = new File(context.getExternalFilesDir("myFile" )+ "/"+ name+ ".txt");
if(!file.exists()){
file.createNewFile();
}
RandomAccessFile raf = new RandomAccessFile(file, "rwd");
raf.seek(file.length());
raf.write(content.getBytes());
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Android11后,Google对于Android的安全性提升更大,严格要求权限等。
总结
后续遇到的SDK兼容问题也会记录在这里,方便回顾和分享。