文件保存路徑不要含有特殊符號(hào),建議只包含英文、數(shù)字和下劃線,否則在某些手機(jī)上會(huì)出現(xiàn)訪問(wèn)文件錯(cuò)誤。特別是根據(jù)時(shí)間來(lái)保存文件時(shí)容易寫(xiě)出以下代碼:
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)
以上代碼包含了冒號(hào) ,很容易出現(xiàn)兼容性問(wèn)題。
判斷文件存在與否要調(diào)用方法:
file.exists()
如果直接判空,如果文件剛剛刪除,并不會(huì)馬上置空。
if(file == null){
//todo
}
Android 7 及以上版本抓包要做相應(yīng)的配置,原因是 Android 官方調(diào)整了相應(yīng)的安全策略。配置可參考網(wǎng)絡(luò)安全配置。
比如使用 Charles 抓包,解決方法如下:
方法一(手機(jī)本地上已經(jīng)安裝Charles證書(shū),值得說(shuō)明的是有些手機(jī)要把 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>
<!--為了方便測(cè)試,記得發(fā)包的時(shí)候注釋掉-->
<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"
/>//信任用戶自己安裝的證書(shū)
</trust-anchors>
</domain-config>-->
</network-security-config>
方法二(手機(jī)本地上是否安裝有證書(shū)都可):
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>
<!--為了方便測(cè)試,記得發(fā)包的時(shí)候注釋掉-->
<base-config cleartextTrafficPermitted="true" >
<trust-anchors>
<certificates src="@raw/證書(shū)文件名"/>
</trust-anchors>
</base-config>
<!-- <domain-config>
<domain includeSubdomains="true">你要抓取的域名</domain>
<trust-anchors>
<certificates src="user"
overridePins="true"
/>//信任用戶自己安裝的證書(shū)
</trust-anchors>
</domain-config>-->
</network-security-config>
- 在res目錄下新建一個(gè)raw文件夾,將手機(jī)上安裝的證書(shū)文件放入res/raw/目錄下,證書(shū)格式:pem,crt等,步驟2中的證書(shū)文件名,就是你放入res/raw/目錄下文件的名字。
<layer-list> 中的自定義 shape設(shè)定的大小無(wú)效,疊在上層較小的shape被拉伸成最大的shape,設(shè)置gravity 和size無(wú)效,在 api23+ 上沒(méi)有這個(gè)問(wèn)題。此時(shí)可以通過(guò) <inset> 設(shè)置 left,top,right 和 bottom 來(lái)指定偏移位置。如下:
<?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>
此時(shí),沒(méi)有必要在 <shape> 下指定 <size>,否則還是可能出現(xiàn)拉伸的情況。
RecyclerView 的 overScrollsMode 與 scrollbars 顯示沖突。開(kāi)發(fā)某個(gè)需求為 RecyclerView 添加 scrollbars 一直沒(méi)有顯示,發(fā)現(xiàn)在 style 中設(shè)置了 android:overScrollMode 為 never。
<style name="common_linear_rlv">
...
<item name="android:overScrollMode">never</item>
...
</style>
這和 Android 的 setWillNotDraw() 優(yōu)化有關(guān),scrollbars 并不會(huì)改變 WILL_NOT_DRAW 的 flag,通俗地說(shuō)就是不會(huì)調(diào)用 onDraw() 方法。解決方法如下:
- 設(shè)置 RecyclerView 的背景為透明
android:background="@android:color/transparent"
- 設(shè)置 setWillNotDraw(false)
- addItemDecoration()
不要在 sqlite 數(shù)據(jù)庫(kù)中使用 is 開(kāi)頭的字段。
Kotin 協(xié)程使用 Flow 報(bào)錯(cuò)誤,如下:

導(dǎo)包問(wèn)題,加上下面即可:
import kotlinx.coroutines.flow.collect
或者
import kotlinx.coroutines.flow.*