Android调用外置摄像头的方法
作者:北极熊的微笑 发布时间:2021-10-19 01:25:13
标签:Android,摄像头
本文实例为大家分享了Android调用外置摄像头的具体代码,供大家参考,具体内容如下
1、布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextureView
android:id="@+id/textureview"
android:layout_width="1dp"
android:layout_height="1dp"/>
<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_launcher_background"
android:contentDescription="@string/app_name"
android:layout_marginBottom="10dp"/>
</RelativeLayout>
2、相应的MainActivity.java的主要代码如下
package com.deepreality.takephotowithusbcamera;
import android.Manifest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.TextureView;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;
import com.tbruyelle.rxpermissions2.RxPermissions;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, View.OnClickListener {
private static final String TAG = MainActivity.class.getSimpleName();
private Camera mCamera;
private ImageButton mPlayButton;
private RxPermissions rxPermissions;
private int permissionNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rxPermissions = new RxPermissions(MainActivity.this);
checkUserAllPermissions();
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(0);
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();
}
/**
* 检查并获取用户权限
*/
private void checkUserAllPermissions() {
rxPermissions
.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
)
.subscribe(permission -> {
if (permission.granted) {
} else if (permission.shouldShowRequestPermissionRationale) {
} else {}
permissionNum ++;
if (permissionNum == 2) {
}
});
}
}
3、注意在清单文件里AndroidManifest.xml添加用户权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
来源:https://blog.csdn.net/lpCrazyBoy/article/details/89314512


猜你喜欢
- 本文以实例形式简单讲述了引用类型转换的几种常见方式,如:子类转换成父类,父类转换成子类,以及不是子父级关系类之间的转换。现分述如下,供大家参
- 最近在学ssh,一直搞不懂$,%,#的区别,做了点小练习,慢慢也懂了一点,将自己所学的也记录下来吧。 存在一下一个实
- 普通的公有继承class test1{public: test1(int i) :num1(i) {}privat
- 本文实例讲述了Java获取UTC时间的方法。分享给大家供大家参考,具体如下:取得本地时间:java.util.Calendar cal =
- 前言出去面试的时候,对java的集合框架考察的知识点还是蛮多的。除了基础的集合常见API使用,对集合底层的实现原理以及数据结构等也有很多考察
- springboot 配置多个jndi数据源1.在application.properties中,添加jndi配置如下图2.新建dataSo
- 有时候数据库文档需要整理,可是只能手动的复制粘贴,心中一万只草泥马奔腾而过。。。screw简洁好用的数据库表结构文档生成工具。1. 创建项目
- 看到这个标题,相信不少人会感到疑惑,回忆你们自己的场景会发现,在Spring的项目中很少有使用多线程处理任务的,没错,大多数时候我们都是使用
- Spring事务传递机制原理首先,我们通过org.springframework.transaction.annotation.Propag
- 思路要求ScrollView 嵌套 地址栏 和 WebView手指滑屏向下滚动(网页向上),如果网页有滚动条,首先把 地址栏 滚动到消失,然
- 一、Images1、概述Image 类为Bitmap(位图) 和 Metafile(矢量图) 的类提供功能的抽象基类。Image类不能直接创
- 创建一个列表消息卡片到目前为止,我们只有一个消息的卡片,看上去有点单调,所以让我们来改善它,让它拥有多条信息。我们需要创建一个能够显示多条消
- Android安装apk文件并适配Android 7.0详解首先在AndroidManifest.xml文件,activity同级节点注册p
- 本文参考于《深入理解Java虚拟机》内存分配与回收策略Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存
- 如何:对 Windows 窗体控件进行线程安全调用访问 Windows 窗体控件本质上不是线程安全的。 如果有两个或多个线程操作某一控件的状
- 本文实例讲述了C#通过DataSet读写xml文件的方法。分享给大家供大家参考。具体实现方法如下:DataSet ds = new Data
- 1.选择一个WebService接口作测试假设 WebService url 为 http://ws.webxml.com.cn/WebSe
- 一、概述平衡二叉树具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的
- java就业前需要掌握的专业技能1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、
- java和javascript长得是如此地相像,那么它们是一回事儿吗?现在让我来揭晓答案吧!JavaScript 是一种嵌入式脚本文件,直接