Cloning the updated Picasso
code and building the jar myself fixed the problem. I've heard they're planning a new official release soon.
SQLiteException trying to load a contact photo with Picasso
-
24-06-2022 - |
質問
I'm getting the following error on some devices when trying to load some contact photos in a CursorAdapter
:
java.lang.RuntimeException: An unexpected exception occurred
at com.squareup.picasso.Request$1.void run()(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: near "AND": syntax error: , while compiling: SELECT DISTINCT data15 FROM view_data_restricted data WHERE ( AND _id=photo_id1 AND _id=photo_id AND contact_id=?)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:179)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:358)
at android.content.ContentResolver.query(ContentResolver.java:321)
at android.provider.ContactsContract$Contacts.openContactPhotoInputStream(ContactsContract.java:1968)
at com.squareup.picasso.Utils$ContactPhotoStreamIcs.java.io.InputStream get(android.content.ContentResolver,android.net.Uri)(Unknown Source)
at com.squareup.picasso.Utils.boolean parseResponseSourceHeader(java.lang.String)(Unknown Source)
java.io.File createDefaultCacheDir(android.content.Context)
java.io.InputStream getContactPhotoStream(android.content.ContentResolver,android.net.Uri)
at com.squareup.picasso.Picasso.android.graphics.Bitmap loadFromType(com.squareup.picasso.Request)(Unknown Source)
at com.squareup.picasso.Picasso.android.graphics.Bitmap resolveRequest(com.squareup.picasso.Request)(Unknown Source)
at com.squareup.picasso.Picasso.void run(com.squareup.picasso.Request)(Unknown Source)
at com.squareup.picasso.Request.void run()(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
at com.squareup.picasso.Utils$PicassoThread.void run()(Unknown Source)
The SQL query being used to get the photo stream is invalid.
Here's how I'm loading the image:
Query the ContactsContract
:
public static final String[] PROJECTION = { Contacts._ID, Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME_PRIMARY,
Contacts.PHOTO_THUMBNAIL_URI, ContactsContract.CommonDataKinds.Email.DATA };
public static final String SELECTION = ContactsContract.CommonDataKinds.Email.DATA + " <> '' AND "
+ Contacts.IN_VISIBLE_GROUP + "=1";
public static final String ORDER_BY = Contacts.SORT_KEY_PRIMARY;
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
return new CursorLoader(this, ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, SELECTION, null,
ORDER_BY);
}
Pass the resulting Cursor
to an adapter. Get a contact photo URI like so:
Uri photoUri = Contacts.getLookupUri(cursor.getLong(cursor.getColumnIndex(Contacts._ID)),
cursor.getString(cursor.getColumnIndex(Contacts.LOOKUP_KEY)));
Load that photo using Picasso
:
Picasso.with(context).load(photoUri).placeholder(R.drawable.ic_contact_picture).into(photo);
As I said, the exception only occurs on some devices. Wrapping the Picasso
call in a try/catch
unfortunately does nothing, because the image is being loaded asynchronously.
I could create an AsyncTask
and load the image synchronously, but then what's the point of using Picasso
?
解決
所属していません StackOverflow