Android Qの端末で端末内の写真を表示しようとするとエラーが発生してしまう
AndroidのアプリでAndroid Q以前の端末では問題がなかったのですが、Android Qの端末にて端末内の写真を表示しようとすると下記のエラーが発生してしまう事象で困っております。
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)
再現ソースコードは下記になります。
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);
}
}
}
java.lang.IllegalArgumentException: Invalid column CAST(STRFTIME('%Y%m%d', datetaken / 1000, 'unixepoch', 'localtime') AS INTEGER) AS format_date_taken
とあったので、この部分を削除すると表示はされるのですが、なぜそうなってしまうのかの原因がわからずに困っております。
※ このCASTした値を、後で使いたいため。
こちらのサイトに記載されているように、Android Qからストレージにアクセスする方法が変更されているとのことなのですが、AndroidManifestにrequestLegacyExternalStorage="true"
を追加しても同様のエラーが出てしまっているので、根本解決をしたいと思っているのですが、どのように修正をすればよいのかがわからずに困っております。
解決方法をご教授して頂きますと幸いでございます。
※ 可能であれば、APIレベルはあげずに対応が出来れば助かります。。
何卒、よろしくお願いいたします。
環境
- Android Studio3.5
- compileSdkVersion = 28
- buildToolsVersion = "28.0.3"
- targetSdkVersion = 28