文件保存路徑不要含有特殊符號(hào)孙蒙,建議只包含英文赐俗、數(shù)字和下劃線排吴,否則在某些手機(jī)上會(huì)出現(xiàn)訪問文件錯(cuò)誤。特別是根據(jù)時(shí)間來保存文件時(shí)容易寫出以下代碼:
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)兼容性問題纪铺。
判斷文件存在與否要調(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證書绒极,值得說明的是有些手機(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>
<!--為了方便測試浆洗,記得發(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"
/>//信任用戶自己安裝的證書
</trust-anchors>
</domain-config>-->
</network-security-config>
方法二(手機(jī)本地上是否安裝有證書都可):
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>
<!--為了方便測試,記得發(fā)包的時(shí)候注釋掉-->
<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目錄下新建一個(gè)raw文件夾集峦,將手機(jī)上安裝的證書文件放入res/raw/目錄下,證書格式:pem抠刺,crt等塔淤,步驟2中的證書文件名,就是你放入res/raw/目錄下文件的名字速妖。
<layer-list> 中的自定義 shape設(shè)定的大小無效高蜂,疊在上層較小的shape被拉伸成最大的shape,設(shè)置gravity 和size無效,在 api23+ 上沒有這個(gè)問題罕容。此時(shí)可以通過 <inset> 設(shè)置 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>
此時(shí)露泊,沒有必要在 <shape> 下指定 <size>喉镰,否則還是可能出現(xiàn)拉伸的情況。
RecyclerView 的 overScrollsMode 與 scrollbars 顯示沖突惭笑。開發(fā)某個(gè)需求為 RecyclerView 添加 scrollbars 一直沒有顯示侣姆,發(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捺宗,通俗地說就是不會(huì)調(diào)用 onDraw() 方法。解決方法如下:
- 設(shè)置 RecyclerView 的背景為透明
android:background="@android:color/transparent"
- 設(shè)置 setWillNotDraw(false)
- addItemDecoration()
不要在 sqlite 數(shù)據(jù)庫中使用 is 開頭的字段川蒙。
Kotin 協(xié)程使用 Flow 報(bào)錯(cuò)誤蚜厉,如下:
導(dǎo)包問題,加上下面即可:
import kotlinx.coroutines.flow.collect
或者
import kotlinx.coroutines.flow.*