第一篇:本人的第一篇博客
相机是手机内部必不可少的一个软件…那我们如何做出一个简单的相机呢?在Android内部提供了一个内部类android.view.SurfaceHolder这个类,这个类提供了SurfaceView,这个类可以帮助我们实现照相功能…
1.实现拍照
- 实现拍照就必须要有对相机的访问权限
- 拍照所得的照片的存储就需要有对SD卡的访问权限以及对SD卡中文件夹的创建和删除的权限
-
添加到AndroidManifest.xml中
<uses-permission android:name="android.permission.WRITE_EXTENAL_STORAGE"/>
//sdcard的写权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//sdcard的读权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
//允许挂载和反挂载文件系统可移动存储
调用摄像机
//现在的相机一般都有两个摄像头,我们需要定义我们想要打开哪个摄像头,默认的是后置的摄像头...这里打开的也是后置的摄像头...
if(Camera.getNumberOfCameras()==2){
camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
}else{
camera=Camera.open(0);
}
获取相机参数
Parameters param=Camera1.this.camera.getParameters()
//Camera1是我所建的类名,根据实际情况更改
预览
try { Camera1.this.camera.setPreviewDisplay(Camera1.this.surfaceHolder);//设置我们预览时的SurfaceHolder...
} catch (IOException e) {
e.printStackTrace();
}
Camera1.this.camera.startPreview();//开始预览...
拍照
Camera1.this.camera.takePicture(shutter, raw, jpeg);
//Camera.takePicture(shutterCallback,rawCallback,pictureCallback ); 三个回调参数分别代表:按下快门执行的代码;如需要处理raw执行的代码;图片存储执行的代码。
存储
针对Android 6.0以上,除了需要静态权限,还需要动态权限。
ActivityCompat.requestPermissions(Camera1.this, new String[]{android
.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
弹出请求后获得权限立马进入public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)中。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//创建文件夹
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//这里执行获取权限的代码。
}
break;
}
}
}
新建文件夹
String filename = Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + "CameraPhoto" ;
File file = new File(filename);
if (!file.exists())
{
//如果不存在,就创建一个。最后一般来说会在根目录下找到CameraPhoto文件夹
file.mkdirs();
}
将照片转化成字节数据
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
将照片存入file里面
FileOutputStream buf = new FileOutputStream(filename+File.separator+"picture.jpg");
bmp.compress(Bitmap.CompressFormat.JPEG, 100, buf);
最后我们可以在CameraPhoto文件中找到名为picture.jpg的照片。因为这里是固定的照片名,每次拍照存储都把之前的照片替换掉了,所以只能存储一张照片。当然可以在文件名上面加上System.currentTimeMillis()函数,这样每次照片的名字都不一样。
完整代码
- Activity代码
package com.example.myapplication;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by 邓磊 on 2017/7/30.
*/
public class Camera1 extends Activity implements View.OnClickListener {