2011-10-03 108 views
16

我想用相机意图制作一张照片并将其保存到默认的DCIM文件夹中。然后我想获取图片存储的路径/文件名。从相机获取路径和文件名意图结果

我用下面的代码尝试它:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, TAKE_PICTURE); 

有了这个代码,相机打开,我已经拍摄第一张照片后关闭,图像保存到默认图像文件夹(通常是/ DCIM /相机或SD卡/ DCIM /相机...)

但我怎样才能得到拍摄的图片的路径和文件名? 我曾尝试在onActivityResult 几乎所有的东西我试图

String result = data.getData(); 

String result = data.getDataString(); 

String result = data.toURI(); 

Uri uri = data.getData(); 

Ë tc。

我研究了最近两天找到一个解决方案,有很多关于web和stackoverflow的文章,但没有任何工作。 我不想缩略图,我只想要路径(uri?)到相机拍摄的图像。

感谢您的帮助

编辑: 当我尝试:

path=Environment.DIRECTORY_DCIM + "/test.jpg"; 
File file = new File(path); 
Uri outputFileUri = Uri.fromFile(file); 
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
startActivityForResult(intent, TAKE_PICTURE); 

它不将图像存储为test.jpg放在而是与正常图像名称2011-10-03 .. ... jpg(但也可以,我只需要图片的路径,名称无关紧要)。

问候

再次编辑

path=Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/"; 
File file = new File(path,"test111111111.jpg"); 
try { 
file.createNewFile(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
Uri outputFileUri = Uri.fromFile(file); 
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, TAKE_PICTURE); 

当我尝试这一点,它的图像存储到正确的文件夹,并用给定的名称(例如test111111.jpg)。 但是,我现在如何获得onActivityResult中的文件路径?

+6

你媒体链接知道路径...因为你创建你的文件。您可以将文件或路径作为您的活动的成员变量 –

回答

1

当您启动ACTION_IMAGE_CAPTURE时,您可以将额外的MediaStore.EXTRA_OUTPUT作为要保存图片的文件的URI

下面是一个简单的例子:

File file = new File(path); 
    Uri outputFileUri = Uri.fromFile(file); 

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

    startActivityForResult(intent, TAKE_PICTURE); 

编辑:我只是想我的设备和file.createNewFile()上解决了这个问题对我来说。

+0

嗨,感谢您的快速回复,但它不能按预期工作。我会在上面解释。 – bihcoder

+0

我已经用上面的代码回复了。 – bihcoder

+0

一个愚蠢的问题也许......你有没有在Manifest中添加权限? android.permission.CAMERA?是的..它可以无需许可工作 –

6

图片将被存储两次,首先存储在图库文件夹中,然后是您在putExtra(MediaStore.EXTRA_OUTPUT,路径)方法中指定的文件之后。

您可以获得采取这样做的最后一张照片:

/** 
* Gets the last image id from the media store 
* @return 
*/ 
private int getLastImageId(){ 
    final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA }; 
    final String imageOrderBy = MediaStore.Images.Media._ID+" DESC"; 
    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy); 
    if(imageCursor.moveToFirst()){ 
     int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID)); 
     String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
     Log.d(TAG, "getLastImageId::id " + id); 
     Log.d(TAG, "getLastImageId::path " + fullPath); 
     imageCursor.close(); 
     return id; 
    }else{ 
     return 0; 
    } 
} 

该样本是基于岗位:Deleting a gallery image after camera intent photo taken

+1

嘿,这段代码适用于三星标签,但不适用于联想和i-ball标签,有没有其他解决方案????? – Shubham

1

您可以在onActivityResult()使用这样

if(requestCode==CAMERA_CAPTURE) 
    { 

     Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC"); 
     if(cursor != null && cursor.moveToFirst()) 
     { 
      do 
      { 
       String picturePath =cursor.getString(cursor.getColumnIndex(Media.DATA)); 
       Uri selectedImage = Uri.parse(picturePath); 

      } 
      while(cursor.moveToNext()); 
       cursor.close(); 
      File out = new File(picturePath); 
      try 
      { 
       mOriginal = decodeFile(out); 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


      mSelected.setImageBitmap(mOriginal); 
     } 
    }