android相机开发之仿米格宝宝日志的相机
功能说明: 因为项目中需要用到多次拍照并保存的功能,模仿了米格宝宝的相机。
效果图:
图在手机上打开是有画面出来,不是截图上的黑屏的。真机测试就可以了。
这个是拍照后的查看图片的。
源码如下:
package com.wjh.camera; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.R.integer; import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.PictureCallback; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.KeyEvent; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; /** * * 相机 * */ public class TakePhotoActivity extends Activity implements Callback, OnClickListener, AutoFocusCallback{ SurfaceView mySurfaceView; //surfaceView声明 SurfaceHolder holder; //surfaceHolder声明 Camera myCamera; //相机声明 String filePath= "/sdcard/" ; //照片保存路径 boolean isClicked = false ; //是否点击标识 ImageView takeCameraBtn,takephoto_text; RelativeLayout re_take_btn,save_btn; //确定 public static boolean saveFlag = false ; // 用于判断是否保存图片的标志 byte [] imgdata = null ; public static int imgsize = 0 ; //创建jpeg图片回调数据对象 PictureCallback jpeg = new PictureCallback() { @Override public void onPictureTaken( byte [] data, Camera camera) { imgdata = data; /* try {// 获得图片 Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); File file = new File(filePath+"id_"+"1"+".jpg"); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);//将图片压缩到流中 bos.flush();//输出 bos.close();//关闭 }catch(Exception e) { e.printStackTrace(); } */ } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //无标题 //设置拍摄方向 this .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.take_photo); takeCameraBtn = (ImageView) this .findViewById(R.id.photo_icon); //拍照 takephoto_text = (ImageView) this .findViewById(R.id.takephoto_text); //照片预览 takeCameraBtn.setOnClickListener( this ); re_take_btn = (RelativeLayout) this .findViewById(R.id.re_take_btn); //取消 save_btn = (RelativeLayout) this .findViewById(R.id.save_btn); //保存 re_take_btn.setOnClickListener( this ); save_btn.setOnClickListener( this ); //获得控件 mySurfaceView = (SurfaceView)findViewById(R.id.surfaceView1); //获得句柄 holder = mySurfaceView.getHolder(); //添加回调 holder.addCallback( this ); //设置类型 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //设置监听 mySurfaceView.setOnClickListener( this ); } @Override public void onAutoFocus( boolean success, Camera camera) { if (success) { //设置参数,并拍照 Camera.Parameters params = myCamera.getParameters(); params.setPictureFormat(PixelFormat.JPEG); params.setPreviewSize( 640 , 480 ); myCamera.setParameters(params); myCamera.takePicture( null , null , jpeg); takeCameraBtn.setVisibility(View.INVISIBLE); takephoto_text.setVisibility(View.VISIBLE); re_take_btn.setVisibility(View.VISIBLE); save_btn.setVisibility(View.VISIBLE); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.photo_icon: //拍照 myCamera.autoFocus( this ); //自动对焦 break ; case R.id.re_take_btn: //取消 saveFlag = false ; myCamera.startPreview(); //开启预览 takeCameraBtn.setVisibility(View.VISIBLE); takephoto_text.setVisibility(View.INVISIBLE); re_take_btn.setVisibility(View.INVISIBLE); save_btn.setVisibility(View.INVISIBLE); break ; case R.id.save_btn: //保存 saveFlag = true ; savephoto(); myCamera.startPreview(); //开启预览 takeCameraBtn.setVisibility(View.VISIBLE); takephoto_text.setVisibility(View.INVISIBLE); re_take_btn.setVisibility(View.INVISIBLE); save_btn.setVisibility(View.INVISIBLE); default : break ; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //设置参数并开始预览 Camera.Parameters params = myCamera.getParameters(); params.setPictureFormat(PixelFormat.JPEG); params.setPreviewSize( 640 , 480 ); myCamera.setParameters(params); myCamera.startPreview(); } @Override public void surfaceCreated(SurfaceHolder holder) { //开启相机 if (myCamera == null ) { myCamera = Camera.open(); try { myCamera.setPreviewDisplay(holder); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { //关闭预览并释放资源 myCamera.stopPreview(); myCamera.release(); myCamera = null ; } public void savephoto(){ if (saveFlag){ if (imgdata!= null ){ ++imgsize; try { // 获得图片 Bitmap bm = BitmapFactory.decodeByteArray(imgdata, 0 , imgdata.length); File file = new File(filePath+ "id_" +imgsize+ ".jpg" ); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(file)); bm.compress(Bitmap.CompressFormat.JPEG, 100 , bos); //将图片压缩到流中 bos.flush(); //输出 bos.close(); //关闭 } catch (Exception e) { e.printStackTrace(); } } } else { imgdata = null ; } } //按返回键时,显示弹出框 @Override public boolean onKeyDown( int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 ) { Intent intent = new Intent(TakePhotoActivity. this ,AsyncLoadedImageActivity. class ); startActivity(intent); finish(); return true ; } return false ; } } |
take_photo.xml
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout android:id="@+id/surface_view_wrapper" android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surfaceView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerInParent="true" />
<ImageView android:id="@+id/focus_rectangle" android:background="@null" android:layout_width="200.0dip" android:layout_height="200.0dip" android:layout_centerInParent="true" />
</RelativeLayout>
<RelativeLayout android:id="@+id/flash_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10.0dip" android:layout_marginBottom="10.0dip" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true">
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/takephoto_tab1" android:layout_centerInParent="true" />
<ImageView android:id="@+id/flash_icon" android:layout_width="21.0dip" android:layout_height="21.0dip" android:src="@drawable/ic_viewfinder_flash_off" android:layout_centerInParent="true" />
</RelativeLayout>
<RelativeLayout android:id="@+id/foot_menu" android:background="@drawable/takephoto_bar_hor" android:layout_width="60.0dip" android:layout_height="fill_parent" android:layout_alignParentRight="true">
<RelativeLayout android:id="@+id/take_btn" android:background="@drawable/takephoto_1_bg_hor" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5.0dip" android:layout_alignBottom="@id/surfaceView1" android:layout_alignParentRight="true" android:layout_centerInParent="true">
<ImageView android:layout_gravity="center" android:id="@+id/photo_icon" android:src="@drawable/takephoto_1_camera" android:layout_centerInParent="true" style="@style/photo_foot_menu_image_button_port" />
</RelativeLayout>
<ImageView android:layout_gravity="center" android:id="@+id/takephoto_text" android:paddingLeft="8.0dip" android:visibility="invisible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/takephoto_2_txt" android:layout_centerInParent="true" />
<RelativeLayout android:id="@+id/re_take_btn" android:visibility="invisible" android:layout_width="wrap_content" android:layout_marginBottom="10.0dip" android:layout_alignParentBottom="true" style="@style/photo_foot_menu_image_button_wrapper">
<ImageView android:src="@drawable/icon_takephoto_cancel" style="@style/photo_foot_menu_image_button_port" />
</RelativeLayout>
<RelativeLayout android:id="@+id/save_btn" android:visibility="invisible" android:layout_marginTop="5.0dip" style="@style/photo_foot_menu_image_button_wrapper">
<ImageView android:id="@+id/save_photo_icon" android:src="@drawable/icon_takephoto_save" style="@style/photo_foot_menu_image_button_port" />
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述