Android:如何获取照片的磁盘地址(供以后访问)

时间:2014-06-12 12:44:36

标签: android

我正在写我的第一个应用程序。我正在使用KitKat和Experia Z进行测试。 我的应用程序将显示以前由应用程序拍摄的照片。

我一直在不断减少圈子,搜索和尝试,但从未成功。我意识到我可能会问一个重复的问题,但我一直无法找到它 - 因此,我需要的答案。

我的出发点来自入门教程:   http://developer.android.com/training/camera/photobasics.html

我使用以下方法创建Intent:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

我可以使用以下方法获取小图片:

Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) data.getExtras().get("data");
顺便说一下,我刚刚注意到我用这种方式拍摄的所有测试照片都可以在“相册”应用中看到,并且在相机中有传统的文件路径,例如'/storage/sdcard1/DCIM/100ANDRO/DSC_0120.jpg “

有没有办法获取此文件路径(在onActivityResult()方法中)?

当我提供文件系统URI时,使用:

File storageDir = 
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File photoFile = new File(storageDir, "test.jpg");
mCurrentPhotoPath = "file:" + photoFile.getAbsolutePath(); 

'storageDir'的路径显示为:“/ storage / emulated / 0 / Pictures”。这看起来像某种临时或逻辑位置。

我在意图中添加了一个'额外':

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));

但是,当我尝试拍照时,它从未找到(并且它不在标准相机文件系统中,如上所示)

bmOptions.inPurgeable = true;
Bitmap imBitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);    

Bitmap imBitmap为null。这表明找不到'mCurrentPhotoPath'中的位置。

AH!我不知道为什么'mCurrentPhotoPath'是用'file:'作为前缀创建的。我已将其删除,现在我的照片已退回。 (它被视为肖像,但它在整个ImageView中显示,就像在横向拍摄一样 - 毫无疑问可以处理)。

但是,我仍然不知道它在哪里。我使用File Commander搜索了手机和SD卡,但我找不到它。我想将图像存储在与其他照片相同的位置,其他应用程序可以访问这些照片。

是否有另一个步骤,我要求将图像保存为照片,以便在“DSC_nnnn.jpg”序列中获取下一个文件名?或者,作为我选择的日期定义的文件路径/名称,在为照片(内部或SD卡)定义的相同媒体上?

如果对此有任何帮助,我将非常感激。

问候,约翰

[编辑1]

打电话到海滩 - 英国的海滩天气是罕见的!这是我的第一部Android手机 - 所以我处于深度。

在轻松的条件下,我使用File Commander搜索了手机,并且如回复中所述,我在内部存储器上找到了“图片”目录,它包含了我通过'putExtra提供位置时拍摄的jpeg ',它们的位置由Environment.DIRECTORY_PICTURES定义 - 因此它们是可检索的。

我希望发生的是将照片放在相机设置存放的任何地方 - 在我的情况下,这是在SD卡上。当我没有通过'putExtras'提供目标文件位置时会发生这种情况 - 这是完全合理的。我可以使用'data.getExtras()。get(“data”)'来获取缩略图。有没有办法获取实际图像的文件路径?

如果无法做到这一点,我怎样才能获得相机在SD卡上使用的位置,以便将其作为额外提供?所有'Environment.getXxxDir()方法都会返回内部存储。

[/ edit 1]

1 个答案:

答案 0 :(得分:0)

找到刚刚在文件系统上拍摄的照片位置的方法是:

  1. No Extras提供文件路径和位置。图像将放置在相机的设置(内部或SD卡)

  2. 中定义的任何位置
  3. 启动活动以拍摄照片:

    private static final int REQUEST_IMAGE_CAPTURE = 1;
    ...
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    
  4. 处理结果(关键是data.getData()返回照片文件的URI ):

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
           Uri imageUri = data.getData();
           System.out.println("DisplayImageActivity#onActivityResult() - imageUri = "+imageUri);
           String imagePath = getRealPathFromURI(imageUri);
           System.out.println("DisplayImageActivity#onActivityResult() - image file path = 
                       "+imagePath);
           ...
    
  5. 从URI获取实际路径: 此代码来自:Get file path of image on Android,由Siddarth Lele提供(感谢Siddarth)

    public String getRealPathFromURI(Uri uri) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
        cursor.moveToFirst(); 
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
        return cursor.getString(idx); 
    }
    
  6. System.outs中的值为:

    imageUri = content:// media / external / images / media / 4777

    imagePath = /storage/sdcard1/DCIM/100ANDRO/DSC_0143.JPG

    我现在可以使用文件路径获取并显示照片:

    Bitmap imBitmap = BitmapFactory.decodeFile(imagePath, bmOptions);
    imageView.setImageBitmap(imBitmap); 
    

    我现在有了一个新的挑战:照片是在纵向模式下拍摄的,但是生成的图像在横向显示在ImageView的顶部,而不是拍摄。如果我找不到或弄清楚如何旋转它,我将创建另一个SO请求。