2010-11-15 37 views
23

Hi Tôi đang sử dụng ACTION_IMAGE_CAPTURE để chụp hình ảnh sử dụng Intent như sau:Nhận đường dẫn của hình ảnh từ ACTION_IMAGE_CAPTURE Ý định

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
cameraIntent.putExtra(
MediaStore.EXTRA_OUTPUT, (new File(Environment.getExternalStorageDirectory(), 
String.valueOf(System.currentTimeMillis()) + ".jpg")) 
); 
startActivityForResult(cameraIntent, 0); 

tôi cần để lưu trữ hình ảnh trong một sdcard và lấy con đường của hình ảnh đó bằng cách sử dụng phương pháp onActivityResult. Tôi không biết làm thế nào để có được đường dẫn hình ảnh của hình ảnh hiện đang chụp.

Nếu có ai biết hãy trợ giúp.

Cảm ơn

+2

hãy đặt tất cả mã của bạn trong hộp văn bản "mã", nó làm cho mã của bạn dễ dàng hơn nhiều, vì vậy chúng tôi có thể trả lời câu hỏi của bạn – Samuel

Trả lời

49

Đây là cách hoạt động trên 2.2 (khác với các phiên bản trước). Khi bắt đầu ý định

 String fileName = "temp.jpg"; 
     ContentValues values = new ContentValues(); 
     values.put(MediaStore.Images.Media.TITLE, fileName); 
     mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
     startActivityForResult(intent, CAPTURE_PICTURE_INTENT); 

bạn cần nhớ mCapturedImageURI.

Khi bạn chụp ảnh, trong onActivityResult() sử dụng mà URI để có được đường dẫn tập tin:

  String[] projection = { MediaStore.Images.Media.DATA}; 
      Cursor cursor = managedQuery(mCapturedImageURI, projection, null, null, null); 
      int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      cursor.moveToFirst(); 
      String capturedImageFilePath = cursor.getString(column_index_data); 

UPDATE: Trên các thiết bị Android mới bạn sẽ không cần MediaStore.EXTRA_OUTPUT, nhưng bạn chứ không phải suy ra hình ảnh/video URI từ data.getData() nhận được từ onActivityResult (..., dữ liệu Ý định), như mô tả độc đáo dưới

Android ACTION_IMAGE_CAPTURE Intent

Tuy nhiên, vì phần này tùy thuộc vào sự thích nghi của nhà sản xuất, bạn vẫn có thể gặp phải các điện thoại có cách tiếp cận "cũ" có thể hữu ích.

+1

Cảm ơn bạn vì điều này, nhưng không hoạt động trên Samsung Galaxy I hoặc II.Trả về hình thu nhỏ trên HTC Incredible :-( –

+0

Sau khi chụp ảnh hoạt động được tải lại và trong khi khởi động ứng dụng của tôi, nó hiển thị "Đang chờ gỡ lỗi ...." .Tất cả những gì tôi đã bỏ qua. Hãy kiểm tra mã tại đây: http: // stackoverflow. com/questions/10510547/android-display-capture-image-in-img-tag – Ponmalar

+0

Từ onActivityResult() bạn có thể lấy tên thật trên thẻ SD là gì.aspImageFilePath có nó – Zelimir

7

Một cách khác, được thử nghiệm trên Android 2.1, lấy ID hoặc AbsolutePath của thư viện hình ảnh cuối cùng.

Nó có thể được thực hiện như thế:

/** 
* 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; 
    } 
} 

Và để loại bỏ các tập tin:

private void removeImage(int id) { 
     ContentResolver cr = getContentResolver(); 
     cr.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media._ID + "=?", new String[]{ Long.toString(id) }); 
} 

Mã này được dựa trên bài: Deleting a gallery image after camera intent photo taken

+0

cảm ơn câu trả lời giúp đỡ của bạn! – michoprogrammer

2

Câu hỏi này là rất cũ nhưng Tôi đã chiến đấu với cùng một vấn đề trong nửa ngày. Vấn đề là ACTION_IMAGE_CAPTURE ý định của bạn sẽ luôn luôn trả code=-1data=null trừ khi bạn thiết lập các điều khoản sau đây để áp dụng trong AndroidManifest.xml tập tin của bạn:

<uses-permission android:name="android.permission.CAMERA"/> 

Bạn cũng có thể thiết lập sau đây nếu bạn muốn ghi lại âm thanh từ ứng dụng của bạn:

<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
+1

Sau khi thiết lập quyền, nó cung cấp mã = ​​-1 và dữ liệu = null trên nexus 4 –

1

Di

intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 

và thêm

Uri uri = data.getData();in onActivityResult 
Các vấn đề liên quan