android 4.0 USB Camera实例(二)应用层

来源:互联网 发布:阿里云退订 编辑:程序博客网 时间:2024/05/18 02:34

上一篇说了HAL层 这一篇具体应用HAL层 实例预览与拍照的功能

首先贴上两个主文件的源码

Fimcgzsd.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.dao.usbcam;  
  2.   
  3. public class Fimcgzsd {  
  4.     static public native int open(byte[] devname);  
  5.     static public native int qbuf(int index);  
  6.     static public native int streamon();  
  7.     static public native int streamoff();  
  8.     static public native int dqbuf(byte[] videodata);  
  9.     static public native int release();  
  10.     static public native int init(int width, int height,int numbuf);  
  11.     static {  
  12.         System.loadLibrary("fimcgzsd");  
  13.     }  
  14. }  
这个主要是HAL层的一些接口函数

MainActivity.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.dao.usbcam;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7.   
  8. import android.app.Activity;  
  9. import android.graphics.Bitmap;  
  10. import android.graphics.BitmapFactory;  
  11. import android.os.Bundle;  
  12. import android.os.Environment;  
  13. import android.os.Handler;  
  14. import android.text.format.Time;  
  15. import android.view.Menu;  
  16. import android.view.View;  
  17. import android.view.Window;  
  18. import android.view.WindowManager;  
  19. import android.view.View.OnClickListener;  
  20. import android.widget.Button;  
  21. import android.widget.ImageView;  
  22. import android.widget.Toast;  
  23.   
  24. public class MainActivity extends Activity {  
  25.     private ImageView mImag;  
  26.     private int width = 640;  
  27.     private int height = 480;  
  28.     private String devname = "/dev/video3";  
  29.     private byte[] mdata;  
  30.     private Handler mHandler;  
  31.     private int numbuf = 0;  
  32.     private int index = 0;  
  33.     private int ret = 0;  
  34.     public Button mcap;  
  35.     private Bitmap bitmap;  
  36.     @Override  
  37.     protected void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  40.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  41.           WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  42.         setContentView(R.layout.activity_main);  
  43.         mImag = (ImageView)findViewById(R.id.mimg);  
  44.         mcap = (Button)findViewById(R.id.mcap);  
  45.         numbuf  = 4;  
  46.         mdata = new byte[width * height * numbuf];  
  47.         ret = Fimcgzsd.open(devname.getBytes());  
  48.         if(ret < 0)  
  49.             finish();  
  50.         ret = Fimcgzsd.init(width, height, numbuf);  
  51.         if(ret < 0)  
  52.             finish();  
  53.         ret = Fimcgzsd.streamon();  
  54.         if(ret < 0)  
  55.             finish();  
  56.         mHandler = new Handler();  
  57.         new StartThread().start();  
  58.         mcap.setOnClickListener(new CaptureListener());  
  59.     }  
  60.   
  61.     final Runnable mUpdateUI = new Runnable() {  
  62.   
  63.         @Override  
  64.         public void run() {  
  65.             // TODO Auto-generated method stub  
  66.             mImag.setImageBitmap(bitmap);  
  67.               
  68.         }  
  69.     };  
  70.       
  71.     class StartThread extends Thread {  
  72.   
  73.         @Override  
  74.         public void run() {  
  75.             // TODO Auto-generated method stub  
  76.             //super.run();  
  77.             while(true) {  
  78.                 index = Fimcgzsd.dqbuf(mdata);  
  79.                 if(index < 0) {  
  80.                     onDestroy();  
  81.                     break;  
  82.                 }  
  83.                 mHandler.post(mUpdateUI);  
  84.                 bitmap = BitmapFactory.decodeByteArray(mdata, 0, width * height);  
  85.                 Fimcgzsd.qbuf(index);  
  86.             }  
  87.         }  
  88.   
  89.     }  
  90.     public static void saveMyBitmap(Bitmap mBitmap) {  
  91.         Time mtime = new Time();  
  92.         mtime.setToNow();  
  93.         File fdir = new File(Environment.getExternalStorageDirectory().getPath() + "/DCIM/" + "/gzsd/");  
  94.         if(!fdir.exists()) {  
  95.             fdir.mkdir();  
  96.         }  
  97.         File f = new File(Environment.getExternalStorageDirectory().getPath() + "/DCIM/" + "/gzsd/" + mtime.year + mtime.month + mtime.monthDay + mtime.hour + mtime.minute +mtime.second+".png");  
  98.         try {  
  99.                 f.createNewFile();  
  100.         } catch (IOException e) {  
  101.             e.printStackTrace();  
  102.         }  
  103.         FileOutputStream fOut = null;  
  104.         try {  
  105.                 fOut = new FileOutputStream(f);  
  106.                 mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);  
  107.                 fOut.flush();  
  108.                 fOut.close();  
  109.         } catch (FileNotFoundException e) {  
  110.             e.printStackTrace();  
  111.         } catch (IOException e) {  
  112.             e.printStackTrace();  
  113.         }  
  114.   
  115.     }  
  116.       
  117.     class CaptureListener implements OnClickListener{  
  118.   
  119.         @Override  
  120.         public void onClick(View v) {  
  121.             // TODO Auto-generated method stub  
  122.             //new CapThread().start();  
  123.             //Fimcgzsd.streamoff();  
  124.             saveMyBitmap(bitmap);  
  125.             //Fimcgzsd.streamon();  
  126.             Toast.makeText(MainActivity.this"Capture Successfully", Toast.LENGTH_LONG).show();  
  127.         }  
  128.           
  129.     }  
  130.       
  131.     class CapThread extends Thread {  
  132.   
  133.         @Override  
  134.         public void run() {  
  135.             // TODO Auto-generated method stub  
  136.             //super.run();  
  137.             saveMyBitmap(bitmap);  
  138.             Toast.makeText(MainActivity.this"Capture Successfully", Toast.LENGTH_LONG).show();  
  139.         }  
  140.           
  141.     }  
  142.       
  143.     @Override  
  144.     protected void onStop() {  
  145.         // TODO Auto-generated method stub  
  146.         super.onStop();  
  147.         Fimcgzsd.release();  
  148.         finish();  
  149.     }  
  150.   
  151.     @Override  
  152.     protected void onPause() {  
  153.         // TODO Auto-generated method stub  
  154.         super.onPause();  
  155.         Fimcgzsd.release();  
  156.         finish();  
  157.     }  
  158.   
  159.     @Override  
  160.     protected void onDestroy() {  
  161.         // TODO Auto-generated method stub  
  162.         super.onDestroy();  
  163.         Fimcgzsd.release();  
  164.     }  
  165.   
  166.     @Override  
  167.     public boolean onCreateOptionsMenu(Menu menu) {  
  168.         // Inflate the menu; this adds items to the action bar if it is present.  
  169.         getMenuInflater().inflate(R.menu.main, menu);  
  170.         finish();  
  171.         return true;  
  172.     }  
  173.   
  174. }  
整体过程 其实很简单

首先open

这里usb camera设备为/dev/video3 为了修改方面所以我把这个参数放在应用层里传到HAL层 分辨率为640*480

然后init

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Fimcgzsd.init(width, height, numbuf);  
传入宽,高 以及 缓冲帧的数目

然后开启视频流

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. Fimcgzsd.streamon();  
开另外一个进程 循环获取数据 由于这里获取到的数据直接是jpeg格式的所以 我直接把他转成bmp然后用imageview直接显示 又省了不少事

贴上我的效果图

30W像素的摄像头,目前capture似乎还有问题,似乎是驱动有问题 继续研究中...

============================================
作者:hclydao
http://blog.csdn.net/hclydao
版权没有,但是转载请保留此段声明

============================================

0 0
原创粉丝点击