簡體   English   中英

Android Q (SDK 29) 上的 ContentResolver 無效列錯誤

[英]ContentResolver invalid column error on Android Q (SDK 29)

我們的 Android 應用程序嚴重依賴 ContentResolver 上的查詢來獲取和管理存儲在設備上的照片和視頻。 我們知道 Android Q 關於 DATA 字段和范圍存儲的明顯變化。 但是,我們在查詢的 Pixel 2 上遇到了一些奇怪的問題,這些問題在 SQL 投影中使用了更復雜的表達式。 例如我們做這樣的事情:

final String[] projection = {MediaStore.MediaColumns._ID,
                                     MediaStore.MediaColumns.DATA,
                                     MediaStore.MediaColumns.MIME_TYPE,
                                     getDateColumn(target, sortMode),
                                     MediaStore.MediaColumns.TITLE,
                                     "rtrim(" + MediaStore.MediaColumns.DATA + ", replace(" +
                                     MediaStore.MediaColumns.DATA + ", '/', '')) as " + COLUMN_DIRECTORY,
                                     "substr(" + MediaStore.MediaColumns.DATA + ", " + "length(rtrim(" +
                                     MediaStore.MediaColumns.DATA + ", replace(" + MediaStore.MediaColumns.DATA +
                                     ", '/', '')) )" + ")" + "as " + COLUMN_FILENAME,
                                     MediaStore.MediaColumns.DISPLAY_NAME,
                                     MediaStore.MediaColumns.DATE_ADDED};

到目前為止,它一直工作得很好。 然而,在最新的 Android Q 版本上,對於使用非純列名的投影的每個查詢,我們都會遇到以下異常:

2019-09-26 15:54:56.733 30276-30659/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
    Process: xxxx, PID: 30276
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:399)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.lang.IllegalArgumentException: Invalid column rtrim(_data, replace(_data, '/', '')) as directory
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:423)
        at android.content.ContentResolver.query(ContentResolver.java:944)
        at android.content.ContentResolver.query(ContentResolver.java:880)
        at android.content.ContentResolver.query(ContentResolver.java:836)
        ...

現在禁止這種投影嗎? 還是我們錯過了什么? 提前致謝!

您無法再訪問DATA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM