IllegalArgumentException:Unknown URL content 錯誤的原因

Gnadgnaiqgnix發表於2020-12-03

在通過《android第一行程式碼》這本書學習時,在第七章自定義內容提供器時碰見了這樣一個問題

java.lang.IllegalArgumentException: Unknown URL content://com.example.databasetest.provider

找了很久不清楚是什麼原因,後來偶然的換了個Android版本為7.0的模擬器,程式莫名其妙好了,
想到或許是許可權的問題,然後去百度,找了下官方文件,最後問題算是解決了一般。(難受)記錄下解決的幾個辦法。

1.檢查URI 是否自己寫錯了

 android:authorities="com.example.databasetest.provider"

兩個專案中的這個名稱要一致

2.provider中的兩個標籤設定為true
<provider
            android:name=".DatabaseProvider"
            android:authorities="com.example.databasetest.provider"
            android:exported="true"
            android:enabled="true"
            android:grantUriPermissions="true">
        </provider>

android:exported=“false” 表示不允許外部應用訪問,需要設定為true
上述兩個基本不是啥問題,

3.application標籤中新增一項

 android:requestLegacyExternalStorage="true"

這行程式碼解決了我的問題,原因的話,在android版本10中引入了分割槽儲存這個概念,也叫沙盒儲存機制。

那麼什麼是沙盒儲存機制呢?

沙盒機制是一種安全機制,用於防止應用讀取其他應用的資料。

  • 每個應用程式都有自己的儲存空間。
  • 應用程式不能翻過自己的目錄,去訪問公共目錄。
  • 應用程式請求的資料都要通過許可權檢測,不符合要求不會被放行。

而上面哪行程式碼就是設定使用原有儲存機制的。


部分內容來自於https://blog.csdn.net/honjane/article/details/94288585


4.建立低版本的模擬器(<= 9,api<= 28)

這個原理和3的原理一致

好,重點來了這個方法只對Android10及以下有用,Android11是沒用的(吐血),目前還未找到解決方法,希望有大佬能解決。。。

內容如有錯誤,請指正,不甚感激。

相關文章