文件保存路径不要含有特殊符号,建议只包含英文、数字和下划线,否则在某些手机上会出现访问文件错误。特别是根据时间来保存文件时容易写出以下代码:
val filePath: String = ctx.getExternalFilesDir(Environment.DIRECTORY_DCIM).toString() +
File.separator +
SimpleDateFormat().format("yyyyMMdd_HH:mm:ss").format(Date()) +
File.separator + "test.txt"
val file = File(filePath)
以上代码包含了冒号 ,很容易出现兼容性问题。
判断文件存在与否要调用方法:
file.exists()
如果直接判空,如果文件刚刚删除,并不会马上置空。
if(file == null){
//todo
}
Android 7 及以上版本抓包要做相应的配置,原因是 Android 官方调整了相应的安全策略。配置可参考网络安全配置。
比如使用 Charles 抓包,解决方法如下:
方法一(手机本地上已经安装Charles证书,值得说明的是有些手机要把 pem 后缀改为 crt):
- 在AndroidManifest.xml文件中添加如下配置:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
</application>
- 在res/xml/路径下新建文件 network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--为了方便测试,记得发包的时候注释掉-->
<base-config cleartextTrafficPermitted="true" >
<trust-anchors>
<certificates
overridePins="true"
src="system" />
<certificates
overridePins="true"
src="user" />
</trust-anchors>
</base-config>
<!-- <domain-config>
<domain includeSubdomains="true">你要抓取的域名</domain>
<trust-anchors>
<certificates src="user"
overridePins="true"
/>//信任用户自己安装的证书
</trust-anchors>
</domain-config>-->
</network-security-config>
方法二(手机本地上是否安装有证书都可):
1.(同上) 在AndroidManifest.xml文件中添加如下配置:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
</application>
- 在res/xml/路径下新建文件 network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--为了方便测试,记得发包的时候注释掉-->
<base-config cleartextTrafficPermitted="true" >
<trust-anchors>
<certificates src="@raw/证书文件名"/>
</trust-anchors>
</base-config>
<!-- <domain-config>
<domain includeSubdomains="true">你要抓取的域名</domain>
<trust-anchors>
<certificates src="user"
overridePins="true"
/>//信任用户自己安装的证书
</trust-anchors>
</domain-config>-->
</network-security-config>
- 在res目录下新建一个raw文件夹,将手机上安装的证书文件放入res/raw/目录下,证书格式:pem,crt等,步骤2中的证书文件名,就是你放入res/raw/目录下文件的名字。
<layer-list> 中的自定义 shape设定的大小无效,叠在上层较小的shape被拉伸成最大的shape,设置gravity 和size无效,在 api23+ 上没有这个问题。此时可以通过 <inset> 设置 left,top,right 和 bottom 来指定偏移位置。如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_home" />
<item android:gravity="right">
<inset
android:insetLeft="15dp"
android:insetTop="3dp"
android:insetRight="3dp"
android:insetBottom="15dp">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@android:color/holo_red_dark" />
</shape>
</inset>
</item>
</layer-list>
此时,没有必要在 <shape> 下指定 <size>,否则还是可能出现拉伸的情况。
RecyclerView 的 overScrollsMode 与 scrollbars 显示冲突。开发某个需求为 RecyclerView 添加 scrollbars 一直没有显示,发现在 style 中设置了 android:overScrollMode 为 never。
<style name="common_linear_rlv">
...
<item name="android:overScrollMode">never</item>
...
</style>
这和 Android 的 setWillNotDraw() 优化有关,scrollbars 并不会改变 WILL_NOT_DRAW 的 flag,通俗地说就是不会调用 onDraw() 方法。解决方法如下:
- 设置 RecyclerView 的背景为透明
android:background="@android:color/transparent"
- 设置 setWillNotDraw(false)
- addItemDecoration()
不要在 sqlite 数据库中使用 is 开头的字段。
Kotin 协程使用 Flow 报错误,如下:
导包问题,加上下面即可:
import kotlinx.coroutines.flow.collect
或者
import kotlinx.coroutines.flow.*