?隨著安卓系統(tǒng)的不斷更新宛渐,很多業(yè)務(wù)代碼也要跟著更新,否則經(jīng)常會(huì)有意想不到的錯(cuò)誤發(fā)生眯搭。比如在安卓Q(10)開(kāi)始窥翩,就采用存儲(chǔ)的分區(qū)控制。導(dǎo)致明明已經(jīng)申請(qǐng)了android.permission.WRITE_EXTERNAL_STORAGE權(quán)限鳞仙,卻還是報(bào)錯(cuò)open failed: EACCES (Permission denied)寇蚊。只能通過(guò)手動(dòng)打開(kāi)權(quán)限,還能使用存儲(chǔ)權(quán)限棍好。
? ? 話(huà)不多說(shuō)仗岸,先講解決辦法,再講原理借笙。解決辦法是在manifest的applicaiton標(biāo)簽添加??
? android:requestLegacyExternalStorage="true"? 標(biāo)識(shí)扒怖,問(wèn)題便解決了。如圖:
下面來(lái)分析原因:Android Q文件存儲(chǔ)機(jī)制修改成了沙盒模式提澎,有點(diǎn)模仿蘋(píng)果的意思姚垃。APP只能訪(fǎng)問(wèn)自己目錄下的文件和公共媒體文件。對(duì)于AndroidQ以下盼忌,還是使用老的文件存儲(chǔ)方式积糯。Android Q仍然使用READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE作為存儲(chǔ)相關(guān)運(yùn)行時(shí)權(quán)限,但現(xiàn)在即使獲取了這些權(quán)限谦纱,訪(fǎng)問(wèn)外部存儲(chǔ)也受到了限制看成。
android:requestLegacyExternalStorage="true" 的意思就是使用舊的存儲(chǔ)策略,不使用androidQ的新策略跨嘉。但這個(gè)不是長(zhǎng)久之計(jì)川慌,很快將會(huì)強(qiáng)制都使用新策略。最好的解決策略就是
1.需要長(zhǎng)期保存并且卸載也不能刪除的祠乃,使用公有目錄
公有目錄:Downloads梦重、Documents、Pictures?亮瓷、DCIM琴拧、Movies、Music嘱支、Ringtones等
? ? ? ? 地址:/storage/emulated/0/Downloads(Pictures)等
? ? ? ? 公有目錄下的文件不會(huì)跟隨APP卸載而刪除蚓胸。
2.不需要長(zhǎng)期保存的挣饥,并且涉及安全問(wèn)題的,使用私有目錄
APP私有目錄
地址:/storage/emulated/0/Android/data/包名/files
以上內(nèi)容轉(zhuǎn)載自CSDN?https://blog.csdn.net/MarketAndTechnology/article/details/105955441
2.除了上面這種處理方式以外 沛膳,還可以把targetSdkVersion從29修改到26