2010-04-28 17 views
81

Tôi cần đẩy mục đích vào ứng dụng máy ảnh mặc định để chụp ảnh, lưu và trả lại URI. Có cách nào để làm điều này không?Mục đích máy ảnh Android

+0

Tham khảo liên kết dưới đây http://stackoverflow.com/questions/13977245/android-open-camera-from-button/40041381#40041381 –

Trả lời

161
private static final int TAKE_PICTURE = 1;  
private Uri imageUri; 

public void takePhoto(View view) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, 
      Uri.fromFile(photo)); 
    imageUri = Uri.fromFile(photo); 
    startActivityForResult(intent, TAKE_PICTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
    case TAKE_PICTURE: 
     if (resultCode == Activity.RESULT_OK) { 
      Uri selectedImage = imageUri; 
      getContentResolver().notifyChange(selectedImage, null); 
      ImageView imageView = (ImageView) findViewById(R.id.ImageView); 
      ContentResolver cr = getContentResolver(); 
      Bitmap bitmap; 
      try { 
       bitmap = android.provider.MediaStore.Images.Media 
       .getBitmap(cr, selectedImage); 

       imageView.setImageBitmap(bitmap); 
       Toast.makeText(this, selectedImage.toString(), 
         Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) 
         .show(); 
       Log.e("Camera", e.toString()); 
      } 
     } 
    } 
} 
+0

Có tồn tại khả năng mở camera trước của thiết bị từ mục đích không ?? – Dimon

+4

Điều này hoạt động tốt, mặc dù bạn có thể cần: riêng tĩnh int TAKE_PICTURE = 1; –

+0

@Aleksander O. - mã tuyệt vời, cảm ơn bạn!tôi đã đăng một bản thực hiện đầy đủ chức năng này tại http://stackoverflow.com/a/13446838/1166727 –

18

Hãy thử như sau tôi thấy here

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

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK && requestCode == 0) { 
    String result = data.toURI(); 
    // ... 
    } 
} 
+1

Cảm ơn, nhưng chụp hình không được tiết kiệm tới một thiết bị để tôi nhận được FileNotFoundException trong Uri uri = Uri.parse (data.toURI()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri); –

+0

Bạn đang nói hình ảnh bạn chụp không được lưu trữ trên điện thoại/thiết bị theo sự lựa chọn của bạn hoặc điều gì đó đang diễn ra và mặc dù bạn bảo nó lưu trữ hình ảnh trên điện thoại/thiết bị của bạn nó hoạt động như nó không được lưu? – Ryan

+0

Tôi đang nói rằng hình ảnh đó không được lưu trữ trên thiết bị tự động nhưng trả về dưới dạng bitmap trong onActivityResult(). Tuy nhiên tôi đã tìm thấy một giải pháp mà tôi sẽ đề cập đến trong một câu trả lời. –

0

thử mã này

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE"); 
        startActivityForResult(photo, CAMERA_PIC_REQUEST); 
+4

Bài đăng này đang được tự động gắn cờ là chất lượng thấp vì nó chỉ là mã. Bạn có muốn mở rộng nó bằng cách thêm một số văn bản để giải thích cách giải quyết vấn đề? – gung

6

Tôi mất vài giờ để làm việc này. Mã này gần như là một bản sao-dán từ developer.android.com, với một sự khác biệt nhỏ.

Yêu cầu sự cho phép này trên AndroidManifest.xml:

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

On Activity của bạn, hãy bắt đầu bằng cách định nghĩa này:

static final int REQUEST_IMAGE_CAPTURE = 1; 
private Bitmap mImageBitmap; 
private String mCurrentPhotoPath; 
private ImageView mImageView; 

Sau đó bắn này Intent trong một onClick:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (cameraIntent.resolveActivity(getPackageManager()) != null) { 
    // Create the File where the photo should go 
    File photoFile = null; 
    try { 
     photoFile = createImageFile(); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.i(TAG, "IOException"); 
    } 
    // Continue only if the File was successfully created 
    if (photoFile != null) { 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
     startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); 
    } 
} 

Add sau đây ủng hộ tôi Thod:

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, // prefix 
      ".jpg",   // suffix 
      storageDir  // directory 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

Sau đó, nhận được kết quả:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     try { 
      mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)); 
      mImageView.setImageBitmap(mImageBitmap); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

gì đã làm cho nó làm việc là MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), đó là khác biệt so với các mã từ developer.android.com. Mã ban đầu đã cho tôi một số FileNotFoundException.

+0

Tương tự cho tôi. Bạn đã tiết kiệm cho tôi một vài giờ tôi giả sử. Bất kỳ ý tưởng tại sao mã Android Dev là đưa ra một ngoại lệ IO? – Coo

0

Hãy thử như sau tôi thấy đây là a link

Nếu mục tiêu ứng dụng của bạn M trở lên và tuyên bố như sử dụng phép CAMERA mà không được chấp thuận, sau đó cố gắng sử dụng hành động này sẽ dẫn đến một SecurityException.

EasyImage.openCamera(Activity activity, int type);

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() { 
     @Override 
     public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) { 
      //Some error handling 
     } 

     @Override 
     public void onImagesPicked(List<File> imagesFiles, EasyImage.ImageSource source, int type) { 
      //Handle the images 
      onPhotosReturned(imagesFiles); 
     } 
    }); 
}