在Android上使用相机拍摄最后一张照片

时间:2014-05-04 16:04:37

标签: android image camera android-gallery

我正在尝试使用以下代码使用相机应用程序捕获用户捕获的最后一个图像,并在我的相机应用程序中将其显示给用户(与其他相机应用程序一样,显示上次图像捕获的小预览)一个角落):

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 个答案:

答案 0 :(得分:0)

它非常肯定会返回所有android标准手机的Camera文件夹,否则要求用户设置Camera文件夹。你也可以提供更多条件来检查...

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;

答案 1 :(得分:0)

没有官方观察员。拍摄媒体图像时,您可能希望使用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>