android第十九步拍照

知识点:清单文件android:screenOrientation="landscape"手机平板横向

         

 <activity
            android:name="com.example.taskpicture.MainActivity"
            android:label="@string/app_name" 
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

requestWindowFeature(Window.FEATURE_NO_TITLE);不显示标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);设置全屏

Camera camera;照相机类

camera=Camera.open();打开摄像头

Camera.Parameters parameters=camera.getParameters();获取相机参数 ps:因为每个手机的相机参数不同最好看一下照相机的参数以免出错//Log.i("11", parameters.flatten());打印到日志中

parameters.setPreviewSize(1280, 720);浏览显示大小(在打印的参数中都可以看到)

parameters.setPreviewFrameRate(7);显示每秒几帧(在打印的参数中都可以看到)

parameters.setPictureSize(1280, 720);取景后的照片大小

parameters.setJpegQuality(80);jpg质量

camera.setParameters(parameters); 加载到Camera类中
camera.setPreviewDisplay(arg0); 设置图像SurfaceView中显示
camera.startPreview();开始浏览

camera.takePicture(null, null, new MyPictureCallback()); 参数为三个回调类,第一个是图像捕捉瞬间的回调类,第二个是原始(未压缩)图像数据的回调类,第三个是原始(压缩)图像数据的回调类

camera.autoFocus(null);对焦,参数为对焦的回调类

设计思路:当点击屏幕(重写onTouchEvent)是出现照相与对焦按钮然后继续拍照

布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <SurfaceView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:id="@+id/surfaceView"/>
    <RelativeLayout 
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:visibility="gone"
         android:id="@+id/buttonlayout">
        <Button 
             android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentRight="true"
              android:layout_alignParentBottom="true"
              android:layout_marginRight="5dp"
              android:onClick="takepicture"
              android:text="@string/takepicture"
              android:id="@+id/takepicture"/>
          <Button 
             android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_toLeftOf="@id/takepicture"
              android:layout_alignTop="@id/takepicture"
              android:layout_marginRight="20dp"
              android:onClick="takepicture"
              android:text="@string/autofouse"
              android:id="@+id/autofouse"/>
    </RelativeLayout>

</FrameLayout>

 

public class MainActivity extends Activity {

    private View layout;
    private Camera camera;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        layout = this.findViewById(R.id.buttonlayout);
        SurfaceView surfaceView=(SurfaceView)this.findViewById(R.id.surfaceView);
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setFixedSize(176, 144);
        surfaceView.getHolder().addCallback(new SurfaceCallback());
    }
    public void takepicture(View v){
        if(camera==null)
            return;
        switch(v.getId()){
        case R.id.takepicture:
            camera.takePicture(null, null, new MyPictureCallback());
            break;
        case R.id.autofouse:
            camera.autoFocus(null);
            break;
        }
    }
    private final class MyPictureCallback implements PictureCallback{

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) { //jpg图片数据
            try
            {
                File jpgfile =new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
                FileOutputStream outputStream = new FileOutputStream(jpgfile);
                outputStream.write(arg0);
                outputStream.close();
                camera.startPreview(); //以免照相后屏幕卡不动所以从新启动一下
            }catch(Exception e){
                
            }
            
        }
        
    }
    private final class SurfaceCallback implements Callback{

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            try
            {
                camera=Camera.open();//打开摄像头
                Camera.Parameters parameters=camera.getParameters();//获取相机参数
                parameters.setPreviewSize(1280, 720);//浏览显示大小
                parameters.setPreviewFrameRate(7);//显示每秒几帧
                parameters.setPictureSize(1280, 720);//照片大小
                parameters.setJpegQuality(80);//jpg质量
                camera.setParameters(parameters);
                camera.setPreviewDisplay(arg0); //设置图像SurfaceView中显示
                camera.startPreview();
            }catch(Exception e){
                
            }
            
            //Log.i("zhaoyilong", parameters.flatten());
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder arg0) {
            if(camera!=null){
                camera.release();
                camera= null;
            }
                
            
        }
        
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            layout.setVisibility(ViewGroup.VISIBLE);
            return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

权限

    <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"/>

 

 

 

posted @ 2014-04-15 15:52  东方小花猪  阅读(224)  评论(0编辑  收藏  举报