I know it is possible to get the contact's photo using something like:
public InputStream getContactPhotoInputStream() throws IOException {
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(mContactId));
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri);
return is;
}
But now I need to access all RawContact's photo (the one that have one). But I can't.
From ContactsContract.RawContacts.DisplayPhoto documentation, the photo is saved as a file and the thumbnail is saved as a Blob
in the Data
table. I can get the thumbnail photo with simple query to the database and retrieve the Blob
but now I need the original size photo and I can't find a way to get it. I can't find any info on android documentation neither on google.
I tried this method (adapted from the save photo file) to get the photo file but to no success.
public InputStream getRawContactPhotoInputStream() throws IOException
{
Uri rawContactPhotoUri = Uri.withAppendedPath(
ContentUris.withAppendedId(RawContacts.CONTENT_URI, Long.parseLong(mRawContactId)),
RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
AssetFileDescriptor fd = contentResolver.openAssetFileDescriptor(rawContactPhotoUri, "rw");
InputStream is = fd.createInputStream();
fd.close();
return is;
}
I get this on LogCat:
02-18 23:44:27.195: D/PhotoRestlet(8984): Representation1 size < 1
02-18 23:44:27.207: W/System.err(8984): 2014-02-18 23:44:27 10.17.1.54 - - 8080 GET /contact/photo/6 - 200 - 0 35 http://10.17.1.72:8080 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 -
02-18 23:44:27.226: W/System.err(8984): Unable to read the entity
02-18 23:44:27.226: W/System.err(8984): java.io.IOException: read failed: EBADF (Bad file number)
02-18 23:44:27.226: W/System.err(8984): at java.nio.FileChannelImpl.readImpl(FileChannelImpl.java:315)
02-18 23:44:27.226: W/System.err(8984): at java.nio.FileChannelImpl.read(FileChannelImpl.java:287)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.io.ReadableChunkingChannel.read(ReadableChunkingChannel.java:137)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.io.Buffer.fill(Buffer.java:395)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.connector.OutboundWay.onFill(OutboundWay.java:388)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.io.Buffer.process(Buffer.java:601)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.connector.Way.processIoBuffer(Way.java:503)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.connector.OutboundWay.processIoBuffer(OutboundWay.java:463)
02-18 23:44:27.226: W/System.err(8984): at org.restlet.engine.connector.Way.onSelected(Way.java:456)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.util.SelectionRegistration.onSelected(SelectionRegistration.java:325)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.engine.connector.Connection.onSelected(Connection.java:617)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.util.SelectionRegistration.onSelected(SelectionRegistration.java:325)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.engine.connector.ConnectionController.onSelected(ConnectionController.java:219)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.engine.connector.ServerConnectionController.onSelected(ServerConnectionController.java:99)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.engine.connector.ConnectionController.selectKeys(ConnectionController.java:308)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.engine.connector.ConnectionController.doRun(ConnectionController.java:171)
02-18 23:44:27.230: W/System.err(8984): at org.restlet.engine.connector.Controller.run(Controller.java:159)
02-18 23:44:27.230: W/System.err(8984): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
02-18 23:44:27.230: W/System.err(8984): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-18 23:44:27.230: W/System.err(8984): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-18 23:44:27.230: W/System.err(8984): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-18 23:44:27.230: W/System.err(8984): at java.lang.Thread.run(Thread.java:841)
02-18 23:44:27.230: W/System.err(8984): Caused by: libcore.io.ErrnoException: read failed: EBADF (Bad file number)
02-18 23:44:27.230: W/System.err(8984): at libcore.io.Posix.readBytes(Native Method)
02-18 23:44:27.230: W/System.err(8984): at libcore.io.Posix.read(Posix.java:123)
02-18 23:44:27.230: W/System.err(8984): at libcore.io.BlockGuardOs.read(BlockGuardOs.java:144)
02-18 23:44:27.230: W/System.err(8984): at java.nio.FileChannelImpl.readImpl(FileChannelImpl.java:303)
02-18 23:44:27.230: W/System.err(8984): ... 21 more
02-18 23:44:27.250: D/PhotoRestlet(8984): Representation1 size < 1
02-18 23:44:27.250: W/System.err(8984): 2014-02-18 23:44:27 10.17.1.54 - - 8080 GET /contact/photo/6 - 1001 - 0 17 http://10.17.1.72:8080 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 -
02-18 23:44:27.269: D/PhotoRestlet(8984): Representation1 size < 1
02-18 23:44:27.273: W/System.err(8984): 2014-02-18 23:44:27 10.17.1.54 - - 8080 GET /contact/photo/6 - 1001 - 0 19 http://10.17.1.72:8080 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 -
02-18 23:44:27.308: D/skia(1925): --- SkImageDecoder::Factory returned null
02-18 23:44:27.308: D/skia(1925): --- SkImageDecoder::Factory returned null
02-18 23:44:27.316: D/skia(1925): --- SkImageDecoder::Factory returned null
After a lot of digging around, looking android's source code exhaustively, I found a way to get the image from a raw contact.
Using Android's native code to get it, I did my own solution (my problem was getting the raw contact's image URI, I couldn't find a way to get it). So from here public static boolean savePhotoFromUriToUr I did this:
public InputStream getBitmapFromUri(String rawContactId) throws FileNotFoundException {
final Uri photoUri = Uri.withAppendedPath(
ContentUris.withAppendedId(RawContacts.CONTENT_URI, Long.valueOf(rawContactId)), RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
final InputStream imageStream = contentResolver.openInputStream(photoUri);
return imageStream;
}
So here it is, how to get the raw contact's photo.