1—自定义照相
AndroidManifest.xml添加权限
<permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 授予程序使用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.amera.autofocus" />
拍照逻辑
public class MainActivity extends Activity {
private Camera _camera;
private boolean isPreview=false; //定义非预览状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//判断手机是否拥有SD卡
if(!android.os.Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED )){
Toast.makeText(this, "请安装SD卡", Toast.LENGTH_SHORT).show();
}
SurfaceView sv=(SurfaceView)findViewById(R.id.surfaceView);
final SurfaceHolder sh=sv.getHolder(); //获取SurfaceHolder对象
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //自己不维护缓冲
ImageButton preview=(ImageButton)findViewById(R.id.preview);
ImageButton takePicture=(ImageButton)findViewById(R.id.takephoto);
preview.setOnClickListener(new View.OnClickListener(){ //实现相机预览功能
@Override
public void onClick(View v) {
if(!isPreview){ //如果相机为非预览模式,则打开相机
_camera=Camera.open(); //打开相机(默认为后)
isPreview=true;
}
try{
_camera.setPreviewDisplay(sh); //设置用于显示预览的surfaceVieww
Camera.Parameters parms= _camera.getParameters();
parms.setPictureFormat(PixelFormat.JPEG); //指定图片为JPEG篾片
parms.set("jpeg-quality",80); //设置图片的质量
_camera.setParameters(parms);
_camera.startPreview(); //开始预览
_camera.autoFocus(null) ; //设置自动对焦
}catch (IOException e){
e.printStackTrace();
}
}
});
/**
* 实现相机拍照功能
*/
takePicture.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(_camera!=null){
_camera.takePicture(null,null,jpeg); //进行拍照
}
}
});
}
/**
* 实现将照片保存存系统图库中
*/
final Camera.PictureCallback jpeg=new Camera.PictureCallback(){ //照片回调函数
@Override
public void onPictureTaken(byte[] data, Camera cam) {
//根据拍照所得的数据创建位图
final Bitmap bm=BitmapFactory.decodeByteArray(data,0,data.length);
cam.stopPreview(); //停止预览
isPreview=false; //设置为非预览方式
//获取SD卡根目录
File appDir=new File(Environment.getExternalStorageDirectory(),"/DCIM/Camerra/");
if(!appDir.exists()){ //如果该目录不存在
appDir.mkdir();
}
String fileName=System.currentTimeMillis()+".jpg"; //将当前时间设置为文件名称
File file=new File(appDir,fileName);
try{ //保存拍照的图片
FileOutputStream fos=new FileOutputStream(file); //创建一个文件输出流对象
bm.compress(Bitmap.CompressFormat.JPEG,100,fos); //将图片内容压缩到输出流中
fos.flush(); //将缓冲区数据全部写出到输出流
fos.close(); //关闭文件输出流
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
//将图片插入到系统图库
try{
MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(),
file.getAbsolutePath(),fileName,null);
}catch (FileNotFoundException e){
e.printStackTrace();
}
//通知图库更新
MainActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://"+"")));
Toast.makeText(MainActivity.this, "照片保存到:"+file, Toast.LENGTH_SHORT).show();
resetCamera();
}
};
/**
* 重新预览方法
*/
private void resetCamera(){
if(!isPreview){
_camera.startPreview();
isPreview=true;
}
}
@Override
protected void onPause() { //当暂停activity时,停止预览并释放资源
if(_camera!=null){
_camera.stopPreview();
_camera.release(); //释放资源
}
super.onPause();
}
}