android 实现自动拍照,android 调用摄像头自动拍照 并上传到YEELINK

前几天看到yeelink这个网站很感兴趣,注册了个图像传感器,就想着写个程序调用安卓摄像头并上传照片

程序很简单这个还是记录一下

首先是权限,分别是联网,相机,文件读取,照相和自动对焦的权限

然后是代码段

新建一个类,实现如下接口

照相机必须继承自surfaceview

我是这样调用的。。。。

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new CameraView(this)); //设置View。。

}

所以这个程序打开直接就是摄像机画面,自动拍照然后上传 没有任何其他的功能

代码自动分段了貌似,以下代码全在cameraview这个类里面,MyThread是个内部类

public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {

private SurfaceHolder holder;

private Camera camera;

private boolean af;

public CameraView(Context context) {//构造函数

super(context);

holder = getHolder();//生成Surface Holder

holder.addCallback(this);

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//指定Push Buffer

}

public void surfaceCreated(SurfaceHolder holder) {//Surface生成事件的处理

try {

camera = Camera.open();//摄像头的初始化

Camera.Parameters p =camera.getParameters();

p.setPictureSize(1500, 2000); //设置照片分辨率,太大上传不了

camera.setParameters(p);

camera.setPreviewDisplay(holder);

//camera.setDisplayOrientation(90);

} catch (Exception e) {

}

}

private void data2file(byte[] w, String fileName) throws Exception {//将二进制数据转换为文件的函数

FileOutputStream out =null;

try {

out =new FileOutputStream(fileName);

out.write(w);

out.close();

} catch (Exception e) {

if (out !=null)

out.close();

throw e;

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//Surface改变事件的处理

Camera.Parameters parameters = camera.getParameters();

parameters.setPreviewSize(width, height);

camera.setParameters(parameters);//设置参数

camera.startPreview();//开始预览

new MyThread().start() ;//这个线程实现拍照保存上传

//camera.autoFocus(null);

// camera.takePicture(null, null, this);

}

class MyThread extends Thread implements PictureCallback{

@Override

public void run() {

super.run();

while(true){

System.out.println("拍照线程wu异常");

camera.autoFocus(null);

camera.takePicture(null, null, this);

try {

sleep(20000);//20秒执行一次

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

@Override

public void onPictureTaken(byte[] data, Camera camera) {

// TODO Auto-generated method stub

try {

String path = Environment.getExternalStorageDirectory() +"/test.jpg";

Log.v("path", path);

data2file(data, path);

//到这步为止完成了自动拍照并保存,下面这个线程是上传的 想要触摸拍照的话要改写下的onTouchEvent方法,我这不用

new Thread(){

@Override

public void run()

{

URL url = null;

try {

url = new URL(//我的yeelink的图像传感器接入网址

"http://api.yeelink.net/v1.0/device/10722/sensor/17619/photos");

} catch (MalformedURLException e4) {

// TODO Auto-generated catch block

e4.printStackTrace();

}

HttpURLConnection connection = null;

try {

connection = ((HttpURLConnection) url

.openConnection());

} catch (IOException e4) {

// TODO Auto-generated catch block

e4.printStackTrace();

}

connection.setDoInput(true);

connection.setDoOutput(true);

connection.setUseCaches(false);

try {

connection.setRequestMethod("POST");

} catch (ProtocolException e3) {

// TODO Auto-generated catch block

e3.printStackTrace();

}

connection.setRequestProperty("U-ApiKey", "6d34f50cfb70255ddcbacae9cd5b2583");//我的yeelinkd的验证key

try {

connection.connect();

} catch (IOException e2) {

// TODO Auto-generated catch block

e2.printStackTrace();

}

OutputStream out = null;

try {

out = connection.getOutputStream();

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

int len;

byte[] buffer = new byte[1024];

// 读取文件

FileInputStream fileInputStream = null;

try {

fileInputStream = new FileInputStream(

"/storage/emulated/0/test.jpg");//上传图片的地址

//"/storage/sdcard1/Pictures/Saved Pictures/20130429_084309.jpg");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

while((len = fileInputStream.read(buffer, 0, 1024)) != -1){

out.write(buffer);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

out.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

out.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

fileInputStream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

InputStream input = null;

try {

input = connection.getInputStream();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

while ((len = input.read(buffer)) != -1) {

Log.i("tag", "data:"

+ new String(buffer, 0, len));

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

input.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

connection.disconnect();

}

}.start();

} catch (Exception e) {

}

camera.startPreview();

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值