Mục đích máy ảnh Android


Câu trả lời:


178
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());
            }
        }
    }
}

5
Điều này hoạt động tốt, mặc dù bạn có thể cần: private static int TAKE_PICTURE = 1;
Chris Rae

11
Không làm việc trên GALAXY S PHONES :(
Umar-MOBITSOLUTIONS

1
Tại sao mã cứng là 'android.media.action.IMAGE_CAPTURE'. Nó có thể không hoạt động trên một số điện thoại. Có một tiêu chuẩn cho điều này? Có lẽ điều gì đó xung quanh Intent.ACTION_GET_CONTENT?
AlikElzin-kilaka

7
@kilaka, MediaStore.ACTION_IMAGE_CAPTURE
Rob

2
Bạn có thể cần sử dụng FileProvidertrong Android> M. Xem tại đây
Nicolai Weitkemper

22

Hãy thử cách sau mà tôi tìm thấy ở đây

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();
    // ...
  }
}

2
Cảm ơn nhưng ảnh đã chụp không được lưu vào thiết bị nên tôi nhận được FileNotFoundException trong Uri uri = Uri.parse (data.toURI ()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri);
Alexander Oleynikov

Bạn đang nói rằng hình ảnh bạn chụp không được lưu trữ trên điện thoại / thiết bị theo lựa chọn của bạn hoặc điều gì đó đang xảy ra và mặc dù bạn yêu cầu nó lưu trữ hình ảnh trên điện thoại / thiết bị của bạn, nó vẫn có vẻ như không được lưu?
Ryan

Tôi đang nói rằng ảnh không được lưu trữ tự động trên thiết bị mà 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 trong một câu trả lời.
Alexander Oleynikov

Đây là câu trả lời tốt hơn. Câu trả lời hàng đầu tiết kiệm một bản sao không cần thiết của hình ảnh. Điều này xuất hiện trong ứng dụng thư viện của người dùng dưới dạng hai hình ảnh thay vì một hình ảnh, mà hầu hết mọi người sẽ coi là một lỗi.
Thomas Dignan

7

Tôi đã mất vài giờ để làm việc này. Mã nó 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 quyền này trên AndroidManifest.xml:

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

Trên của bạn Activity, hãy bắt đầu bằng cách xác định điều này:

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

Sau đó, bắn nó Intenttrong 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);
    }
}

Thêm phương thức hỗ trợ sau:

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();
        }
    }
}

Điều gì đã làm cho nó hoạt động là MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), khác với mã từ developer.android.com . Mã ban đầu đã cho tôi một FileNotFoundException.


Tương tự cho tôi. Tôi cho là bạn đã cứu tôi vài giờ. Bất kỳ ý tưởng nào tại sao mã Android Dev lại đưa ra một ngoại lệ IO?
Coo

0

Hãy thử cách sau Tôi tìm thấy Đây là một liên kết

Nếu ứng dụng của bạn nhắm mục tiêu M trở lên và tuyên bố là đang sử dụng quyền CAMERA không được cấp, thì việc cố gắng sử dụng hành động này sẽ dẫn đến 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);
        }
    });
}

Trong thư viện này, không có cách nào để đặt đường dẫn đầu ra cho ảnh và cũng có một số lỗi như tôi nghĩ
Vlad

0

Tôi đã tìm thấy một cách khá đơn giản để làm điều này. Sử dụng một nút để mở nó bằng cách sử dụng trình on clicknghe để bắt đầu chức năng openc(), như sau:

String fileloc;
private void openc()
{
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File f = null;
    try 
    {
        f = File.createTempFile("temppic",".jpg",getApplicationContext().getCacheDir());
        if (takePictureIntent.resolveActivity(getPackageManager()) != null)
        {               
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(profile.this, BuildConfig.APPLICATION_ID+".provider",f));
            fileloc = Uri.fromFile(f)+"";
            Log.d("texts", "openc: "+fileloc);
            startActivityForResult(takePictureIntent, 3);
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 3 && resultCode == RESULT_OK) {
        Log.d("texts", "onActivityResult: "+fileloc);
        // fileloc is the uri of the file so do whatever with it
    }
}

Bạn có thể làm bất cứ điều gì bạn muốn với urichuỗi vị trí. Ví dụ, tôi gửi nó đến một trình cắt ảnh để cắt ảnh.


-3

thử mã này

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

6
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ó phiền mở rộng nó bằng cách thêm một số văn bản để giải thích cách nó giải quyết vấn đề không?
gung - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.