• android中的多媒体应用camera


    MainActivity.java

    代码
    package com.amaker.ch11.app;

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import android.app.Activity;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.KeyEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;

    public class MainActivity extends Activity {
    // 声明拍照界面组件SurfaceView
    private SurfaceView surfaceView;
    // 声明界面控制组件SurfaceHolder
    private SurfaceHolder surfaceHolder;
    // 声明照相机
    private Camera camera;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // 实例化拍照界面组件
    surfaceView = (SurfaceView)findViewById(R.id.preview);
    // 从SurfaceView中获得SurfaceHolder
    surfaceHolder = surfaceView.getHolder();
    // 为SurfaceHolder 添加回调
    surfaceHolder.addCallback(surfaceCallback);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    // 响应按键事件
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_CAMERA||keyCode==KeyEvent.KEYCODE_SEARCH){
    takePic();
    return true;
    }
    return super.onKeyDown(keyCode, event);
    }
    // 拍照方法
    private void takePic(){
    // 停止预览
    camera.stopPreview();
    // 拍照
    camera.takePicture(null,null, pictureCallback);
    }
    // 照片回调
    Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
    new SavePictureTask().execute(data);
    camera.startPreview();
    }
    };

    // 保存照片任务类
    class SavePictureTask extends AsyncTask<byte[],String,String>{
    @Override
    protected String doInBackground(byte[]... params) {
    // 创建文件
    File picture = new File(Environment.getExternalStorageDirectory(),"picture.jpg");
    // 如果文件存在删除掉
    if(picture.exists())picture.delete();
    try {
    // 获得文件输出流
    FileOutputStream fos = new FileOutputStream(picture.getPath());
    // 写到该文件
    fos.write(params[0]);
    // 关闭文件流
    fos.close();
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    }
    // SurfaceHodler 回调,处理打开相机,关闭相机以及照片尺寸的改变
    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    // 打开相机
    camera = Camera.open();
    try {
    // 设置预览
    camera.setPreviewDisplay(holder);
    }
    catch (IOException e) {
    e.printStackTrace();
    }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    // 获得相机参数
    Camera.Parameters parameters = camera.getParameters();
    // 设置照片大小
    parameters.setPreviewSize(width, height);
    // 设置照片格式
    parameters.setPictureFormat(PixelFormat.JPEG);
    // 设置相机参数
    camera.setParameters(parameters);
    // 开始预览
    camera.startPreview();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    // 停止预览
    camera.stopPreview();
    // 释放相机资源
    camera.release();
    camera
    = null;
    }
    };
    }

    main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/preview"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      >
    </android.view.SurfaceView>

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.amaker.ch11.app"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".MainActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

        </application>
        <uses-sdk android:minSdkVersion="3" />

    </manifest>

  • 相关阅读:
    使用 Nginx 内置 $http_user_agent 来区分( 电脑 pc、手机 mobile、平板 pad )端的内容访问
    原创《开源一个用 vue 写的树层级组件 vue-ztree》
    原创《weex面向未来的架构》
    原创《如何用vue来轻松的驾驭 html5 webapp的页面体验》
    Pdf Convert Image 的解决方案
    原创《分享(Angular 和 Vue)按需加载的项目实践优化方案》
    .npmrc 实用小技巧
    使用Tampermonkey,实现Gitlab禁用自我Merge的功能
    vue 之 render 函数不能渲染非全局自定义函数-方案
    反射、注解和动态代理
  • 原文地址:https://www.cnblogs.com/linzheng/p/1942124.html
Copyright © 2020-2023  润新知