日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android 实现自动拍照,Android自定义相机实现定时拍照功能

發(fā)布時(shí)間:2023/12/2 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 实现自动拍照,Android自定义相机实现定时拍照功能 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇博客為大家介紹Android自定義相機(jī),并且實(shí)現(xiàn)倒計(jì)時(shí)拍照功能。

首先自定義拍照會(huì)用到SurfaceView控件顯示照片的預(yù)覽區(qū)域,以下是布局文件:

activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/surface_view"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/start"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_alignParentBottom="true"

android:layout_marginBottom="10dp"

android:src="@drawable/capture"/>

android:id="@+id/count_down"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_gravity="center"

android:gravity="center"

android:textSize="80sp"/>

MainActivity.java

package com.jackie.timercamera;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Matrix;

import android.hardware.Camera;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.widget.ImageView;

import android.widget.TextView;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback,

View.OnClickListener, Camera.PictureCallback {

private SurfaceView mSurfaceView;

private ImageView mIvStart;

private TextView mTvCountDown;

private SurfaceHolder mHolder;

private Camera mCamera;

private Handler mHandler = new Handler();

private int mCurrentTimer = 10;

private boolean mIsSurfaceCreated = false;

private boolean mIsTimerRunning = false;

private static final int CAMERA_ID = 0; //后置攝像頭

// private static final int CAMERA_ID = 1; //前置攝像頭

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

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

initEvent();

}

@Override

protected void onPause() {

super.onPause();

stopPreview();

}

private void initView() {

mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);

mIvStart = (ImageView) findViewById(R.id.start);

mTvCountDown = (TextView) findViewById(R.id.count_down);

}

private void initEvent() {

mHolder = mSurfaceView.getHolder();

mHolder.addCallback(this);

mIvStart.setOnClickListener(this);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

mIsSurfaceCreated = true;

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

startPreview();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

mIsSurfaceCreated = false;

}

private void startPreview() {

if (mCamera != null || !mIsSurfaceCreated) {

Log.d(TAG, "startPreview will return");

return;

}

mCamera = Camera.open(CAMERA_ID);

Camera.Parameters parameters = mCamera.getParameters();

int width = getResources().getDisplayMetrics().widthPixels;

int height = getResources().getDisplayMetrics().heightPixels;

Camera.Size size = getBestPreviewSize(width, height, parameters);

if (size != null) {

//設(shè)置預(yù)覽分辨率

parameters.setPreviewSize(size.width, size.height);

//設(shè)置保存圖片的大小

parameters.setPictureSize(size.width, size.height);

}

//自動(dòng)對(duì)焦

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

parameters.setPreviewFrameRate(20);

//設(shè)置相機(jī)預(yù)覽方向

mCamera.setDisplayOrientation(90);

mCamera.setParameters(parameters);

try {

mCamera.setPreviewDisplay(mHolder);

} catch (Exception e) {

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

}

mCamera.startPreview();

}

private void stopPreview() {

//釋放Camera對(duì)象

if (mCamera != null) {

try {

mCamera.setPreviewDisplay(null);

mCamera.stopPreview();

mCamera.release();

mCamera = null;

} catch (Exception e) {

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

}

}

}

private Camera.Size getBestPreviewSize(int width, int height,

Camera.Parameters parameters) {

Camera.Size result = null;

for (Camera.Size size : parameters.getSupportedPreviewSizes()) {

if (size.width <= width && size.height <= height) {

if (result == null) {

result = size;

} else {

int resultArea = result.width * result.height;

int newArea = size.width * size.height;

if (newArea > resultArea) {

result = size;

}

}

}

}

return result;

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.start:

if (!mIsTimerRunning) {

mIsTimerRunning = true;

mHandler.post(timerRunnable);

}

break;

}

}

private Runnable timerRunnable = new Runnable() {

@Override

public void run() {

if (mCurrentTimer > 0) {

mTvCountDown.setText(mCurrentTimer + "");

mCurrentTimer--;

mHandler.postDelayed(timerRunnable, 1000);

} else {

mTvCountDown.setText("");

mCamera.takePicture(null, null, null, MainActivity.this);

playSound();

mIsTimerRunning = false;

mCurrentTimer = 10;

}

}

};

@Override

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

try {

FileOutputStream fos = new FileOutputStream(new File

(Environment.getExternalStorageDirectory() + File.separator +

System.currentTimeMillis() + ".png"));

//旋轉(zhuǎn)角度,保證保存的圖片方向是對(duì)的

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

Matrix matrix = new Matrix();

matrix.setRotate(90);

bitmap = Bitmap.createBitmap(bitmap, 0, 0,

bitmap.getWidth(), bitmap.getHeight(), matrix, true);

bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

fos.flush();

fos.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

mCamera.startPreview();

}

/**

* 播放系統(tǒng)拍照聲音

*/

public void playSound() {

MediaPlayer mediaPlayer = null;

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

int volume = audioManager.getStreamVolume( AudioManager.STREAM_NOTIFICATION);

if (volume != 0) {

if (mediaPlayer == null)

mediaPlayer = MediaPlayer.create(this,

Uri.parse("file:///system/media/audio/ui/camera_click.ogg"));

if (mediaPlayer != null) {

mediaPlayer.start();

}

}

}

}

有兩點(diǎn)需要注意:對(duì)于Camera來(lái)說(shuō),默認(rèn)是橫屏的,所以預(yù)覽的時(shí)候和圖片保存的時(shí)候都是橫屏的,需要調(diào)整角度。

設(shè)置相機(jī)預(yù)覽方法:

//設(shè)置相機(jī)預(yù)覽方向

mCamera.setDisplayOrientation(90);

保存圖片的時(shí)候調(diào)整角度:

效果圖如下:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的android 实现自动拍照,Android自定义相机实现定时拍照功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。