Android生成文件失敗:java.lang.IllegalStateException:Failed to build unique file: /storage/emulated/0/...

1.問題說明

Android Q上,生成同一個名稱的文件(類型+年月日),一開始好好的,突然有一天就報錯了:

java.lang.IllegalStateException:Failed to build unique file: /storage/emulated/0/...

2.問題追蹤

因爲同一名稱的文件會被系統在默認添加(1...)等數字用以標識,例如我有一個aa.txt文件,當我要再次生成aa.txt時,系統會幫我生成aa (1).txt文件,再生成則是aa (2).txt。

單從代碼和日誌去看是看不出問題出在哪裏,只知道是程序已經執行到了context.contentResolver.insert。然後就拋異常了,異常是MediaProvider.ensureFileColumns拋出的,關鍵字是「Failed to build unique file」。

3.源碼分析

我們前往MediaProvider的ensureFileColumns方法中的確看到了異常關鍵字:

也就是說這個異常是try裏調用的兩個方法造成的。再繼續查看兩個方法的源碼,我們可以發現是FileUtils.buildUniqueFile調用FileUtils.buildUniqueFileWithExtension,對,就是這裏,我們看到了罪魁禍首:

當括號中的名稱數量大於32(含32,也就是說同一文件名的數量超過33個時)後就拋異常。

4.實踐

我們去生成文件的路勁看看,可以發現真的是已經生成了32個相同名稱的文件,當把它們刪除後,程序又正常了。所以這裏建議命名時加上分秒(以實際情況來定,只要不會出現同一文件名個數不超過32就好)。