2009-03-16 36 views
10

Đối với ứng dụng của tôi, tôi đã sử dụng lớp Camera của riêng mình để chụp ảnh và cơ sở dữ liệu của riêng mình nhưng tôi đã không thể thực sự theo kịp các thay đổi và tôi quyết định sử dụng ứng dụng máy ảnh tích hợp trong Android để thực hiện công việc nhưng tôi dường như không thể lưu tệp. Tôi đang thiếu gì ở đây? Ứng dụng dường như lưu tệp nhưng nó chỉ là 0 byte. Tôi tra cứu mã nguồn của ứng dụng Máy ảnh và tìm kiếm "đầu ra" trong phần Extras để lưu tệp. Mọi sự trợ giúp sẽ rất được trân trọng.Làm cách nào để lưu dữ liệu từ Máy ảnh vào đĩa bằng MediaStore trên Android?

Public class CameraTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button cameraButton = (Button) findViewById(R.id.cameraButton); 
     cameraButton.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){ 
       ContentValues values = new ContentValues(); 
       values.put(Images.Media.TITLE, "title"); 
       values.put(Images.Media.BUCKET_ID, "test"); 
       values.put(Images.Media.DESCRIPTION, "test Image taken"); 
       Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
       Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
       intent.putExtra("output", uri.getPath()); 
       startActivityForResult(intent,0); 
      } 
     }); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode== 0 && resultCode == Activity.RESULT_OK){ 
      ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData()); 
     } 
    } 


} 

Trả lời

14

này đã làm việc với đoạn mã sau, cấp tôi đã được một chút câm với người cuối cùng. Tôi vẫn nghĩ rằng có một cách tốt hơn để hình ảnh gốc vẫn được lưu ở đâu đó. Nó vẫn gửi cho tôi hình ảnh kích thước nhỏ hơn 25%.

public class CameraTest extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button cameraButton = (Button) findViewById(R.id.cameraButton); 
    cameraButton.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 

      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 

      startActivityForResult(intent,0); 
     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) { 
     Bitmap x = (Bitmap) data.getExtras().get("data"); 
     ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x); 
     ContentValues values = new ContentValues(); 
     values.put(Images.Media.TITLE, "title"); 
     values.put(Images.Media.BUCKET_ID, "test"); 
     values.put(Images.Media.DESCRIPTION, "test Image taken"); 
     values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
     Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
     OutputStream outstream; 
     try { 
      outstream = getContentResolver().openOutputStream(uri); 
      x.compress(Bitmap.CompressFormat.JPEG, 70, outstream); 
      outstream.close(); 
     } catch (FileNotFoundException e) { 
      // 
     } catch (IOException e) { 
      // 
     } 
    } 
} 

Ngoài ra, tôi biết rằng bản phát hành cupcake của Android sẽ sớm sửa kích thước hình ảnh nhỏ.

+1

hey cảm ơn u rất rất rất much.it hoạt động thực sự cảm ơn u – Geetanjali

+0

: hey Tôi đã sử dụng mã ur nhưng tôi có một problem.I đã sử dụng tỉ lệ khung hình và lựa chọn cây trồng nhưng tỉ lệ không dùng nó .Why là hành vi bất thường này? hãy giúp tôi – Geetanjali

4

Trong lần thử đầu tiên của bạn, có thể ứng dụng Máy ảnh gặp sự cố khi nó đọc "đầu ra" của bạn, vì nó hy vọng nó là Uri, trong khi bạn cung cấp Chuỗi. Ứng dụng Máy ảnh dường như đã đọc thêm cờ sau khi chụp ảnh. Bạn chỉ nên cung cấp uri và không phải uri.getPath(). Sau đó, vì bạn đã biết URI cho ảnh, nó sẽ không được trả về trong cuộc gọi onResult. Bạn cần nhớ URI trong biến thành viên.

Trong lần thử thứ hai, bạn sẽ nhận được tỷ lệ bitmap thu nhỏ (50%). Nó chủ yếu dành cho các lượt xem. Tôi nghĩ rằng bitmap có kích thước đầy đủ quá lớn đối với ngân sách bộ nhớ của ứng dụng. Đây có thể là lý do cho việc giảm giá.

+0

Làm cho tinh thần. Tôi nhớ có vấn đề về loại tràn bộ đệm với hình ảnh lớn hơn hoặc có nhiều hình ảnh chưa được đánh dấu trên màn hình ... – prasanna

0

Tôi đã gặp vấn đề tương tự với trình mô phỏng, Tôi đã thử trên điện thoại thực tế một cách hoạt động, có thể là do điện thoại ảo không thể thực sự chụp Picures.

+0

u y là trình mô phỏng chính xác sẽ không hoạt động với máy ảnh. –

+0

Bộ giả lập không hoạt động với máy ảnh – Trikaldarshi

4

FYI, tìm thấy tài liệu này: Người gọi có thể vượt qua thêm EXTRA_OUTPUT để kiểm soát nơi hình ảnh này sẽ được viết. Nếu EXTRA_OUTPUT không có, thì một hình ảnh có kích thước nhỏ được trả về như một đối tượng Bitmap trong trường phụ. Điều này rất hữu ích cho các ứng dụng chỉ cần một hình ảnh nhỏ. Nếu EXTRA_OUTPUT xuất hiện, thì hình ảnh có kích thước đầy đủ sẽ được ghi vào giá trị URI của EXTRA_OUTPUT.

nằm ở đây: http://developer.android.com/reference/android/provider/MediaStore.html

để ứng dụng có thể lưu hình ảnh kích thước đầy đủ cho bạn, nếu bạn nói nó ở đâu.

** Chỉnh sửa: Đây không phải là trường hợp với thiết bị HTC. HTC (không phải nexus) sử dụng cảm giác HTC có phân nhánh từ Android 1.5 và mang theo một lỗi luôn lưu hình ảnh ở mức thấp. bạn có thể ăn trưa hoạt động cho máy ảnh và sử dụng chức năng chia sẻ từ máy ảnh để sử dụng hình ảnh có kích thước đầy đủ.

6

Đoạn mã dưới đây sẽ khởi động máy ảnh mặc định và để máy ảnh lưu hình ảnh vào uri được chỉ định. Điều quan trọng là đặt thêm "MediaStore.EXTRA_OUTPUT" cùng với uri mong muốn.

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg"); 
Uri imageUri = Uri.fromFile(file); 

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

startActivityForResult(intent, 0); 
+0

có cách nào để tự động lưu tệp khi hình ảnh đã được chụp không? hoặc sẽ tốt hơn nếu người dùng quyết định khi họ bắn máy ảnh và chụp một tấm ảnh. –

Các vấn đề liên quan