当前位置:  c/c++开源软件 iis7站长之家
本页文章导读:
    ▪Camera教程 - 怎么在程序中使用照相机        Camera教程 -- 如何在程序中使用照相机 OPhone Camera 介绍 在手机中通过android.hardware.Camera类来控制摄像头设备,通过Camera类可以与摄像头服务取得(断开)链接、可以设置摄像头的各种属性、开始(.........
    ▪ 回来提示对话框        返回提示对话框 public void back_deal() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(R.drawable.epoint2); builder.setMessage("请选择需要返回的界面"); builder.setTitle(getString(R.string.prjnam.........
    ▪ JNI的学习之旅(1)       JNI的学习之旅(一) 1、基本数据类型      JNI定义了一系列基本数据类型和引用数据类型与java相对应。      Java Language Type Native Type Description boolean jboolean unsigned 8 bits byte jbyte sig.........

[1]Camera教程 - 怎么在程序中使用照相机
    来源: 互联网  发布时间: 2014-02-18
Camera教程 -- 如何在程序中使用照相机

OPhone Camera 介绍

在手机中通过android.hardware.Camera类来控制摄像头设备,通过Camera类可以与摄像头服务取得(断开)链接、可以设置摄像头的各种属性、开始(结束)图像预览、拍照或则录像。要使用Camera只有通过调用Camera的open() 函数来得到一个Camera对象。另外OPhone系统还提供了一些接口来控制Camera的状态:

  • android.hardware.Camera.AutoFocusCallback :当摄像头自动对焦的时候调用,该接口具有一个函数 voidonAutoFocus(boolean success, Camera camera);当自动对焦成功的时候success参数的值为true,否则为false。
  • android.hardware.Camera.ErrorCallback :当摄像头出错的时候调用,该接口具有一个函数 void onError(int error, Camera camera); 参数error为错误类型,其取值为Camera类中的常量CAMERA_ERROR_UNKNOWN或CAMERA_ERROR_SERVER_DIED;前者表明错误类型不明确,后者表明服务已关闭,在这种情况下必须释放当前的Camera对象然后重新初始化一个。
  • android.hardware.Camera.PreviewCallback :在图像预览时候调用,该接口具有一个函数void onPreviewFrame(byte[] data, Camera camera); 参数data为每帧图像的数据流。
  • android.hardware.Camera.ShutterCallback :当摄像头快门关闭的时候调用,该接口具有一个函数void onShutter(); 可以在该函数中通知用户快门已关闭,例如播放一个声音。
  • android.hardware.Camera.PictureCallback :当拍摄照片的时候调用,该接口具有一个函数void onPictureTaken(byte[] data, Camera camera); 参数data为拍摄照片的数据流。

当取得照片的数据流后可以通过BitmapFactory的 decodeByteArray() 函数来解析图片。

另外还可以通过Camera对象的getParameters()函数得到一个android.hardware.Camera.Parameters对象,Parameters提供了一些接口来设置Camera的属性:

  • setPictureFormat(int pixel_format):设置图片的格式,其取值为PixelFormat.YCbCr_420_SP、PixelFormat.RGB_565或则PixelFormat.JPEG。
  • setPreviewFormat(int pixel_format):设置图片预览的格式,取值同上。
  • setPictureSize(int width, int height):设置图片的高度和宽度,单位为像素。
  • setPreviewSize(int width, int height):设置图片预览的高度和宽度,取值同上。
  • setPreviewFrameRate(int fps):设置图片预览的帧速。

在设置好Camera的参数后,可以通过函数void startPreview()开始预览图像、void stopPreview()结束预览,通过autoFocus(AutoFocusCallback cb)来自动对焦,最后可以通过takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg)函数来拍照。该函数有三个参数,分别为快门回调接口、原生图像数据接口和压缩格式图片数据接口。如果数据格式不存在的话数据流为空,如果不需要实现这些接口则这些参数取值可以为null。

以上就是关于OPhone Camera的基础知识和相关的API介绍,下面来具体看看如何在程序中拍照并使用照片。

OPhone Camera 实战

这个示例将显示预览图像,在图像上点击则触发拍照操作,拍照成功后显示所拍的照片,然后点击Start菜单可以继续拍照。

首先通过OPhone开发工具(ODT)创建一个OPhone项目,填写基本信息后ODT会自动创建一个\src\org\goodev\camera\CameraActivity.java文件和res\layout\main.xml文件。

把main.xml文件内容修改为如下:

view plaincopy to clipboardprint?
  • <?xml version="1.0" encoding="utf-8"?>  
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  •     android:orientation="vertical"  
  •     android:layout_width="fill_parent"  
  •     android:layout_height="fill_parent"  
  •     >  
  •     <SurfaceView android:id="@+id/camera"  
  •         android:layout_width="fill_parent"  
  •         android:layout_height="fill_parent"/>  
  •     <ImageView android:id="@+id/image"  
  •         android:layout_width="fill_parent"  
  •         android:layout_height="fill_parent"/>  
  • </LinearLayout>  
  • SurfaceView 用来预览图像,ImageView 用来显示所拍的照片。这里也需读者会问,为什么要使用SurfaceView 来预览图像?使用其他的View不可以吗?要回答这个问题,需要了解下SurfaceView 的作用,关于SurfaceView 的详细介绍已超出了本教程的范围,我们会在后续教程中来详细介绍SurfaceView ,这里只做简要介绍。

    在通常情况下,OPhone程序中的View都是在同一个GUI线程中绘制的,该线程也是接收用户交互事件的线程(例如:按钮点击事件)。从另外的线程修改GUI元素是不可以的,如果要迅速的更新UI显示该如何办?显然在主线程中还需要处理其他事件,不适合做这件事情,所以OPhone提供了SurfaceView 来满足这种需求。一个SurfaceView 包装一个Surface对象(通过SurfaceHolder操作该对象)而不是Canvas对象,这就是关键所在,Surface可以在其他线程中绘制,这对于周期性更新和要求高帧率的场景来说是很有用的,特别是在游戏开发中。Surface中包含了当前UI的原生数据(raw data),在不同的软件和硬件条件下对这些数据的处理是不一样的,这就可以通过一些设置来加速图形的绘制,可以通过SurfaceHolder的setType函数来设置,目前接收如下的参数:

    • SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Surface
    • SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Surface
    • SURFACE_TYPE_GPU:适用于GPU加速的Surface
    • SURFACE_TYPE_PUSH_BUFFERS:表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,有Camera负责提供给预览Surface数据,这样图像预览会比较流畅。如果在这里设置了上面三种类型则可以发现不会出现预览图像,在和Camera底层的预览机制实现有关,如果对预览有特殊要求的可以现实PreviewCallback接口来自己处理。

    关于SurfaceView先简单介绍到这里,下面来继续看看如何在代码中实现。

    修改CameraActivity类使其实现如下接口:

    view plaincopy to clipboardprint?
  • android.view.SurfaceHolder.Callback  
  • android.view.View.OnClickListener  
  •  在CameraActivity的onCreate函数中初始化相关资源:

    view plaincopy to clipboardprint?
  • public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •   
  •         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  •         getWindow().setFormat(PixelFormat.TRANSLUCENT);  
  •         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  •         WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  •         setContentView(R.layout.main);  
  •         mSurfaceView = (SurfaceView) findViewById(R.id.camera);  
  •         mImageView = (ImageView) findViewById(R.id.image);  
  •         mImageView.setVisibility(View.GONE);  
  •   
  •         mSurfaceView.setOnClickListener(this);  
  •         mSurfaceHolder = mSurfaceView.getHolder();  
  •         mSurfaceHolder.addCallback(this);  
  •         mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  • 上面的代码首先设置窗口为全屏幕无标题的窗口,然后取得SurfaceView和ImageView对象并设置mSurfaceView的OnClickListener和mSurfaceHolder 的回调函数,最后设置mSurfaceHolder的类型为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS。

    当surface创建后初始化Camera对象,代码如下:

    view plaincopy to clipboardprint?
  • public void surfaceCreated(SurfaceHolder holder) {  
  •         mCamera = Camera.open();  
  •     }  
  • 当surface摧毁的时候释放Camera对象,代码如下:

    view plaincopy to clipboardprint?
  • public void surfaceDestroyed(SurfaceHolder holder) {  
  •         mCamera.stopPreview();  
  •         mPreviewRunning = false;  
  •         mCamera.release();  
  •         mCamera = null;  
  •     }  
  • 当surface状态改变的时候,重置Camera的状态,代码如下:

    view plaincopy to clipboardprint?
  • public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  •             int height) {  
  •         if (mPreviewRunning) {  
  •             mCamera.stopPreview();  
  •         }  
  •         Parameters params = mCamera.getParameters();  
  •         params.setPreviewSize(width, height);  
  •         mCamera.setParameters(params);  
  •   
  •         try {  
  •             mCamera.setPreviewDisplay(holder);  
  •         } catch (IOException e) {  
  •             e.printStackTrace();  
  •         }  
  •         mCamera.startPreview();  
  •         mPreviewRunning = true;  
  •     }  
  • 当在surface上点击的时候拍照,代码如下:

    view plaincopy to clipboardprint?
  • public void onClick(View v) {  
  •     mCamera.takePicture(mShutterCallback, null, mPictureCallback);  
  • }  
  • 在mPictureCallback中读取所拍的照片并显示:

    view plaincopy to clipboardprint?
  • PictureCallback mPictureCallback = new PictureCallback() {  
  •   
  •         public void onPictureTaken(byte[] data, Camera camera) {  
  •             Log.d("PictureCallback", "...onPictureTaken...");  
  •             if (data != null) {  
  •             Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,  
  •                         data.length);  
  •                 mImageView.setImageBitmap(bitmap);  
  •                 mImageView.setVisibility(View.VISIBLE);  
  •                 mSurfaceView.setVisibility(View.GONE);  
  •                 if (mPreviewRunning) {  
  •                     mCamera.stopPreview();  
  •                     mPreviewRunning = false;  
  •                 }  
  •             }  
  •         }  
  •   
  • };  
  • 最后不要忘记使用Camera是需要权限的,在AndroidManifest.xml文件中添加如下设置:

    view plaincopy to clipboardprint?
  • <uses-permission android:name="android.permission.CAMERA"/>  
  • 总结:通过以上示例程序可以看出在OPhone中使用设备的Camera是相当简单的,现在你就可以通过Camera来实现各种新奇的应用了,是否已经想跃跃欲试了?那就开始吧!

    附录:CameraActivity完整代码
    view plaincopy to clipboardprint?
  • package org.goodev.camera;  
  •   
  • import java.io.IOException;  
  •   
  • import android.app.Activity;  
  • import android.graphics.Bitmap;  
  • import android.graphics.BitmapFactory;  
  • import android.graphics.PixelFormat;  
  • import android.hardware.Camera;  
  • import android.hardware.Camera.Parameters;  
  • import android.hardware.Camera.PictureCallback;  
  • import android.hardware.Camera.ShutterCallback;  
  • import android.os.Bundle;  
  • import android.util.Log;  
  • import android.view.Menu;  
  • import android.view.MenuItem;  
  • import android.view.SurfaceHolder;  
  • import android.view.SurfaceView;  
  • import android.view.View;  
  • import android.view.Window;  
  • import android.view.WindowManager;  
  • import android.view.SurfaceHolder.Callback;  
  • import android.view.View.OnClickListener;  
  • import android.widget.ImageView;  
  •   
  • public class CameraActivity extends Activity   
  •     implements Callback, OnClickListener {  
  •   
  •     private static final int MENU_START = 1;  
  •     private SurfaceView mSurfaceView;  
  •     private SurfaceHolder mSurfaceHolder;  
  •     private Camera mCamera;  
  •     private boolean mPreviewRunning;  
  •   
  •     private ImageView mImageView;  
  •   
  •     /** 
  •      * 拍照的回调接口 
  •      */  
  •     PictureCallback mPictureCallback = new PictureCallback() {  
  •   
  •         public void onPictureTaken(byte[] data, Camera camera) {  
  •             Log.d("PictureCallback", "...onPictureTaken...");  
  •             if (data != null) {  
  •                 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,  
  •                         data.length);  
  •                 mImageView.setImageBitmap(bitmap);  
  •                 mImageView.setVisibility(View.VISIBLE);  
  •                 mSurfaceView.setVisibility(View.GONE);  
  •                 if (mPreviewRunning) {  
  •                     mCamera.stopPreview();  
  •                     mPreviewRunning = false;  
  •                 }  
  •             }  
  •         }  
  •   
  •     };  
  •     /** 
  •      * 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件, 
  •      * 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 
  •      * 例如:使设备震动 
  •      */  
  •     ShutterCallback mShutterCallback = new ShutterCallback() {  
  •   
  •         public void onShutter() {  
  •             //just log ,do nothing  
  •             Log.d("ShutterCallback", "...onShutter...");  
  •         }  
  •   
  •     };  
  •   
  •     /** Called when the activity is first created. */  
  •     @Override  
  •     public void onCreate(Bundle savedInstanceState) {  
  •         super.onCreate(savedInstanceState);  
  •   
  •         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  •         getWindow().setFormat(PixelFormat.TRANSLUCENT);  
  •         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  •         WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  •         setContentView(R.layout.main);  
  •         mSurfaceView = (SurfaceView) findViewById(R.id.camera);  
  •         mImageView = (ImageView) findViewById(R.id.image);  
  •         mImageView.setVisibility(View.GONE);  
  •   
  •         mSurfaceView.setOnClickListener(this);  
  •         mSurfaceHolder = mSurfaceView.getHolder();  
  •         mSurfaceHolder.addCallback(this);  
  •         mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  •   
  •     }  
  •   
  •     @Override  
  •     public boolean onCreateOptionsMenu(Menu menu) {  
  •         super.onCreateOptionsMenu(menu);  
  •         menu.add(0, MENU_START, 0, R.string.menu_start);  
  •         return true;  
  •     }  
  •   
  •     @Override  
  •     public boolean onOptionsItemSelected(MenuItem item) {  
  •         if (item.getItemId() == MENU_START) {  
  •             mImageView.setVisibility(View.GONE);  
  •             mSurfaceView.setVisibility(View.VISIBLE);  
  •             if (mPreviewRunning) {  
  •                 mCamera.stopPreview();  
  •             }  
  •             mCamera.startPreview();  
  •             mPreviewRunning = true;  
  •             return true;  
  •         }  
  •         return super.onOptionsItemSelected(item);  
  •     }  
  •   
  •     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  •             int height) {  
  •         if (mPreviewRunning) {  
  •             mCamera.stopPreview();  
  •         }  
  •         Parameters params = mCamera.getParameters();  
  •         params.setPreviewSize(width, height);  
  •         mCamera.setParameters(params);  
  •   
  •         try {  
  •             mCamera.setPreviewDisplay(holder);  
  •         } catch (IOException e) {  
  •             e.printStackTrace();  
  •         }  
  •         mCamera.startPreview();  
  •         mPreviewRunning = true;  
  •     }  
  •   
  •     public void surfaceCreated(SurfaceHolder holder) {  
  •         mCamera = Camera.open();  
  •     }  
  •   
  •     public void surfaceDestroyed(SurfaceHolder holder) {  
  •         mCamera.stopPreview();  
  •         mPreviewRunning = false;  
  •         mCamera.release();  
  •         mCamera = null;  
  •     }  
  •   
  •     public void onClick(View v) {  
  •         mCamera.takePicture(mShutterCallback, null, mPictureCallback);  
  •     }  
  • }  

  •     
    [2] 回来提示对话框
        来源: 互联网  发布时间: 2014-02-18
    返回提示对话框


    public void back_deal() {
    		AlertDialog.Builder builder = new AlertDialog.Builder(this);
    		builder.setIcon(R.drawable.epoint2);
    		builder.setMessage("请选择需要返回的界面");
    		builder.setTitle(getString(R.string.prjname));
    		builder.setPositiveButton("主界面", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    				Intent intent = new Intent(QWT_ManagerReportView.this,
    						MainView.class);
    				startActivity(intent);
    				finish();
    			}
    		});
    		builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int id) {
    				dialog.cancel();
    			}
    		});
    		builder.setNeutralButton("商户查询", new DialogInterface.OnClickListener() {
    			public void onClick(DialogInterface dialog, int which) {
    				setResult(1);
    				finish();
    			}
    		});
    		builder.create().show();
    	}

     

    public static void showBackDialog(Context con,
    			String backpage,// 指定返回页面的名称
    			OnClickListener listener1, OnClickListener listener2,
    			OnClickListener listener3) {
    		AlertDialog.Builder builder = new AlertDialog.Builder(con);
    		builder.setIcon(R.drawable.epoint2);
    		builder.setMessage("请选择需要返回的界面");
    		builder.setTitle(con.getString(R.string.prjname));
    		builder.setPositiveButton("主界面", listener1);
    		builder.setNegativeButton("取消", listener2);
    		builder.setNeutralButton(backpage, listener3);
    		builder.create().show();
    	}
     

     

    AlertHelp.showBackDialog(this, "商户查询",
    				new DialogInterface.OnClickListener() {
    					public void onClick(DialogInterface dialog, int which) {
    						Intent intent = new Intent(QWT_ManagerReportView.this,
    								MainView.class);
    						startActivity(intent);
    						finish();
    					}
    				}, new DialogInterface.OnClickListener() {
    					public void onClick(DialogInterface dialog, int which) {
    						finish();
    					}
    				}, new DialogInterface.OnClickListener() {
    					public void onClick(DialogInterface dialog, int which) {
    						setResult(1);
    						finish();
    					}
    				});
     

     

     

     

     

     

     

    
    

        
    [3] JNI的学习之旅(1)
        来源: 互联网  发布时间: 2014-02-18
    JNI的学习之旅(一)

    1、基本数据类型

         JNI定义了一系列基本数据类型和引用数据类型与java相对应。

        

    Java Language Type Native Type Description boolean jboolean

    unsigned 8 bits

    byte jbyte signed 8 bits short jchar unsigned 16 bits int jint signed 32 bits long jlong signed 64 bits float jfloat 32 bits double jdouble 64 bits      

    观察能够发现,JNI基本数据类型只是比Java基本数据类型前多了个'j'而已。

     

    2、引用数据类型

    jobject                                                                     (all objects)

               jclass                                                            (java.lang.Class instances)

               jstring                                                           (java.lang.String instances)

               jarray                                                            (arrays)

                        jobjectArray                                         (object[])

                        jbooleanArray                                      (boolean[])

                        jcharArray                                            (char[])

                        jshortArray                                           (short[])

                        jintArray                                               (int[])

                        jlongArray                                             (long[])

                        jfloatArray                                             (float[])

                        jdoubleArray                                          (double[])

                jthrowable                                                     java.lang.throwable

     

           跟java一样,jobject是所有引用类型的父亲。看看是不是很容易理解?呵呵,关于jthrowable,JNI也是有线程概念的。

    3、 The jvalue Type

    Jvalue 是基本数据类型和引用数据类型的集合,它的定义如下:

    typedef  union jvalue{

             jboolean  z;

            jbyte         b;

            jchar         c;

            jshort        s;

            jint            i;

            jlong         j;

            jfloat        f;

            jdouble     d;

            jobject      l;

    )jvalue;

     

     

     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3