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" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android调用前后摄像头同时工作实例代码

    硬件环境:小米4 Android版本:6.0 咱们先看效果图: 我把代码贴出来: AndroidMainfest.xml文件(需要新增camera权限): <uses-permission android:name="android.permission.CAMERA" /> activity_main.xml文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayo

  • Android实现调用摄像头拍照与视频功能

    应用场景: 在Android开发过程中,有时需要调用手机自身设备的功能,上篇文章主要侧重摄像头拍照功能的调用.本篇文章将综合实现拍照与视频的操作. 知识点介绍: 该部分请阅读 [Android 调用摄像头功能] 使用方式: 第一步: 新建一个Android项目CameraPhotoVedio,包含两个Activity: MainActivity.CameraActivity. 第二步: activity_main.xml <RelativeLayout xmlns:android="htt

  • Android实现调用摄像头

    应用场景: 在Android开发过程中,有时需要调用手机自身设备的功能,本文侧重摄像头拍照功能的调用. 知识点介绍: 使用权限:调用手机自身设备功能(摄像头拍照功能),应该确保已经在AndroidManifest.xml中正确声明了对摄像头的使用及其它相关的feature 1. 摄像头相关权限设置 <!--摄像头权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!--存

  • Android实现调用手机摄像头录像限制录像时长

    本文实例为大家分享了Android实现调用手机摄像头录像限制录像时长的具体代码,供大家参考,具体内容如下 因为服务器空间有限,所以视频时长必须有所限制. 在xml中先布局一个按钮,点击开始录频.布局一个TextView用于显示倒计时的时间. 一.使用Hander+TimerTask完成定时操作 private TextView btn_stop; private int recLen = 11; Timer timer = new Timer(); //时间倒计时放在开始按钮事件后,看标题7那里

  • Android调用手机摄像头拍照和录音功能

    本文实例为大家分享了Android调用手机摄像头拍照和录音功能的具体代码,供大家参考,具体内容如下 调用摄像头拍照: public class MainActivity extends Activity {       private Button button;     private ImageView imageView;     @Override     protected void onCreate(Bundle savedInstanceState) {         super

  • Android调用手机摄像头的方法

    本文实例为大家分享了Android调用手机摄像头的具体代码,供大家参考,具体内容如下 根据<第一行代码>进行改写: 布局文件,只有一个按钮,和一个Imageview,imageview用于显示拍下后的图片activity_main.xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:andr

  • Android开发教程之调用摄像头功能的方法详解

    本文实例讲述了Android调用摄像头功能的方法.分享给大家供大家参考,具体如下: 我们要调用摄像头的拍照功能,显然 第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码 摄像头权限: <uses-permission android:name="android.permission.CAMERA"/> SD卡读写权限: <uses-permission androi

  • Android实现调用摄像头进行拍照功能

    现在Android智能手机的像素都会提供照相的功能,大部分的手机的摄像头的像素都在1000万以上的像素,有的甚至会更高.它们大多都会支持光学变焦.曝光以及快门等等. 下面的程序Demo实例示范了使用Camera v2来进行拍照,当用户按下拍照键时,该应用会自动对焦,当对焦成功时拍下照片. layout/activity_main.xml界面布局代码如下: <?xml version="1.0" encoding="utf-8"?> <manifes

  • android开发之调用手机的摄像头使用MediaRecorder录像并播放

    我们玩玩手机的录像功能吧.做个DEMO. 看看录制过程: 复制代码 代码如下: mediarecorder = new MediaRecorder();// 创建mediarecorder对象 // 设置录制视频源为Camera(相机) mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 mediarecorder.setOutputFo

  • Android调用系统摄像头拍照并显示在ImageView上

    简介 现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统摄像头拍照并获取即时照片,本博文就是讲述如何调用摄像头拍照并显示在指定的控件上. 先来看看效果图 由于这里我用的是模拟器没有摄像头,所以拍照是黑的,至于里面2个红色圆圈那是Genymotion自带的标志. 实现起来比较简单: activity_main.xml <?xml version="1.0" encoding="utf-8

随机推荐