多媒体应用练习---照相机开发

来源:互联网 发布:linux file命令 编辑:程序博客网 时间:2024/05/21 12:41

 输入代码:


activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <SurfaceView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/surfaceView"/>    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="match_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:text="拍照"            android:onClick="takepicture"            android:id="@+id/takepicture" />      <!--对齐父元素的右边-->   <!--对齐父元素的下边-->    <!--距离右边5dp-->        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginRight="20dp"            android:layout_toLeftOf="@+id/takepicture"            android:layout_alignTop="@+id/takepicture"            android:text="对焦"            android:onClick="takepicture"            android:id="@+id/autofouse" /> <!--顶部对齐-->  <!--指定按钮的左边--> <!--距离右边按钮20dp-->    </RelativeLayout></FrameLayout>

需要通过修改AndroidManifest.xml来修改Camera权限

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.haige.takepicture">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".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>    </application>    <!--添加的权限修改代码-->    <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"/></manifest>

MainActivity.java

package com.example.haige.takepicture;import android.app.Activity;import android.hardware.Camera;import android.os.Bundle;import android.os.Environment;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import java.io.File;import java.io.FileOutputStream;public class MainActivity extends Activity {    private View layout;    private Camera camera;    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)findViewById(R.id.surfaceView);        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//把摄像头画面输送到surfaceView控件上        surfaceView.getHolder().setFixedSize(176, 144);//设置屏幕的分辨率        surfaceView.getHolder().setKeepScreenOn(true);//保持屏幕的常亮        surfaceView.getHolder().addCallback(new SurfaceCallback());//设置屏幕的监听对象    }    /*    处理用户触摸事件     */    public boolean onTouchEvent(MotionEvent event) {        if(event.getAction() == MotionEvent.ACTION_DOWN)//如果是手指触摸的事件        {            layout.setVisibility(ViewGroup.VISIBLE);//显示出界面            return true;        }        return super.onTouchEvent(event);    }    /*    用户点击按钮的事件     */    public void takepicture(View v)    {        if(camera!=null)        {            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 Camera.PictureCallback    {        public void onPictureTaken(byte[] data, Camera camera)//jpg文件数据        {            try            {                File jpgFile = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");//建立文件对象                FileOutputStream outStream =new FileOutputStream(jpgFile);//建立文件输出流对象                outStream.write(data);//写入文件数据                outStream.close();//写完数据关闭                camera.startPreview();//预览照相机            }           catch (Exception e)           {               e.printStackTrace();           }        }    }    private final class SurfaceCallback implements SurfaceHolder.Callback    {        public void surfaceCreated(SurfaceHolder holder)        {            try            {                Camera.open();//打开摄像头                Camera.Parameters parameters = camera.getParameters();//得到摄像头的参数对象                parameters.setPreviewSize(800, 480);//设置一张照片的大小                parameters.setPreviewFrameRate(5);//每秒钟从摄像头捕获几个画面                parameters.setPictureSize(1024, 768);//设置拍出照片的大小                parameters.setJpegQuality(80);//设置拍出照片的质量                camera.setParameters(parameters);//将已经设置好的参数赋值给摄像头                camera.setPreviewDisplay(holder);//将camera输送给surfaceView                camera.startPreview();//开始预览摄像头            }            catch (Exception e)            {                e.printStackTrace();            }        }        public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)        {        }        public void surfaceDestroyed(SurfaceHolder holder)        {           if(camera!=null)//避免摄像头同时被多个应用使用           {               camera.release();               camera=null;           }        }    }}



 


0 0