【Android SDK30版本】代码明显是正确的为何升级了sdk版本号就报错或是警告呢(已解决)

文章目录

看客需知

开发相关信息

As开发版本

项目信息

网络访问处理

问题原因

解决方法

方法1

方法2

方法3

创建文件和写入内容

写入失败的原因

解决方法

总结


看客需知

本期主要记录,在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兼容问题也会记录在这里,方便回顾和分享。

猜你喜欢

转载自blog.csdn.net/piyangbo/article/details/126467034