android usb传输图片,关于Android接入USB外接摄像头以及控制拍照并保存图片

关于Android接入外接摄像头,首先毋庸置疑的是需要给你的app配置相应的权限

1.首先构建相应的视图view

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="${relativePackage}.${activityClass}" >

android:id="@+id/textureview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

android:id="@+id/play"

android:layout_width="60dp"

android:layout_height="60dp"

android:layout_centerHorizontal="true"

android:layout_alignParentBottom="true"

android:background="@drawable/ic_start"

android:contentDescription="@string/app_name"

android:layout_marginBottom="10dp"/>

2.获取到相应的camera对象,并完成拍照进行本地存储

package com.example.onecamera;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Iterator;

import java.util.List;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.SurfaceTexture;

import android.hardware.Camera;

import android.hardware.Camera.Size;

import android.media.CamcorderProfile;

import android.media.MediaRecorder;

import android.os.AsyncTask;

import android.os.Bundle;

import android.util.Log;

import android.view.TextureView;

import android.view.TextureView.SurfaceTextureListener;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageButton;

import android.widget.Toast;

@SuppressWarnings("deprecation")

public class MainActivity extends Activity implements SurfaceTextureListener,

OnClickListener {

private static final String TAG = MainActivity.class.getSimpleName();

private Camera mCamera;

private ImageButton mPlayButton;

private boolean isRecord;

private MediaRecorder mMediaRecorder;

private CamcorderProfile mProfile;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mPlayButton = (ImageButton) findViewById(R.id.play);

mPlayButton.setOnClickListener(this);

((TextureView) findViewById(R.id.textureview))

.setSurfaceTextureListener(this);

}

private void takePic() {

if (mCamera != null) {

//调用抓拍摄像头抓拍

mCamera.takePicture(null, null, pictureCallback);

} else {

Log.e("TAG", "请检查摄像头!");

}

}

private Bitmap mBitmap;

public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

@Override

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

Log.i("ygy", "onPictureTaken");

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

System.out.println(df.format(new Date()));// new Date()为获取当前系统时间

String picName = df.format(new Date());

Toast.makeText(getApplicationContext(), "正在保存...", Toast.LENGTH_LONG).show();

mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

File file = new File("/storage/emulated/0/" + picName + ".jpg");

try {

file.createNewFile();

BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));

mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);

os.flush();

os.close();

Toast.makeText(getApplicationContext(), "图像保存成功", Toast.LENGTH_LONG).show();

} catch (IOException e) {

e.printStackTrace();

}

}

};

@Override

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,

int height) {

mCamera = Camera.open(1);

if (mCamera != null) {

try {

mCamera.setPreviewTexture(surface);

mCamera.startPreview();

} catch (IOException e) {

Log.d("TAG", e.getMessage());

}

}

}

@Override

protected void onStop() {

if (mCamera != null) {

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

super.onStop();

}

@Override

public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,

int height) {

}

@Override

public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

if (mCamera != null) {

mCamera.stopPreview();

mCamera.release();

mCamera = null;

}

return false;

}

@Override

public void onSurfaceTextureUpdated(SurfaceTexture surface) {

}

@Override

public void onClick(View v) {

if (mCamera == null) {

return;

}

takePic();

}

}

在完成以上操作之后仍无法调用到摄像头,请注意一下方法:mCamera = Camera.open(1); 这个并不是所有的android系统都是这个,有可能是mCamera = Camera.open(0); 这个根据实际情况来定

如果你做了以上操作成功了,但是移入到项目里面发现并不能行,那么请先检查你的camera是否有预览视图TextureView,如果你在布局文件里面没有放置TextureView来给camera显示,那么可能会导致你的camera无法进行拍照(我就是遇到这个坑,然后一直找不到原因,后来配置了一个宽高1dp的视图放在父布局里面就可以正常使用拍照了)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android系统提供的Camera API接口是可以用来控制外接USB摄像头的,该接口提供了与摄像头的使用相关的方法和类。通过调用该API的方法,可以实现对USB摄像头控制,如拍照、录像、调整曝光、聚焦、缩放等操作。 在使用Camera API接口控制USB摄像头时,需要先检测设备和摄像头的连接情况,然后打开摄像头并获取相关的参数设置,比如摄像头分辨率、颜色格式等。接下来,可以开始获取预览数据、设置预览画面、进行拍照和录像等操作。 USB摄像头Android系统的连接方式一般采用OTG线或HDMI接口或者使用无线方式连接。对于需要连接OTG线的摄像头,需要注意设备支持OTG功能和OTG线的连接方式。 总之,通过使用Camera API接口,可以实现对外接USB摄像头控制,在许多应用场景下具有很大的可行性和实用性。 ### 回答2: Android系统提供了统一的Camera API接口,用于控制手机内置摄像头的各种功能。而通过第三方库的支持,Android也可以支持外接USB摄像头控制。 与内置摄像头不同,USB摄像头需要一个USB OTG引擎来支持数据的传输。一些基于ARM的平板电脑和智能手机已经集成了USB OTG的功能,如果你的设备不支持,你需要一个USB OTG转接器来支持你的USB摄像头。 使用具体的摄像头库时,Android系统需要分别安装UVC(USB Video Class)和USB OTG驱动程序。一旦安装完成,开发人员就可以直接通过Camera API接口来控制USB摄像头。这些API包括打开摄像头控制光圈、调整曝光时间、设置对焦模式等等。 需要注意的是,USB摄像头的性能和图像质量与设备或摄像头本身设定相关。而且,由于Android系统的碎片化,一些特定的设备可能需要适配特定的USB摄像头,请在事先查询用户的设备列表并做适配工作。 总之,通过使用Camera API接口,Android系统可以轻松地控制与扩展相机硬件设备。这使得开发人员可以更灵活地选择相机硬件,并创建更好的图像和视觉体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值