2014-02-17 3 views
2

Я пытаюсь восстановить фотографию сырого контакта. Я могу успешно получить высокое разрешение фото для данного контакта сырого, но когда я хочу, чтобы получить фотографию миниатюрной же сырой контакт я получаю это исключение:Получить Сырье Контактное изображение thumbnail

02-17 05:43:44.695: E/DatabaseUtils(4071): Writing exception to parcel 
02-17 05:43:44.695: E/DatabaseUtils(4071): java.lang.IllegalArgumentException: URI: content://com.android.contacts/raw_contacts/8/photo, calling user: com.pedro.notesquirrel, calling package:com.pedro.notesquirrel 
02-17 05:43:44.695: E/DatabaseUtils(4071): at com.android.providers.contacts.LegacyApiSupport.query(LegacyApiSupport.java:1914) 
02-17 05:43:44.695: E/DatabaseUtils(4071): at com.android.providers.contacts.ContactsProvider2.queryLocal(ContactsProvider2.java:6378) 
02-17 05:43:44.695: E/DatabaseUtils(4071): at com.android.providers.contacts.ContactsProvider2.query(ContactsProvider2.java:4999) 
02-17 05:43:44.695: E/DatabaseUtils(4071): at android.content.ContentProvider$Transport.query(ContentProvider.java:200) 
02-17 05:43:44.695: E/DatabaseUtils(4071): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112) 
02-17 05:43:44.695: E/DatabaseUtils(4071): at android.os.Binder.execTransact(Binder.java:404) 
02-17 05:43:44.695: E/DatabaseUtils(4071): at dalvik.system.NativeStart.run(Native Method) 

Я использую рамки Restlet, но я не» Думаю, что это имеет какое-то отношение к этой проблеме.

Вот мой код:

Здесь mHighResolution является Boolean и когда false он генерирует это исключение. Когда это правда, он отображает фотографию. Так,

mHighResolution == false -> exception 
mHighResolution == true -> works fine 

public InputStream getPhotoInputStream() { 
     Uri uri = Uri.withAppendedPath(ContactsContract.RawContacts.CONTENT_URI, String.valueOf(mRawContactId)); 
     return ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri, mHighResolution); 
} 

@Override 
    public void handle(Request request, Response response) { 

     String type = request.getMethod().getName(); 
     String uid = (String) request.getAttributes().get("uid"); 

     if(type.equalsIgnoreCase("get")) 
     { 
      try { 
       Representation r = processGet(uid); 
       response.setEntity(r); 
      } catch (NotFoundException e) { 
       Log.e(TAG, e.getMessage(), e); 
       response.setStatus(new Status(Status.CLIENT_ERROR_NOT_FOUND, e.getMessage())); 
      } catch (IOException e) { 
       Log.e(TAG, e.getMessage(), e); 
       response.setStatus(new Status(Status.SERVER_ERROR_INTERNAL, e.getMessage()));   
      } 
     } 

private Representation processGet(String uid) throws NotFoundException, IOException 
{ 
    Photo photo = new Photo(mContext, uid); 
    Representation representation = new InputRepresentation(photo.getPhotoInputStream()); 

    return representation; 
} 

ответ

2

Фото миниатюра сохраняется в Data таблице из базы данных Contacts.

Android сохраняет фотографии либо в файле изображения (высокое разрешение) или в базе данных как blob

Для доступа к файлу изображения, который вы можете использовать метод я использую в этом вопросе. Для доступа к миниатюрному изображению в базе данных вы можете использовать этот код:

public InputStream getPhotoThumbnailInputStream(String uid) 
{ 
    final String[] projection = new String[]{Data.DATA15}; 
    final String selection = Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + " =?"; 
    final String[] selectionArgs = new String[]{uid, android.provider.ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE}; 

    final Cursor cursor = contentResolver.query(Data.CONTENT_URI, projection, selection, selectionArgs, null); 

    if(cursor.moveToFirst()) 
    { 
     byte[] photo = cursor.getBlob(0); 
     InputStream is = new ByteArrayInputStream(photo); 
     cursor.close(); 
     return is; 
    } 
    else { 
     Log.e(TAG, "Photo thumbnail not found for the given raw contact id."); 
     cursor.close(); 
     return null; 
    } 
} 
Смежные вопросы