2014-02-19 101 views
1

我知道這是可能使用類似得到聯繫人的照片:獲取RawContact照片

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; 
} 

但現在我需要訪問所有RawContact的照片(有一個的)。但我不能。 從ContactsContract.RawContacts.DisplayPhoto文檔中,照片保存爲文件,縮略圖在Data表中保存爲Blob。我可以通過對數據庫的簡單查詢獲得縮略圖照片並檢索Blob,但現在我需要原始尺寸的照片,並且找不到獲取它的方法。我無法在google上找到有關android文檔的任何信息。

我試過這種方法(改編自保存照片文件)來獲取照片文件,但沒有成功。

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; 

    } 

我得到這個在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 

回答

2

很多四處,詳盡地尋找Android的源代碼後,我發現了一種從原始取得聯繫的形象。

使用Android的本機代碼來獲取它,我做了我自己的解決方案(我的問題是獲取原始聯繫人的圖像URI,我找不到獲取它的方法)。所以從這裏public static boolean savePhotoFromUriToUr我這樣做:

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; 
} 

所以這裏是,如何讓原料接觸的照片。