Android之照相机的使用

最近在做图形处理的项目,要使用到照相机。主要实现调用图库功能打开图片或者调用照相机照相将图片返回并显示出来。下面是主要代码:

package com.cloay.camera;

import java.io.FileNotFoundException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;
import android.widget.ImageView;
/**
 * 打开照相机或者图库添加图片
 * CameraTestActivity.java
 * @author Cloay
 * 2011-11-30
 */
public class CameraTestActivity extends Activity {
	private ImageButton camera;
	private ImageView image;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        image = (ImageView) findViewById(R.id.image);
        camera = (ImageButton) findViewById(R.id.camera);
        camera.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if(event.getAction() == MotionEvent.ACTION_DOWN){
					v.setBackgroundResource(R.drawable.camera_bg_pressed);
				}
				if(event.getAction() == MotionEvent.ACTION_UP){
					showMenuDialog();
					v.setBackgroundResource(R.drawable.camera_bg_normal);
				}
				return false;
			}
		});
    }
    
    private void showMenuDialog() {
		View menuView = View.inflate(CameraTestActivity.this, R.layout.menu, null);
		final AlertDialog menuDialog = new AlertDialog.Builder(CameraTestActivity.this)
		.setView(menuView)
		.setTitle("选择操作")
//		.setIcon(R.drawable.camera)
		.create();
		menuDialog.show();
		menuView.findViewById(R.id.camera).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				menuDialog.dismiss();
				Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");//使用照相机
				startActivityForResult(intentCamera, Activity.DEFAULT_KEYS_DIALER);
			}
		});
		menuView.findViewById(R.id.picture).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				menuDialog.dismiss();
//				Intent intentPhoto = new Intent(Intent.ACTION_GET_CONTENT, null);  
//				intentPhoto.setType("image/*");    //这个参数是确定要选择的内容为图片
//				intentPhoto.putExtra("crop", "circle");   //这个参数 不太懂,唯一知道的是:设置了参数,就会调用裁剪,如果不设置,就会跳过裁剪的过程。
//					intentPhoto.putExtra("aspectX", 33);  //这个是裁剪时候的 裁剪框的 X 方向的比例。
//					intentPhoto.putExtra("aspectY",43);  //同上Y 方向的比例. (注意: aspectX, aspectY ,两个值都需要为 整数,如果有一个为浮点数,就会导致比例失效。)
				//设置aspectX 与 aspectY 后,裁剪框会按照所指定的比例出现,放大缩小都不会更改。如果不指定,那么 裁剪框就可以随意调整了。
//					intentPhoto.putExtra("outputX", 50);  //返回数据的时候的 X 像素大小。
//					intentPhoto.putExtra("outputY", 100);  //返回的时候 Y 的像素大小。
				//以上两个值,设置之后会按照两个值生成一个Bitmap, 两个值就是这个bitmap的横向和纵向的像素值,如果裁剪的图像和这个像素值不符合,那么空白部分以黑色填充。

//				intentPhoto.putExtra("noFaceDetection", true); // 是否去除面部检测, 如果你需要特定的比例去裁剪图片,那么这个一定要去掉,因为它会破坏掉特定的比例。
//
//				intentPhoto.putExtra("return-data", true);  //是否要返回值。 一般都要。
//				startActivityForResult(intentPhoto, 1);
				
				 Intent intent = new Intent();  
	                /* 开启Pictures画面Type设定为image */  
	                intent.setType("image/*");  
	                /* 使用Intent.ACTION_GET_CONTENT这个Action */  
	                intent.setAction(Intent.ACTION_GET_CONTENT);   
	                /* 取得相片后返回本画面 */  
	                startActivityForResult(intent, 2);
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(requestCode == 2){
			if (resultCode == RESULT_OK) {  
	            Uri uri = data.getData();  
	            ContentResolver cr = this.getContentResolver();  
	            try {  
	                Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));  
	                /* 将Bitmap设定到ImageView */  
	                image.setImageBitmap(bitmap);  
	            } catch (FileNotFoundException e) {  
	            	image.setImageResource(R.drawable.empty);
	            }  
	        }  
		}
		if(requestCode == Activity.DEFAULT_KEYS_DIALER){
			if(data != null){
				Bundle extras = data.getExtras();
				Bitmap bitmap = (Bitmap) extras.get("data");
				image.setImageBitmap(bitmap);
			}
			else{
				image.setImageResource(R.drawable.empty);
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
    
    
}
注释非常详细,代码比较简单就不做过多解释了!
说明:转载请注明出处!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 中使用照相机,你可以通过调用系统相机应用或使用相机 API 来实现。 首先,我会向你展示如何调用系统相机应用来拍照。你可以使用以下代码示例: ```java private static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); // 在此处使用图片 } } ``` 在上述代码中,`dispatchTakePictureIntent()` 方法会创建一个 `ACTION_IMAGE_CAPTURE` 的 `Intent`,然后通过调用 `startActivityForResult()` 方法来启动相机应用。当用户拍摄照片并返回到你的活动时,`onActivityResult()` 方法会被调用,并且你可以从返回的 `Intent` 中获取拍摄的照片。 如果你需要更多的控制权,例如自定义相机界面、处理多个相机设备等,你可以使用相机 API。相机 API 提供了更底层的访问方式,允许你直接控制相机硬件。这里是一个简单的示例: ```java private static final int REQUEST_CAMERA_PERMISSION = 1; private Camera camera; private void openCamera() { if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); } else { camera = Camera.open(); // 打开相机 // 设置相机参数和预览界面等 } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == REQUEST_CAMERA_PERMISSION) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { openCamera(); } else { // 权限被拒绝,处理该情况 } } } @Override protected void onResume() { super.onResume(); if (camera == null) { openCamera(); } } @Override protected void onPause() { super.onPause(); releaseCamera(); } private void releaseCamera() { if (camera != null) { camera.release(); // 释放相机资源 camera = null; } } ``` 上述代码中,`openCamera()` 方法会检查相机权限,如果权限已被授予,则打开相机。如果权限未被授予,则请求相机权限。在 `onRequestPermissionsResult()` 方法中,你可以处理用户的权限选择。在 `onResume()` 和 `onPause()` 方法中,我们打开和释放相机资源。 请注意,上述代码示例是简化的版本,并且可能需要根据你的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值