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

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

Fimcgzsd.java

[java] view plain copy
  1. packagecom.dao.usbcam;
  2. publicclassFimcgzsd{
  3. staticpublicnativeintopen(byte[]devname);
  4. staticpublicnativeintqbuf(intindex);
  5. staticpublicnativeintstreamon();
  6. staticpublicnativeintstreamoff();
  7. staticpublicnativeintdqbuf(byte[]videodata);
  8. staticpublicnativeintrelease();
  9. staticpublicnativeintinit(intwidth,intheight,intnumbuf);
  10. static{
  11. System.loadLibrary("fimcgzsd");
  12. }
  13. }
这个主要是HAL层的一些接口函数

MainActivity.java

[java] view plain copy
  1. packagecom.dao.usbcam;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.FileOutputStream;
  5. importjava.io.IOException;
  6. importandroid.app.Activity;
  7. importandroid.graphics.Bitmap;
  8. importandroid.graphics.BitmapFactory;
  9. importandroid.os.Bundle;
  10. importandroid.os.Environment;
  11. importandroid.os.Handler;
  12. importandroid.text.format.Time;
  13. importandroid.view.Menu;
  14. importandroid.view.View;
  15. importandroid.view.Window;
  16. importandroid.view.WindowManager;
  17. importandroid.view.View.OnClickListener;
  18. importandroid.widget.Button;
  19. importandroid.widget.ImageView;
  20. importandroid.widget.Toast;
  21. publicclassMainActivityextendsActivity{
  22. privateImageViewmImag;
  23. privateintwidth=640;
  24. privateintheight=480;
  25. privateStringdevname="/dev/video3";
  26. privatebyte[]mdata;
  27. privateHandlermHandler;
  28. privateintnumbuf=0;
  29. privateintindex=0;
  30. privateintret=0;
  31. publicButtonmcap;
  32. privateBitmapbitmap;
  33. @Override
  34. protectedvoidonCreate(BundlesavedInstanceState){
  35. super.onCreate(savedInstanceState);
  36. requestWindowFeature(Window.FEATURE_NO_TITLE);
  37. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  38. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  39. setContentView(R.layout.activity_main);
  40. mImag=(ImageView)findViewById(R.id.mimg);
  41. mcap=(Button)findViewById(R.id.mcap);
  42. numbuf=4;
  43. mdata=newbyte[width*height*numbuf];
  44. ret=Fimcgzsd.open(devname.getBytes());
  45. if(ret<0)
  46. finish();
  47. ret=Fimcgzsd.init(width,height,numbuf);
  48. if(ret<0)
  49. finish();
  50. ret=Fimcgzsd.streamon();
  51. if(ret<0)
  52. finish();
  53. mHandler=newHandler();
  54. newStartThread().start();
  55. mcap.setOnClickListener(newCaptureListener());
  56. }
  57. finalRunnablemUpdateUI=newRunnable(){
  58. @Override
  59. publicvoidrun(){
  60. //TODOAuto-generatedmethodstub
  61. mImag.setImageBitmap(bitmap);
  62. }
  63. };
  64. classStartThreadextendsThread{
  65. @Override
  66. publicvoidrun(){
  67. //TODOAuto-generatedmethodstub
  68. //super.run();
  69. while(true){
  70. index=Fimcgzsd.dqbuf(mdata);
  71. if(index<0){
  72. onDestroy();
  73. break;
  74. }
  75. mHandler.post(mUpdateUI);
  76. bitmap=BitmapFactory.decodeByteArray(mdata,0,width*height);
  77. Fimcgzsd.qbuf(index);
  78. }
  79. }
  80. }
  81. publicstaticvoidsaveMyBitmap(BitmapmBitmap){
  82. Timemtime=newTime();
  83. mtime.setToNow();
  84. Filefdir=newFile(Environment.getExternalStorageDirectory().getPath()+"/DCIM/"+"/gzsd/");
  85. if(!fdir.exists()){
  86. fdir.mkdir();
  87. }
  88. Filef=newFile(Environment.getExternalStorageDirectory().getPath()+"/DCIM/"+"/gzsd/"+mtime.year+mtime.month+mtime.monthDay+mtime.hour+mtime.minute+mtime.second+".png");
  89. try{
  90. f.createNewFile();
  91. }catch(IOExceptione){
  92. e.printStackTrace();
  93. }
  94. FileOutputStreamfOut=null;
  95. try{
  96. fOut=newFileOutputStream(f);
  97. mBitmap.compress(Bitmap.CompressFormat.PNG,100,fOut);
  98. fOut.flush();
  99. fOut.close();
  100. }catch(FileNotFoundExceptione){
  101. e.printStackTrace();
  102. }catch(IOExceptione){
  103. e.printStackTrace();
  104. }
  105. }
  106. classCaptureListenerimplementsOnClickListener{
  107. @Override
  108. publicvoidonClick(Viewv){
  109. //TODOAuto-generatedmethodstub
  110. //newCapThread().start();
  111. //Fimcgzsd.streamoff();
  112. saveMyBitmap(bitmap);
  113. //Fimcgzsd.streamon();
  114. Toast.makeText(MainActivity.this,"CaptureSuccessfully",Toast.LENGTH_LONG).show();
  115. }
  116. }
  117. classCapThreadextendsThread{
  118. @Override
  119. publicvoidrun(){
  120. //TODOAuto-generatedmethodstub
  121. //super.run();
  122. saveMyBitmap(bitmap);
  123. Toast.makeText(MainActivity.this,"CaptureSuccessfully",Toast.LENGTH_LONG).show();
  124. }
  125. }
  126. @Override
  127. protectedvoidonStop(){
  128. //TODOAuto-generatedmethodstub
  129. super.onStop();
  130. Fimcgzsd.release();
  131. finish();
  132. }
  133. @Override
  134. protectedvoidonPause(){
  135. //TODOAuto-generatedmethodstub
  136. super.onPause();
  137. Fimcgzsd.release();
  138. finish();
  139. }
  140. @Override
  141. protectedvoidonDestroy(){
  142. //TODOAuto-generatedmethodstub
  143. super.onDestroy();
  144. Fimcgzsd.release();
  145. }
  146. @Override
  147. publicbooleanonCreateOptionsMenu(Menumenu){
  148. //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
  149. getMenuInflater().inflate(R.menu.main,menu);
  150. finish();
  151. returntrue;
  152. }
  153. }
整体过程 其实很简单

首先open

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

然后init

[java] view plain copy
  1. Fimcgzsd.init(width,height,numbuf);
传入宽,高 以及 缓冲帧的数目

然后开启视频流

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

贴上我的效果图

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

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

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

更多相关文章

  1. 解决'keytool' is not recognized as an internal or external c
  2. Android(安卓)Storage Manager
  3. Android执行打开文件(PDF,PPT,WORD,EXCEL,CHM,HTML,TEXT,AUDIO,V
  4. android 获取相册图片及路径
  5. Android(安卓)app开发中获取cpu arm架构信息及执行shell命令方法
  6. Android(安卓)获取系统时间
  7. Android在onCreate或者在Fragment的onCreateView中获取控件、屏
  8. Android(安卓)Bluetooth opp package 学习笔记
  9. Android: 获取当前线程状态

随机推荐

  1. [Linux学习]关机命令
  2. 联想拯救者win10+ubuntu14.04
  3. 监视目录以获取没有第三方包的更改
  4. Linux下wget下载软件小技巧以及安装jdk、
  5. Linux声卡独占问题……
  6. 文本文件到字符串数组?
  7. Linux职业发展方向
  8. 装了xp之后怎么装不了Linux,郁闷几天了
  9. linux 下常用音频格式的转化
  10. Linux nginx 配置 location 语法 正则表