62925


AndroidのアプリでAndroid Q以前の端末では問題がなかったのですが、Android
Qの端末にて端末内の写真を表示しようとすると下記のエラーが発生してしまう事象で困っております。

[code]

    E/TEST: ERROR
        java.lang.IllegalArgumentException: Invalid column CAST(STRFTIME('%Y%m%d', datetaken / 1000, 'unixepoch', 'localtime') AS INTEGER) AS format_date_taken
            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.support.v4.content.ContentResolverCompat.query(ContentResolverCompat.java:81)
            at jp.app.myapp.upload.multi.cameraroll.HeaderDataCursorLoader.loadInBackground(HeaderDataCursorLoader.java:64)
            at jp.app.myapp.upload.multi.cameraroll.HeaderDataCursorLoader.loadInBackground(HeaderDataCursorLoader.java:21)
            at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:307)
            at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:60)
            at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:48)
            at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:141)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            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)
    
[/code]

再現ソースコードは下記になります。

[code]

    public class HeaderDataCursorLoader extends AsyncTaskLoader<HeaderDataCursor> {
        public HeaderDataCursor loadInBackground() {
            try {
                String columnName = android.provider.MediaStore.Images.ImageColumns.DATE_TAKEN;
                String[] projection = new String[]{
                        BaseColumns._ID,
                        "CAST(STRFTIME('%Y%m%d', " + columnName + " / 1000, 'unixepoch', 'localtime') AS INTEGER) AS format_date_taken",
                        columnName
                };
                Cursor dataCursor = android.support.v4.content.ContentResolverCompat.query(
                        getContext().getContentResolver(),
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        projection, null, null, null, null);
            } catch (Exception e) {
                android.util.Log.e("TEST", "ERROR", e);
            }
        }
    }
    
[/code]

`java.lang.IllegalArgumentException: Invalid column CAST(STRFTIME('%Y%m%d',
datetaken / 1000, 'unixepoch', 'localtime') AS INTEGER) AS
format_date_taken`とあったので、この部分を削除すると表示はされるのですが、なぜそうなってしまうのかの原因がわからずに困っております。  
※ このCASTした値を、後で使いたいため。

[こちらのサイト](https://medium.com/@star_zero/android-q%E3%81%AEscoped-
storage%E3%81%AB%E3%82%88%E3%82%8B%E5%A4%89%E6%9B%B4-afe41cde9f35)に記載されているように、Android
Qからストレージにアクセスする方法が変更されているとのことなのですが、AndroidManifestに`requestLegacyExternalStorage="true"`を追加しても同様のエラーが出てしまっているので、根本解決をしたいと思っているのですが、どのように修正をすればよいのかがわからずに困っております。

解決方法をご教授して頂きますと幸いでございます。  
※ 可能であれば、APIレベルはあげずに対応が出来れば助かります。。

何卒、よろしくお願いいたします。

環境

  * Android Studio3.5
  * compileSdkVersion = 28
  * buildToolsVersion = "28.0.3"
  * targetSdkVersion = 28


CC BY-SA 4.0
2019-11-16T14:46:13.400
60590
2020-02-10T08:22:38.560
8755
question
android
Android Qの端末で端末内の写真を表示しようとするとエラーが発生してしまう


Android
Qでは該当箇所にカラム名そのものしかうけつけなくなっているようですね。断言はできませんが、リグレッションの可能性が高いです。APIドキュメントには任意のSQLが記述できるとは書いていないので、仕様通りともとれます。コード側でSQLと同等の整形処理を行うように修正するのがよいかと思われます

<https://developer.android.com/reference/android/support/v4/content/ContentResolverCompat>


CC BY-SA 4.0
2020-02-10T08:22:38.560
62925
2020-02-10T08:22:38.560
37777
60590
answer