关于Android接入USB外接摄像头以及控制拍照并保存图片
16lz
2022-08-04
关于Android接入外接摄像头,首先毋庸置疑的是需要给你的app配置相应的权限
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1.首先构建相应的视图view
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <TextureView android:id="@+id/textureview" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageButton 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"/>RelativeLayout>
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的视图放在父布局里面就可以正常使用拍照了)。
demo:http://download.csdn.net/download/d38825/10166750
更多相关文章
- android中文api(89)——ViewManager
- Android中的FILL_PARENT与WRAP_CONTENT的区别
- android用户界面-组件Widget-地图视图MapView
- Android(安卓)中文API(86)——ResourceCursorAdapter
- android用户界面-组件Widget-画廊视图Gallery
- android 中文api (62) —— ViewSwitcher.ViewFactory
- Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
- android api 中文 (74)—— AdapterView.AdapterContextMenuInfo
- Android(安卓)如何开发 Bottom Navigation 风格