ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 10889|回复: 0
上一主题 下一主题
[教程]

第三十六讲:Android手机摄像头编程入门

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-28 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
>  本讲内容:Android手机摄像头编程入门智能手机中的摄像头和普通手机中的摄像头最大的区别在于,智能机上的摄像头可以由程序员写程序控制,做一些有趣的应用譬如,画中画,做一些有用的应用譬如二维码识别,等等。本讲打算通过一个实例,来介绍一下摄像头编程,相关解释都写在代码中了,请注意看代码注释。   
   
  实例:窈窈照相机,功能很简单,就是点击程序弹出照相预览界面,点击相机按钮完成照相功能,所照相片会存储在手机存储卡根目录。   
   
  1、创建一个项目 Lesson36_Camera ,主程序文件为 MainActivity.java2、AndroidManifest.xml 中设置屏幕为横屏,并且声明摄像头和存储卡的使用权限,具体代码如下:   
   
   
  1. <?xml version="1.0" encoding="utf-8"?>   
    <manifest package="basic.android.lesson36" xmlns:android="http://schemas.android.com/apk/res/android" android:versioncode="1" android:versionname="1.0">   
            <application android:label="@string/app_name" android:icon="@drawable/icon">   
                    <activity android:label="@string/app_name" android:name=".MainActivity" android:screenorientation="landscape" android:configchanges="orientation|keyboardHidden|keyboard">   
                            <intent -filter="">   
                                    <action android:name="android.intent.action.MAIN">   
                                    <category android:name="android.intent.category.LAUNCHER">   
                            </category></action></intent>   
                    </activity>   
       
            </application>   
            <uses -sdk="" android:minsdkversion="8">   
            <uses -permission="" android:name="android.permission.CAMERA"></uses>   
            <uses -permission="" android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses>   
            <uses -feature="" android:name="android.hardware.camera">   
            <uses -feature="" android:name="android.hardware.camera.autofocus">   
    </uses></uses></uses></manifest>  
复制代码
    3、本例中不需要布局文件main.xml,因为本例中的UI组建都是动态添加上去的。   
   
  4、最后MainActivity.java的代码如下:   
   
   
  1. package basic.android.lesson36;   
       
    import java.io.BufferedOutputStream;   
    import java.io.File;   
    import java.io.FileOutputStream;   
    import java.io.IOException;   
    import java.util.Calendar;   
    import java.util.Locale;   
       
    import android.app.Activity;   
    import android.content.Context;   
    import android.graphics.Bitmap;   
    import android.graphics.BitmapFactory;   
    import android.graphics.PixelFormat;   
    import android.hardware.Camera;   
    import android.os.Bundle;   
    import android.text.format.DateFormat;   
    import android.util.Log;   
    import android.view.KeyEvent;   
    import android.view.SurfaceHolder;   
    import android.view.SurfaceView;   
    import android.view.Window;   
    import android.view.WindowManager;   
    import android.widget.FrameLayout;   
    import android.widget.TextView;   
    import android.widget.Toast;   
       
    public class MainActivity extends Activity {   
       
            private CameraView cv;   
            //准备一个相机对象   
            private Camera mCamera = null;   
            //准备一个Bitmap对象   
            private Bitmap mBitmap = null;           
       
            //准备一个保存图片的PictureCallback对象   
            public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {   
       
                    public void onPictureTaken(byte[] data, Camera camera) {   
                            Log.i("yao","onPictureTaken");   
                            Toast.makeText(getApplicationContext(), "正在保存……", Toast.LENGTH_LONG).show();   
                            //用BitmapFactory.decodeByteArray()方法可以把相机传回的裸数据转换成Bitmap对象   
                            mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);   
                            //接下来的工作就是把Bitmap保存成一个存储卡中的文件   
                            File file = new File("/sdcard/YY"+ new DateFormat().format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg");   
                            try {   
                                    file.createNewFile();   
                                    BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));   
                                    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, os);   
                                    os.flush();   
                                    os.close();   
                                    Toast.makeText(getApplicationContext(), "图片保存完毕,在存储卡的根目录", Toast.LENGTH_LONG).show();   
                            } catch (IOException e) {   
                                    e.printStackTrace();   
                            }   
                    }   
       
            };   
       
            //Activity的创建方法   
            @Override   
            public void onCreate(Bundle savedInstanceState) {   
                    super.onCreate(savedInstanceState);   
       
                    //窗口去掉标题   
            requestWindowFeature(Window.FEATURE_NO_TITLE);   
            //窗口设置为全屏   
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);   
            //设置窗口为半透明   
            getWindow().setFormat(PixelFormat.TRANSLUCENT);   
       
            //提供一个帧布局   
            FrameLayout  fl = new FrameLayout(this);         
       
            //创建一个照相预览用的SurfaceView子类,并放在帧布局的底层   
            cv = new CameraView(this);   
                    fl.addView(cv);   
       
                    //创建一个文本框添加在帧布局中,我们可以看到,文字自动出现在了SurfaceView的前面,由此你可以在预览窗口做出各种特殊效果   
                    TextView tv = new TextView(this);   
                    tv.setText("请按"相机"按钮拍摄");   
                    fl.addView(tv);   
       
                    //设置Activity的根内容视图   
                    setContentView(fl);   
       
            }   
       
            //相机按键按下的事件处理方法   
            public boolean onKeyDown(int keyCode, KeyEvent event) {   
                    Log.i("yao","MainActivity.onKeyDown");   
                    if (keyCode == KeyEvent.KEYCODE_CAMERA) {   
                            if (mCamera != null) {   
                                    Log.i("yao","mCamera.takePicture");   
                                    //当按下相机按钮时,执行相机对象的takePicture()方法,该方法有三个回调对象做入参,不需要的时候可以设null   
                                    mCamera.takePicture(null, null, pictureCallback);   
                            }   
                    }   
                    return cv.onKeyDown(keyCode, event);   
            }   
       
            // 照相视图   
            class CameraView extends SurfaceView {   
       
                    private SurfaceHolder holder = null;   
       
                    //构造函数   
                    public CameraView(Context context) {   
                            super(context);   
                            Log.i("yao","CameraView");   
       
                            // 操作surface的holder   
                            holder = this.getHolder();   
                            // 创建SurfaceHolder.Callback对象   
                            holder.addCallback(new SurfaceHolder.Callback() {   
       
                                    @Override   
                                    public void surfaceDestroyed(SurfaceHolder holder) {   
                                            // 停止预览   
                                            mCamera.stopPreview();   
                                            // 释放相机资源并置空   
                                            mCamera.release();   
                                            mCamera = null;   
                                    }   
       
                                    @Override   
                                    public void surfaceCreated(SurfaceHolder holder) {   
                                            //当预览视图创建的时候开启相机   
                                            mCamera = Camera.open();   
                                            try {   
                                                    //设置预览   
                                                    mCamera.setPreviewDisplay(holder);   
                                            } catch (IOException e) {   
                                                    // 释放相机资源并置空   
                                                    mCamera.release();   
                                                    mCamera = null;   
                                            }   
       
                                    }   
       
                                    //当surface视图数据发生变化时,处理预览信息   
                                    @Override   
                                    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {   
       
                                            //获得相机参数对象   
                                            Camera.Parameters parameters = mCamera.getParameters();   
                                            //设置格式   
                                            parameters.setPictureFormat(PixelFormat.JPEG);   
                                            //设置预览大小,这里我的测试机是Milsstone所以设置的是854x480   
                                            parameters.setPreviewSize(854, 480);   
                                            //设置自动对焦   
                                            parameters.setFocusMode("auto");   
                                            //设置图片保存时的分辨率大小   
                                            parameters.setPictureSize(2592, 1456);   
                                            //给相机对象设置刚才设定的参数   
                                            mCamera.setParameters(parameters);   
                                            //开始预览   
                                            mCamera.startPreview();   
                                    }   
                            });   
                            // 设置Push缓冲类型,说明surface数据由其他来源提供,而不是用自己的Canvas来绘图,在这里是由摄像头来提供数据   
                            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
                    }   
       
            }   
       
    }
复制代码
  5、连接Milestone,编译并运行程序:悲剧的是,截图只能看到黑黑的一片,无法截取到摄像头传输过来SurfaceView信息,而在真机中是能看到预览效果的。   
     
   
     
   
   

上一篇:android用户界面之EditText教程实例汇
下一篇:主流UI设计
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2024-11-1 06:54 , Processed in 0.102973 second(s), 14 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2024 ZNDS.Com

快速回复 返回顶部 返回列表