package bbk.usbcamera;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Runnable {
public static volatile boolean exit = true;
public volatile boolean destory = false;
private static final boolean DEBUG = true;
private static final String TAG="hc";
protected Context context;
private SurfaceHolder holder;
Thread mainLoop = null;
private Bitmap bmp=null;
private boolean cameraExists=false;
private boolean shouldStop=false;
// /dev/videox (x=cameraId+cameraBase) is used.
// In some omap devices, system uses /dev/video[0-3],
// so users must use /dev/video[4-].
// In such a case, try cameraId=0 and cameraBase=4
private int cameraId=4;
private int cameraBase=0;
// This definition also exists in ImageProc.h.
// Webcam must support the resolution 640x480 with YUYV format.
static final int IMG_WIDTH=640;
static final int IMG_HEIGHT=480;
// The following variables are used to draw camera images.
private int winWidth=0;
private int winHeight=0;
private Rect rect;
private int dw, dh;
private float rate;
// JNI functions
public native int prepareCamera(int videoid);
public native int prepareCameraWithBase(int videoid, int camerabase);
public native void processCamera();
public native void stopCamera();
public native void pixeltobmp(Bitmap bitmap);
static {
try {
System.loadLibrary("ImageProc");
}catch (Exception e){
e.printStackTrace();
}
}
public CameraPreview(Context context) {
super(context);
this.context = context;
if(DEBUG) Log.d(TAG,"CameraPreview constructed");
setFocusable(true);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
}
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
if(DEBUG) Log.d(TAG,"CameraPreview constructed");
setFocusable(true);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
}
@Override
public void run() {
while (true && cameraExists) {
//obtaining display area to draw a large image
if(winWidth==0){
winWidth=this.getWidth();
winHeight=this.getHeight();
if(winWidth*3/4<=winHeight){
dw = 0;
dh = (winHeight-winWidth*3/4)/2;
rate = ((float)winWidth)/IMG_WIDTH;
rect = new Rect(dw,dh,dw+winWidth-1,dh+winWidth*3/4-1);
}else{
dw = (winWidth-winHeight*4/3)/2;
dh = 0;
rate = ((float)winHeight)/IMG_HEIGHT;
rect = new Rect(dw,dh,dw+winHeight*4/3 -1,dh+winHeight-1);
}
}
// obtaining a camera image (pixel data are stored in an array in JNI).
processCamera();
// camera image to bmp
pixeltobmp(bmp);
Canvas canvas = getHolder().lockCanvas();
if (canvas != null)
{
// draw camera bmp on canvas
canvas.drawBitmap(bmp,null,rect,null);
getHolder().unlockCanvasAndPost(canvas);
}
if(shouldStop){
shouldStop = false;
break;
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(DEBUG) Log.d(TAG, "surfaceCreated");
if(bmp==null){
bmp = Bitmap.createBitmap(IMG_WIDTH, IMG_HEIGHT, Bitmap.Config.ARGB_8888);
}
// /dev/videox (x=cameraId + cameraBase) is used
int ret = prepareCameraWithBase(cameraId, cameraBase);
if(ret!=-1) cameraExists = true;
mainLoop = new Thread(this);
mainLoop.start();
// in a new thread to save pictures
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
if (!CameraPreview.exit) {
try {
Thread.sleep(3000);
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
String date = sDateFormat.format(new java.util.Date());
saveBitmap(bmp, "hc" + date + ".png");
//Log.d(TAG, "生成图片" + "hc" + date + ".png");
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
if(destory)
break;
}
}
}).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if(DEBUG) Log.d(TAG, "surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(DEBUG) Log.d(TAG, "surfaceDestroyed");
if(cameraExists){
shouldStop = true;
CameraPreview.exit = true;
destory = true;
while(shouldStop){
try{
Thread.sleep(100); // wait for thread stopping
}catch(Exception e){
e.printStackTrace();
}
}
}
stopCamera();
}
private void saveBitmap(Bitmap bitmap,String bitName) throws IOException
{
File file = new File("/sdcard/DCIM/Camera/"+bitName);
if(file.exists()){
file.delete();
}
FileOutputStream out;
try{
out = new FileOutputStream(file);
if(bitmap.compress(Bitmap.CompressFormat.PNG, 90, out))
{
out.flush();
out.close();
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip 毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip毕业设计的项目,基于Android
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计的项目,基于Android的一个红外防盗报警 需要自己添加蜂鸣器和热释电的硬件访问服务+源代码+文档说明.zip (65个子文件)
主master
UsbCamera
classes
build.gradle 83B
classes.jar 12.45MB
gradle.properties 730B
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 233B
app
src
androidTest
java
bbk
usbcamera
ExampleInstrumentedTest.java 730B
test
java
bbk
usbcamera
ExampleUnitTest.java 391B
main
java
bbk
usbcamera
CameraPreview.java 6KB
MainActivity.java 5KB
HcBuzzer.java 269B
res
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher.png 3KB
mipmap-mdpi
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
values-w820dp
dimens.xml 358B
values
dimens.xml 211B
colors.xml 208B
strings.xml 72B
styles.xml 383B
layout
activity_main.xml 3KB
AndroidManifest.xml 896B
proguard-rules.pro 641B
build.gradle 944B
.gitignore 7B
gradlew.bat 2KB
build.gradle 498B
.idea
runConfigurations.xml 564B
misc.xml 2KB
compiler.xml 686B
modules.xml 468B
gradle.xml 775B
encodings.xml 159B
copyright
profiles_settings.xml 74B
settings.gradle 27B
gradlew 5KB
.gitignore 118B
jni
Android.mk 787B
ImageProc.h 2KB
armeabi
libImageProc.so 9KB
ImageProc.c 9KB
Application.mk 136B
HC-RS501
HcService.java 577B
tiny4412_hc501_old.c 3KB
Makefile 410B
app.c 488B
tiny4412_hc501.c 4KB
com_android_server_HcService.cpp 1KB
IHcService.aidl 78B
IHcService.java 2KB
hc501_hal.c 2KB
hc501_hal.h 367B
buzzer
IBuzzerService.java 3KB
com_android_server_BuzzerService.cpp 1KB
led_hal.c 2KB
IBuzzerService.aidl 103B
Makefile 425B
Android.mk 968B
buzzer_hal.c 3KB
appc_buzzer.c 498B
tiny4412_buzzer.c 3KB
BuzzerService.java 689B
buzzer_hal.h 505B
led_hal.h 215B
.gitignore 235B
共 65 条
- 1
资源评论
程序员张小妍
- 粉丝: 1w+
- 资源: 2788
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功