android基础--拍照功能
2011-10-18 17:44
274 查看
public class MainActivity extends Activity {
private Camera camera;
private RelativeLayout buttonlayout;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//设置为没有标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置窗口全屏显示
buttonlayout= (RelativeLayout) this.findViewById(R.id.buttonlayout);//找到相对布局(为了让相对布局中的按钮在触摸屏幕后显示)
Button duijiaoButton= (Button) this.findViewById(R.id.duijiao);//找到对焦按钮
Button takepictureButton= (Button) this.findViewById(R.id.takepicture);//找到拍照按钮
setContentView(R.layout.main);
//要先创建SurfaceView找到控件,才能打开摄像头
SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);//得到surfaceView控件
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//把输送给SurfaceView控件的内容直接输出到画面上
surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率
surfaceView.getHolder().addCallback(new SurfaceCallback());//设置回调,当SurfaceView被创建的时候调用SurfaceCallback方法
ButtonClickListener listener = new ButtonClickListener();
takepictureButton.setOnClickListener(listener);
duijiaoButton.setOnClickListener(listener);
}
private final class ButtonClickListener implements View.OnClickListener{
public void onClick(View v) {
if(camera != null){
if(v.getId()==R.id.takepicture){//处理拍照按钮
//camera.takePicture(shutter, raw, jpeg)
//shutter:用户摁下快门时候的回调 ;raw:拍下来的照片未经压缩的一个原始数据的回调;jpeg:压缩后的类型
camera.takePicture(null, null, new MyPictureCallback());//前两个参数不需要得到
/* 摄像头在某一时刻只能处理一项工作,现在在拍照片,拍完照片就不会预览了,现在希望拍完后继续预览
camera.startPreview();重新开始预览
但是拍照和预览是异步的,需要在拍照完全结束后才能预览,
所以放到保存完照片以后再在做预览这个操作
在下面MyPictureCallback中设置
*/
buttonlayout.setVisibility(ViewGroup.GONE);//拍照结束后把按钮再隐藏掉
}else{//处理自动对焦功能
camera.autoFocus(null);//对焦
}
}
}
private final class MyPictureCallback implements PictureCallback{
public void onPictureTaken(byte[] data, Camera camera) {
try {
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(data);
outputStream.close();
camera.startPreview();//在这里设置重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//触摸屏幕时要显示 对焦和拍照两个按钮,这里重写onTouchEvent方法来实现。为了一开始不显示这两个按钮,要在main.xml中设置visibility="gone"来隐藏按钮
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){//触摸事件为摁下
buttonlayout.setVisibility(ViewGroup.VISIBLE);//让按钮显示
}
return super.onTouchEvent(event);
}
//回调函数
private final class SurfaceCallback implements Callback{
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();//打开摄像头,一个摄像头在同一时刻只能被一个应用使用
Parameters parameters = camera.getParameters();//构建一个参数对象
//某些设备只允许设置它清单中的值,不允许随意设置值,比如HTC的手机摄像头规定了照片大小。所以用Log来看下设备允许的参数值
Log.i("MainActivity",parameters.flatten());//往控制台输出可以使用的各项参数和各项参数可以使用的值,根据参数和对应的值进行设置
parameters.setPreviewSize(800, 480);//设置预览图片大小
parameters.setPreviewFrameRate(5);//每秒钟从摄像头捕获画面的个数
parameters.setPictureSize(640, 480);//照片大小
parameters.setPreviewFormat(ImageFormat.JPEG);//设置照片格式为JPG
camera.setParameters(parameters);//把参数对象设给照相机
//设置需要哪个SurfaceView来显示摄像头所捕获的画面
camera.setPreviewDisplay(holder);
camera.startPreview();//把预览的画面显示在屏幕上,开始预览
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null)
camera.release();//当MainActivity 离开前台,要释放掉摄像头
camera = null;
}
}
}
要加三个权限:
<!-- 设置摄像头的访问权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
private Camera camera;
private RelativeLayout buttonlayout;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//设置为没有标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置窗口全屏显示
buttonlayout= (RelativeLayout) this.findViewById(R.id.buttonlayout);//找到相对布局(为了让相对布局中的按钮在触摸屏幕后显示)
Button duijiaoButton= (Button) this.findViewById(R.id.duijiao);//找到对焦按钮
Button takepictureButton= (Button) this.findViewById(R.id.takepicture);//找到拍照按钮
setContentView(R.layout.main);
//要先创建SurfaceView找到控件,才能打开摄像头
SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);//得到surfaceView控件
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//把输送给SurfaceView控件的内容直接输出到画面上
surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率
surfaceView.getHolder().addCallback(new SurfaceCallback());//设置回调,当SurfaceView被创建的时候调用SurfaceCallback方法
ButtonClickListener listener = new ButtonClickListener();
takepictureButton.setOnClickListener(listener);
duijiaoButton.setOnClickListener(listener);
}
private final class ButtonClickListener implements View.OnClickListener{
public void onClick(View v) {
if(camera != null){
if(v.getId()==R.id.takepicture){//处理拍照按钮
//camera.takePicture(shutter, raw, jpeg)
//shutter:用户摁下快门时候的回调 ;raw:拍下来的照片未经压缩的一个原始数据的回调;jpeg:压缩后的类型
camera.takePicture(null, null, new MyPictureCallback());//前两个参数不需要得到
/* 摄像头在某一时刻只能处理一项工作,现在在拍照片,拍完照片就不会预览了,现在希望拍完后继续预览
camera.startPreview();重新开始预览
但是拍照和预览是异步的,需要在拍照完全结束后才能预览,
所以放到保存完照片以后再在做预览这个操作
在下面MyPictureCallback中设置
*/
buttonlayout.setVisibility(ViewGroup.GONE);//拍照结束后把按钮再隐藏掉
}else{//处理自动对焦功能
camera.autoFocus(null);//对焦
}
}
}
private final class MyPictureCallback implements PictureCallback{
public void onPictureTaken(byte[] data, Camera camera) {
try {
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(data);
outputStream.close();
camera.startPreview();//在这里设置重新开始预览
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//触摸屏幕时要显示 对焦和拍照两个按钮,这里重写onTouchEvent方法来实现。为了一开始不显示这两个按钮,要在main.xml中设置visibility="gone"来隐藏按钮
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){//触摸事件为摁下
buttonlayout.setVisibility(ViewGroup.VISIBLE);//让按钮显示
}
return super.onTouchEvent(event);
}
//回调函数
private final class SurfaceCallback implements Callback{
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();//打开摄像头,一个摄像头在同一时刻只能被一个应用使用
Parameters parameters = camera.getParameters();//构建一个参数对象
//某些设备只允许设置它清单中的值,不允许随意设置值,比如HTC的手机摄像头规定了照片大小。所以用Log来看下设备允许的参数值
Log.i("MainActivity",parameters.flatten());//往控制台输出可以使用的各项参数和各项参数可以使用的值,根据参数和对应的值进行设置
parameters.setPreviewSize(800, 480);//设置预览图片大小
parameters.setPreviewFrameRate(5);//每秒钟从摄像头捕获画面的个数
parameters.setPictureSize(640, 480);//照片大小
parameters.setPreviewFormat(ImageFormat.JPEG);//设置照片格式为JPG
camera.setParameters(parameters);//把参数对象设给照相机
//设置需要哪个SurfaceView来显示摄像头所捕获的画面
camera.setPreviewDisplay(holder);
camera.startPreview();//把预览的画面显示在屏幕上,开始预览
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null)
camera.release();//当MainActivity 离开前台,要释放掉摄像头
camera = null;
}
}
}
要加三个权限:
<!-- 设置摄像头的访问权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
相关文章推荐
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- android基础--拍照功能
- android--Camera完整版--Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
- Android实现拍照,以及从相册选择图片裁剪功能同时保存在本地
- Android实现拍照、选择图片并裁剪图片功能
- Cocos2d-x 3.x 头像选择器,本地相册与拍照+头像编辑功能(Android、IOS双平台实现)
- Android开发技巧——Camera拍照功能
- Android开发:仿微信和QQ空间发说说相册读取、拍照、图片裁剪和图片上传服务器等功能的实现
- android仿微信录制短视频,拍照,自动聚焦,手动聚焦,滑动缩放功能(Camera+TextureView+rxjava实现)
- Android中拍照和录像功能
- 玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
- Android调用手机拍照功能的方法
- Android使用系统自带的相机实现一键拍照功能
- 文件件监听器,android系统拍照功能调用后删除系统生成的照片