【问题标题】:Get last image captured using camera on Android获取在 Android 上使用相机拍摄的最后一张图像
【发布时间】:2014-05-04 16:04:37
【问题描述】:

我正在尝试使用以下代码获取用户使用相机应用捕获的最后一张图像,并将其显示给我的相机应用中的用户(就像其他相机应用一样,在一个角落):

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 文件夹或保存照片的任何文件夹中捕获的最后一张图像,而不是我下载的照片或屏幕截图。谁能帮帮我?

【问题讨论】:

    标签: android image camera android-gallery


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        相关资源
        最近更新 更多