2011-10-03 58 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); 
     } 
    }