【问题标题】:How to get Uri of image taken with camera and stored to Gallery如何获取用相机拍摄的图像的 Uri 并存储到图库
【发布时间】:2015-07-01 19:09:09
【问题描述】:

我正在从我的应用程序中启动相机。我正在使用带有额外 android.provider.MediaStore.EXTRA_OUTPUT 的 Android.provider.MediaStore.ACTION_IMAGE_CAPTURE。无论我是否使用 EXTRA_OUTPUT,照片都会添加到图库中。

如何获取 Gallery 中图片的 Uri?我还没有找到一个干净的方法来做到这一点,我不想使用最后添加到图库的图像的 Uri,因为我不能确定它是用户拍摄的照片。

编辑: 让我在这里补充一下,我确实知道如何获取图像。目前我正在使用我的 Uri,我将其与 Intent 一起作为 EXTRA_OUTPUT 传递。那不是问题。问题是使用这种方法我得到两张照片写入 sdcard,我更喜欢只写一张。或者如果写了两个,一个在画廊中,一个在我自己的 Uri 中,我想使用其中一个 Uri:s 并删除另一个。在这两种情况下,我都需要照片的 Uri,它默认保存到 Gallery 中。

【问题讨论】:

    标签: android camera gallery


    【解决方案1】:

    如果你通过调用启动相机

    startActivityForResult(cameraIntent, REQUEST_CODE_CAPTURE_IMAGE_ACTIVITY); // start the camera
    

    在 onActivityResult 中你可以捕获 mediaURI

     @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            if (requestCode == REQUEST_CODE_CAPTURE_IMAGE_ACTIVITY
                    && resultCode == RESULT_OK) {
                    Uri imageUri = null;
                    if (data != null){
                       imageUri = data.getData();
                   }
            }
        }
    

    REQUEST_CODE_CAPTURE_IMAGE_ACTIVITY 是一个静态整数值,用于标识通过意图发出的请求。因此,如果您有多个 startActivityForResults,您可以确定哪一个正在返回。

    请注意,如果您通过 EXTRA_OUTPUT 预先插入一个 URI,您将不会通过 data.getData(); 返回该 URI。您必须将预先插入的 URI 存储在一个变量中,并在您的 onActivityResult 中检索它,同时检查 imageUri 是否为空..

    例如

     Uri imageUri = null;
    if (data != null){
       imageUri = data.getData();
    }
    if (imageUri == null && preinsertedUri != null)
     imageUri = preinsertedUri;
    

    // 用 imageUri 做一些事情

    【讨论】:

    • 好的。我在没有 EXTRA_OUTPUT 的情况下对其进行了测试。当我使用 Sony Xperia 时,我确实得到了保存在 Gallery 中的照片 Uri。但是当我使用三星 Galaxy 时,data.getData() 为空。
    • 好的,这就是我用相机发现的。一些制造商要求您为其相机应用程序预先插入 URI。其他人会在 data.getData() 中返回它;这是我们倾向于在不同制造商的 android 中看到的那些“奇妙”的不一致之一。您应该始终预先插入一个 URI 并使用 EXTRA_OUTPUT..然后在您的 onActivityResult 中检查 data.getData() 是否为空.. 如果它为空,则使用预先插入的 URI 作为您的图像 URI,否则使用数据。 getData() 作为你的 URI。
    • 'preinsertedUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());'将预插入一个 URI。确保“preinsertedUri”是您应用程序中的成员变量。
    • 您可以在将新记录插入媒体存储时使用空的 ContentValues。当相机应用程序实际拍照时,数据库中的值将被填充
    • 虽然旧,但 dymmeh 在 2012 年 4 月 18 日发表的评论正是我需要做的才能从 Kindle Fire HD 加载相机图像,并且对于其他使用空 uri 的设备仍然可以正常工作.
    【解决方案2】:

    onActivityResult() 中从data.getData() 获取Uri 不是解决方案。这适用于三分之一的测试设备,并且在摩托罗拉 Defy 模拟器上也失败了。

    这就是我最终要做的事情:

    1. Android.provider.MediaStore.ACTION_IMAGE_CAPTURE调用摄像头,没有EXTRA_OUTPUT
    2. 获取存储在 Gallery 中的图像的 Uri

    这似乎在测试设备上运行良好,但我仍然对这个解决方案并不完全满意,因为我不能完全确保最后添加的图像始终是用户捕获的图像。

    【讨论】:

      【解决方案3】:

      公共类 SampleImageActivity 扩展 Activity {

      private static final int SELECT_PICTURE = 1;
      
      private String selectedImagePath;
      private ImageView img;
      
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
      
          img = (ImageView)findViewById(R.id.ImageView01);
      
          ((Button) findViewById(R.id.Button01))
                  .setOnClickListener(new OnClickListener() {
                      public void onClick(View arg0) {
                          Intent intent = new Intent();
                          intent.setType("image/*");
                          intent.setAction(Intent.ACTION_GET_CONTENT);
                          startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
                      }
                  });
      }
      
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          if (resultCode == RESULT_OK) {
              if (requestCode == SELECT_PICTURE) {
                  Uri selectedImageUri = data.getData();
                  selectedImagePath = getPath(selectedImageUri);
                  System.out.println("Image Path : " + selectedImagePath);
                  img.setImageURI(selectedImageUri);
              }
          }
      }
      
      public String getPath(Uri uri) {
          String[] projection = { MediaStore.Images.Media.DATA };
          Cursor cursor = managedQuery(uri, projection, null, null, null);
          int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
          cursor.moveToFirst();
          return cursor.getString(column_index);
      }
      

      }

      【讨论】:

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