• 实例教程十三:拍照


    不错的帖子:

    仿UCWEB界面源码!
    http://www.eoeandroid.com/thread-225509-1-1.html

    Android MP3经典案例
    http://www.eoeandroid.com/thread-212478-1-1.html

    根据奇异高清UI界面源码 添加了一些功能
    http://www.eoeandroid.com/thread-212872-1-1.html

    Android 3D立体图片旋转
    http://www.eoeandroid.com/thread-212512-1-1.html

    ------------帖子正文-----------------

    原文链接:http://www.eoeandroid.com/thread-205293-1-1.html

    拍照界面--main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
     
        <!-- 父界面 -->
     
        <SurfaceView
            android:id="@+id/sfvShow"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
     
        <!-- 子界面 -->
     
        <RelativeLayout
            android:id="@+id/btnLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:visibility="gone" >
     
            <Button
                android:id="@+id/btnTakePicture"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginRight="5dp"
                android:onClick="takepicture"
                android:text="@string/takepicture" />
     
            <Button
                android:id="@+id/btnAutoFocus"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignTop="@id/btnTakePicture"
                android:layout_marginRight="20dp"
                android:layout_toLeftOf="@id/btnTakePicture"
                android:onClick="takepicture"
                android:text="@string/autoFocus" />
        </RelativeLayout>
     
    </FrameLayout>

    拍照代码:MainActivity.java

    package cn.itcast.picture;
     
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    import android.app.Activity;
    import android.hardware.Camera;
    import android.hardware.Camera.PictureCallback;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.RelativeLayout;
     
    public class MainActivity extends Activity {
            private RelativeLayout btnLayout;
            private SurfaceView sfvShow;
            private Camera camera;
     
            @Override
            public 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.main);
     
                    initView();
     
     
            }   
     
            private void initView() {
                    btnLayout = (RelativeLayout)this.findViewById(R.id.btnLayout);
                    //得到SurfaceView显示控件 ,只有得到它,才能捕获摄像头画面
                    sfvShow = (SurfaceView)this.findViewById(R.id.sfvShow);
     
                    sfvShow.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
                    sfvShow.getHolder().setFixedSize(176, 144);
                    sfvShow.getHolder().setKeepScreenOn(true); //使摄像头一直保持高亮
                    sfvShow.getHolder().addCallback(new SurfaceCallback());
            }
     
            private final class SurfaceCallback implements Callback{
     
                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                    int height) {
                            // TODO Auto-generated method stub
     
                    }
     
                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
                            try{
                                    //打开摄像头
                                    camera = Camera.open();
                                    Camera.Parameters parameters = camera.getParameters();
                                    parameters.setPreviewSize(640, 480);
                                    parameters.setPreviewFrameRate(5);
                                    parameters.setPictureSize(640, 480);
                                    parameters.setJpegQuality(80);
                                    camera.setParameters(parameters);
                                    camera.setPreviewDisplay(holder);
                                     
     
                                    //Log.i("摄像头参数", parameters.flatten());
                            }catch(Exception e){
                                    e.printStackTrace();
                            }
     
                    }
     
                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {
                            //一定要关闭摄像头,因为摄像头只能被一个使用
                            if(camera != null){
                                    camera.release();
                                    camera = null;
                            }
     
                    }
     
            }
     
            //拍照
            public void takepicture(View v){
                    if(camera != null){
                            switch (v.getId()) {
                            case R.id.btnTakePicture:
                                    camera.takePicture(null, null, new MyPictureCallBack());
                                    break;
                            case R.id.btnAutoFocus:
                                    //不想得到对焦后的事件,传NULL
                                    camera.autoFocus(null);
                                    break;
                            default:
                                    break;
                            }
                    }
            }
     
            //经过压缩处理后的图片数据
            private final class MyPictureCallBack implements PictureCallback{
                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
                            try{
                                    File jpgFile = new File(Environment.getExternalStorageDirectory(),
                                                    System.currentTimeMillis() + ".jpg");
                                    //输出 流
                                    FileOutputStream outStream = new FileOutputStream(jpgFile);
                                    outStream.write(data);
                                    outStream.close();
                                    //代表摄像头处理完照片了
                                    camera.startPreview(); //开始预览
                            }catch (FileNotFoundException e) {
                                    e.printStackTrace();
                            }catch(IOException e){
                                    e.printStackTrace();
                            }
                    }                
            }
     
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN){
                            btnLayout.setVisibility(ViewGroup.VISIBLE);
                            return true; //返回true,销毁该事件,不要再往后传递了
                    }
                    return super.onTouchEvent(event);
            }
    }

    清单文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="cn.itcast.picture"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk android:minSdkVersion="8" />
     
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <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>

    源码下载:takepicture.rar

  • 相关阅读:
    org.springframework.context.event.AbstractApplicationEventMulticaster
    40. Testing Prev Part IV. Spring Boot features
    nginx+redis 实现 jsp页面缓存,提升系统吞吐率
    SpringDataRedis事务 专题
    cat监控平台环境搭建 专题
    Archive for required library: ‘WebContent/WEB-INF/lib/xxx.jar cannot&n
    m2eclipse简单使用,创建Maven项目 ,运行mvn命令
    如何修改maven默认仓库(即repository)的路径
    MyEclipse2014不支持jre1.8吗
    MyEclipse 2015优化技巧
  • 原文地址:https://www.cnblogs.com/vus520/p/2755088.html
Copyright © 2020-2023  润新知