近期有个项目要起用Android开发版,驱动四颗摄像头,进行拍照,录像并上传的功能。第一想法是不就是驱动摄像头拍照吗?之后就陷入了各种bug和功能不满足的漩涡中。好了不多说下面上代码。不好勿喷
项目中引用了GitHub上的一个开源项目:https://github.com/saki4510t/UVCCamera
该项目中写了很多例子有兴趣的可以了解一下,我这便主要用了项目中的libuvccamera和usbCameraCommon两包。后面会把这两个包单独上传。直接在Android studio中引用这两个包。
首先在布局文件中这样写:
<com.serenegiant.widget.UVCCameraTextureView android:id="@+id/camera1" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/d_photograph" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="70dp" android:text="点击拍照" />
宽/高写自己需要拍出来的照片的对应像素。如果此处不写具体值后面的照片尺寸会是Android设备的默认比例大小
获取权限在Manifest中添加
<!-- 摄像头权限 --> <uses-permission android:name="android.permission.CAMERA"/> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>在Activity中添加。应为6.0以上的权限中文件权限被设置成了隐私权限所以此处需要动态获取。可以加入版本判断。
//检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission .WRITE_EXTERNAL_STORAGE)) { Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show(); } //申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } else { //Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show(); Log.e("Application", "checkPermission: 已经授权!"); }
好了下面是重点
package com.yao.camera.activity; import android.app.Activity; import android.app.PendingIntent; import android.content.Context; import android.graphics.SurfaceTexture; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.util.Log; import android.view.Surface; import android.view.View; import android.widget.Button; import com.serenegiant.common.BaseActivity; import com.serenegiant.usb.USBMonitor; import com.serenegiant.usb.UVCCamera; import com.serenegiant.usbcameracommon.UVCCameraHandler; import com.serenegiant.widget.UVCCameraTextureView; import com.yao.camera.R; import com.yao.camera.http.ImageUpHttps; import com.yao.camera.model.HttpModel; import com.yao.camera.util.CameraUtil; import com.yao.camera.util.FileUtil; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by yao on 2018/2/6. * USB相机拍照Activity */ public class CameraActivity extends BaseActivity { /** * 调试显示 */ @BindView(R.id.camera1) UVCCameraTextureView cameraOne; /** * 调试拍照按钮 */ @BindView(R.id.d_photograph) Button