/**@class android.provider.ContactsContract.StreamItemPhotos implements android.provider.BaseColumns implements android.provider.ContactsContract.StreamItemPhotosColumns @extends java.lang.Object <p> Constants for the stream_item_photos table, which contains photos associated with social stream updates. </p> <p> Access to social stream photos requires additional permissions beyond the read/write contact permissions required by the provider. Querying for social stream photos requires android.permission.READ_SOCIAL_STREAM permission, and inserting or updating social stream photos requires android.permission.WRITE_SOCIAL_STREAM permission. </p> <h3>Account check</h3> <p> The content URIs to the insert, update and delete operations are required to have the account information matching that of the owning raw contact as query parameters, namely {@link android.provider.ContactsContract.RawContacts#ACCOUNT_TYPE} and {@link android.provider.ContactsContract.RawContacts#ACCOUNT_NAME}. {@link android.provider.ContactsContract.RawContacts#DATA_SET} isn't required. </p> <h3>Operations</h3> <dl> <dt><b>Insert</b></dt> <dd> <p>Social stream photo entries are associated with a social stream item. Photos can be inserted into a social stream item in a couple of ways: <dl> <dt> Via the {@link android.provider.ContactsContract.StreamItems.StreamItemPhotos#CONTENT_DIRECTORY} sub-path of a stream item: </dt> <dd> <pre> ContentValues values = new ContentValues(); values.put(StreamItemPhotos.SORT_INDEX, 1); values.put(StreamItemPhotos.PHOTO, photoData); Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon(); ContentUris.appendId(builder, streamItemId); builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName); builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType); Uri photoUri = getContentResolver().insert(builder.build(), values); long photoId = ContentUris.parseId(photoUri); </pre> </dd> <dt>Via the {@link android.provider.ContactsContract.StreamItems#CONTENT_PHOTO_URI} URI:</dt> <dd> <pre> ContentValues values = new ContentValues(); values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId); values.put(StreamItemPhotos.SORT_INDEX, 1); values.put(StreamItemPhotos.PHOTO, photoData); Uri.Builder builder = StreamItems.CONTENT_PHOTO_URI.buildUpon(); builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName); builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType); Uri photoUri = getContentResolver().insert(builder.build(), values); long photoId = ContentUris.parseId(photoUri); </pre> </dd> </dl> </p> </dd> <dt><b>Update</b></dt> <dd> <p>Updates can only be made against a specific {@link android.provider.ContactsContract.StreamItemPhotos} entry, identified by both the stream item ID it belongs to and the stream item photo ID. This can be specified in two ways. <dl> <dt>Via the {@link android.provider.ContactsContract.StreamItems.StreamItemPhotos#CONTENT_DIRECTORY} sub-path of a stream item: </dt> <dd> <pre> ContentValues values = new ContentValues(); values.put(StreamItemPhotos.PHOTO, newPhotoData); Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon(); ContentUris.appendId(builder, streamItemId); builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); ContentUris.appendId(builder, streamItemPhotoId); builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName); builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType); getContentResolver().update(builder.build(), values, null, null); </pre> </dd> <dt>Via the {@link android.provider.ContactsContract.StreamItems#CONTENT_PHOTO_URI} URI:</dt> <dd> <pre> ContentValues values = new ContentValues(); values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId); values.put(StreamItemPhotos.PHOTO, newPhotoData); Uri.Builder builder = StreamItems.CONTENT_PHOTO_URI.buildUpon(); builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName); builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType); getContentResolver().update(builder.build(), values); </pre> </dd> </dl> </p> </dd> <dt><b>Delete</b></dt> <dd>Deletes can be made against either a specific photo item in a stream item, or against all or a selected subset of photo items under a stream item. For example: <dl> <dt>Deleting a single photo via the {@link android.provider.ContactsContract.StreamItems.StreamItemPhotos#CONTENT_DIRECTORY} sub-path of a stream item: </dt> <dd> <pre> Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon(); ContentUris.appendId(builder, streamItemId); builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); ContentUris.appendId(builder, streamItemPhotoId); builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName); builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType); getContentResolver().delete(builder.build(), null, null); </pre> </dd> <dt>Deleting all photos under a stream item</dt> <dd> <pre> Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon(); ContentUris.appendId(builder, streamItemId); builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY); builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName); builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType); getContentResolver().delete(builder.build(), null, null); </pre> </dd> </dl> </dd> <dt><b>Query</b></dt> <dl> <dt>Querying for a specific photo in a stream item</dt> <dd> <pre> Cursor c = getContentResolver().query( ContentUris.withAppendedId( Uri.withAppendedPath( ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId) StreamItems.StreamItemPhotos#CONTENT_DIRECTORY), streamItemPhotoId), null, null, null, null); </pre> </dd> <dt>Querying for all photos in a stream item</dt> <dd> <pre> Cursor c = getContentResolver().query( Uri.withAppendedPath( ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId) StreamItems.StreamItemPhotos#CONTENT_DIRECTORY), null, null, null, StreamItemPhotos.SORT_INDEX); </pre> </dl> The record will contain both a {@link android.provider.ContactsContract.StreamItemPhotos#PHOTO_FILE_ID} and a {@link android.provider.ContactsContract.StreamItemPhotos#PHOTO_URI}. The {@link android.provider.ContactsContract.StreamItemPhotos#PHOTO_FILE_ID} can be used in conjunction with the {@link android.provider.ContactsContract.DisplayPhoto} API to retrieve photo content, or you can open the {@link android.provider.ContactsContract.StreamItemPhotos#PHOTO_URI} as an asset file, as follows: <pre> public InputStream openDisplayPhoto(String photoUri) { try { AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(photoUri, "r"); return fd.createInputStream(); } catch (IOException e) { return null; } } <pre> </dd> </dl> @deprecated - Do not use. This will not be supported in the future. In the future, cursors returned from related queries will be empty. @removed */ var StreamItemPhotos = { /** <p> The binary representation of the photo. Any size photo can be inserted; the provider will resize it appropriately for storage and display. </p> <p> This is only intended for use when inserting or updating a stream item photo. To retrieve the photo that was stored, open {@link android.provider.ContactsContract.StreamItemPhotos#PHOTO_URI} as an asset file. </p> <P>Type: BLOB</P> @deprecated - Do not use. This will not be supported in the future. In the future, cursors returned from related queries will be empty. */ PHOTO : "photo", };