Получить последнее изображение, снятое с помощью камеры на Android
Я пытаюсь получить последнее изображение, захваченное пользователем, с помощью приложения камеры, используя следующий код, и отобразить его пользователю в приложении моей камеры (как и в других приложениях камеры, показать небольшой предварительный просмотр последнего снимка изображения в углу).:
String[] projection = new String[]{
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.MIME_TYPE
};
final Cursor cursor = getContentResolver()
.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null,
null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
if (cursor.moveToFirst()) {
Bitmap bm = BitmapFactory.decodeFile(cursor.getString(1));
imagePreview.setImageBitmap(bm);
}
но код показывает мне последнее изображение в моем телефоне из любой точки мира, например, если я сделаю снимок экрана, то это покажет мне это. Я хочу отобразить последнее изображение, захваченное из папки DCIM или любой другой папки, в которой хранятся фотографии, а не фотографии, которые я загружаю, или снимок экрана. Может кто-нибудь мне помочь?
2 ответа
Он почти наверняка возвращает папку "Камера" всех стандартных телефонов Android, в противном случае попросите пользователя установить папку "Камера". Также вы можете предоставить больше условий для проверки...
String[] projection = new String[]{
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATA,
MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.MIME_TYPE};
Cursor cursor = getActivity().getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
if(cursor != null){
cursor.moveToFirst();
while(cursor.moveToNext()){
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
if(path.toUpperCase().contains("DCIM/CAMERA") ||
path.toUpperCase().contains("DCIM/100ANDRO")||
path.toUpperCase().contains("DCIM/100MEDIA")){
Log.d(TAG,path);
File file = new File(path);
path = file.getParent();
return path;
}
continue;
}
//cursor.close();
return null;
Официального наблюдателя для этого нет. Вы можете захотеть использовать FileWatcher или наблюдателя, когда медиа изображение было снято. Вам понадобится приемник, который прослушивает снимок с камеры и затем запрашивает медиастроение для последнего обновленного изображения.
// in the receivers class in onChange()
Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC LIMIT 1");
Media media = null;
if (cursor.moveToNext()) {
int dataColumn = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
String filePath = cursor.getString(dataColumn);
}
В cyanogenmod есть флаг Intent Filter (который работает до сих пор)
<receiver
android:name="com.app.CameraEventReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.android.camera.NEW_PICTURE"/>
<data android:mimeType="image/*"/>
</intent-filter>
</receiver>