Android 踩坑小記(一)

\color{red}{1.} 文件保存路徑不要含有特殊符號(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) \color{red}{:},很容易出現(xiàn)兼容性問(wèn)題。

\color{red}{2.} 判斷文件存在與否要調(diào)用方法:

file.exists()

如果直接判空,如果文件剛剛刪除,并不會(huì)馬上置空。

if(file == null){
  //todo 
}

\color{red}{3.} Android 7 及以上版本抓包要做相應(yīng)的配置,原因是 Android 官方調(diào)整了相應(yīng)的安全策略。配置可參考網(wǎng)絡(luò)安全配置
比如使用 Charles 抓包,解決方法如下:

方法一(手機(jī)本地上已經(jīng)安裝Charles證書(shū),值得說(shuō)明的是有些手機(jī)要把 pem 后綴改為 crt):
  1. 在AndroidManifest.xml文件中添加如下配置:
 <application
       ...
        android:networkSecurityConfig="@xml/network_security_config"
      ...>
    </application>
  1. 在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>
  1. 在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>

  1. 在res目錄下新建一個(gè)raw文件夾,將手機(jī)上安裝的證書(shū)文件放入res/raw/目錄下,證書(shū)格式:pem,crt等,步驟2中的證書(shū)文件名,就是你放入res/raw/目錄下文件的名字。

\color{red}{4.} <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)拉伸的情況。

\color{red}{5.} 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()

\color{red}{6.} 不要在 sqlite 數(shù)據(jù)庫(kù)中使用 is 開(kāi)頭的字段。

\color{red}{7.} Kotin 協(xié)程使用 Flow 報(bào)錯(cuò)誤,如下:


導(dǎo)包問(wèn)題,加上下面即可:

import kotlinx.coroutines.flow.collect

或者

import kotlinx.coroutines.flow.*
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容