Android拍照

1.配置权限

<uses-feature android:name="android.hardware.camera" /><!-- 照相机硬件设备特性 -->
<uses-permission android:name="android.permission.CAMERA" /><!-- 照相机权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 写到外存储设备权限(写到SD卡) -->

2.在布局文件中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.image.MainActivity"
    tools:ignore="MergeRootFrame" 
    android:orientation="vertical">

    <!-- 创建出来的预览类添加到FrameLayout里,这里是因为秘密拍摄,将宽高设置成1dp -->
    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="1dp"
        android:layout_height="1dp"/>
    <Button 
        android:onClick="takePicture"
        android:text="拍照"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content"/>
</LinearLayout>

3.创建照相机画面预览类

/**
 * 照相机画面预览类
 * @author Administrator
 *
 */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "CameraPreview";
	private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    //预览界面创建的时候执行
    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }
    //预览界面销毁的时候执行
    public void surfaceDestroyed(SurfaceHolder holder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }
    //预览界面旋转改变方向的时候执行
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
}
4.MainActivity

import java.io.File;
import java.io.FileOutputStream;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;

public class MainActivity extends Activity {
	private Camera mCamera;
	private CameraPreview mPreview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//1.获取照相机实例
		mCamera = getCameraInstance();

		//2.获取照相机预览类
		mPreview = new CameraPreview(this, mCamera);
		FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
		preview.addView(mPreview);//3.将照相机的预览界面加入到指定的FrameLayout里
	}

	//当点击按钮的时候进行拍照
	public void takePicture(View view){
		mCamera.autoFocus(null);//自动对焦,参数是个自动对焦完毕后的回调函数(一般是在这个回调函数里拍照)
		/**
		 * 1.参数一:按下快门的时候的回调函数(一般是调用快门声音)
		 * 2.参数二:当相机获取原始照片时触发该监听器
		 * 3.参数三:当相机获取JPG照片时触发该监听器
		 */
		mCamera.takePicture(null, null, mPicture);
	}
	
	/**
	 * 获取一个照相机实例
	 * @return
	 */
	public static Camera getCameraInstance() {
		Camera c = null;
		try {
			c = Camera.open(0); // 获取后置摄像头 open(1)前置 open(0)和open()都是后置
		} catch (Exception e) {
			// Camera is not available (in use or does not exist)
		}
		return c; // returns null if camera is unavailable
	}
	
	
	private PictureCallback mPicture = new PictureCallback() {

	    private String TAG = "MainActivity";

		@Override
	    public void onPictureTaken(byte[] data, Camera camera) {

	        File pictureFile = new File(Environment.getExternalStorageDirectory(),"123.jpg");
	        try {
	            FileOutputStream fos = new FileOutputStream(pictureFile);
	            fos.write(data);
	            fos.close();
	        } catch (Exception e) {
	            Log.d(TAG, "Error accessing file: " + e.getMessage());
	        }
	    }
	};
	
	protected void onDestroy() {
		super.onDestroy();
		if(mCamera!=null){
			mCamera.stopPreview();//停止预览
			mCamera.release();//释放资源
			mCamera = null;
		}
	};
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android拍照可以通过调用相机API来实现。以下是一个简单的示例代码,演示了如何在Android应用中实现拍照功能: ```java // 在Activity中定义一个常量,用于标识拍照请求 private static final int REQUEST_IMAGE_CAPTURE = 1; // 创建一个用于保存拍照后的图片的文件 private File photoFile; // 启动相机应用 private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 确保有相机应用可以处理拍照请求 if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // 创建一个用于保存拍照后的图片的文件 try { photoFile = createImageFile(); } catch (IOException ex) { // 处理文件创建异常 } // 如果文件创建成功,则将文件的URI传递给相机应用 if (photoFile != null) { Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } // 创建一个用于保存拍照后的图片的文件 private File createImageFile() throws IOException { // 创建一个唯一的文件名 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* 前缀 */ ".jpg", /* 后缀 */ storageDir /* 存储目录 */ ); return image; } // 处理拍照后的结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 拍照成功,可以在这里处理拍照后的图片 // 例如,将图片显示在ImageView中 ImageView imageView = findViewById(R.id.imageView); imageView.setImageURI(Uri.fromFile(photoFile)); } } ``` 请注意,上述代码中的`com.example.android.fileprovider`是一个示例文件提供器的授权名称,你需要根据你的应用包名和文件提供器的配置进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值