Android圖片上倒計時,Android自定義照相機倒計時拍照

自定義拍照會用到SurfaceView控件顯示照片的預覽區域,以下是布局文件:

兩個TextView是用來顯示提示信息和倒計時的秒數的

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#266194"

android:orientation="vertical"

tools:context=".TestActivity" >

android:id="@+id/surfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_centerInParent="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:orientation="vertical" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="請調整位置到此區域"

android:textColor="#ff0000"

android:textSize="32sp" />

android:id="@+id/tv_time"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingTop="10dp"

android:gravity="center_horizontal"

android:textColor="#266194"

android:textSize="32sp" />

接下來是mainActivity中的具體實現以及詳細注釋:

package com.dhsr.pujiejia.ui;

import java.io.File;

import java.io.FileOutputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.res.Configuration;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.hardware.Camera.CameraInfo;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;

import android.view.WindowManager;

import android.widget.TextView;

import com.example.pujiejiaapp.R;

@SuppressLint({ "NewApi", "SdCardPath" })

public class CameraActivity extends Activity implements Runnable {

// 預覽圖片范圍

private SurfaceView surfaceView;

private TextView tv_time;

// 倒計時拍攝

private int cameratime = 4;

private Camera camera;

private boolean preview = false;

// 文件名字

private String filename;

// 文件名字的帶的時間戳

private String timeString;

// 格式化時間

private SimpleDateFormat dateFormat;

// 日期對象

private Date date;

// 控制線程

boolean stopThread = false;

private File file;

String photo;

private Handler mHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

int what = msg.what;

switch (what) {

case 222:

tv_time.setText("" + cameratime);

if ("0".equals(tv_time.getText().toString())) {

tv_time.setText("拍攝成功!");

takePhoto();

}

break;

}

};

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

CameraActivity.this.setFinishOnTouchOutside(false);

// 初始化數據

findView();

surfaceView.getHolder().addCallback(new SufaceListener());

/* 下面設置Surface不維護自己的緩沖區,而是等待屏幕的渲染引擎將內容推送到用戶面前 */

surfaceView.getHolder()

.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView.getHolder().setFixedSize(200, 200); // 設置分辨率

}

@Override

protected void onStart() {

// TODO Auto-generated method stub

super.onStart();

// 開啟線程

new Thread(this).start();

}

private final class SufaceListener implements SurfaceHolder.Callback {

/**

* surface改變

*/

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

}

/**

* surface創建

*/

@Override

public void surfaceCreated(SurfaceHolder holder) {

try {

for (int i = 0; i < Camera.getNumberOfCameras(); i++) {

CameraInfo info = new CameraInfo();

Camera.getCameraInfo(i, info);

// 調用系統的前置攝像頭

if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {

camera = Camera.open(i);

}

}

Camera.Parameters parameters = camera.getParameters();

/* 每秒從攝像頭捕獲5幀畫面, */

parameters.setPreviewFrameRate(5);

/* 設置照片的輸出格式:jpg */

parameters.setPictureFormat(PixelFormat.JPEG);

/* 照片質量 */

parameters.set("jpeg-quality", 85);

WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

camera.setParameters(parameters);

camera.setPreviewDisplay(surfaceView.getHolder());// 通過SurfaceView顯示取景畫面

camera.startPreview();

preview = true;

} catch (Exception e) {

}

}

/**

* surface銷毀

*/

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

if (camera != null) {

if (preview)

camera.stopPreview();

camera.release();

camera = null;

}

}

}

/**

* 拍攝照片

*/

private void takePhoto() {

// 執行拍照效果

camera.takePicture(null, null, new Camera.PictureCallback() {

@Override

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

try {

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,

data.length);

timeString = formatDate();

//保存到data/data目錄自定義文件夾下

filename = "/data/data/com.example.pujiejiaapp/images/"

+ timeString + ".jpg";

File file = new File(filename);

boolean createNewFile = file.createNewFile()

System.out.println("創建文件夾成功沒有" + createNewFile);

System.out.println(file);

FileOutputStream outStream = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);

outStream.flush();

outStream.close();

// 重新瀏覽

camera.stopPreview();

camera.startPreview();

preview = true;

} catch (Exception e) {

e.printStackTrace();

} finally {

}

}

});

}

@Override

public void run() {

while (!stopThread) {

try {

//按秒數倒計時

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

cameratime--;

mHandler.sendEmptyMessage(222);

if (cameratime <= 0) {

break;

}

}

}

// 初始化數據

private void findView() {

surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);

tv_time = (TextView) findViewById(R.id.tv_time);

}

// 格式化系統的時間

public String formatDate() {

date = new Date(System.currentTimeMillis());

// 日期格式

dateFormat = new SimpleDateFormat("'IMG'_yyyyMMddHHmmss");

return dateFormat.format(date);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

// 線程已關閉

super.onDestroy();

stopThread = true;

}

}

核心代碼詳解:

1.創建SurfaceView時,surfaceCreated()方法中

for (int i = 0; i < Camera.getNumberOfCameras(); i++) {

CameraInfo info = new CameraInfo();

Camera.getCameraInfo(i, info);

// 調用系統的前置攝像頭

if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {

camera = Camera.open(i);

}

}

此部分代碼為打開相機時默認打開前置攝像頭CameraInfo.CAMERA_FACING_BACK為默認打開后置攝像頭,CameraInfo.CAMERA_FACING_FRONT前置攝像頭

2.照片拍攝takePhoto()方法中:

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,

data.length);

timeString = formatDate();

filename = "/data/data/com.example.pujiejiaapp/images/"

+ timeString + ".jpg";

photo = timeString + ".jpg";

File file = new File(filename);

boolean createNewFile = file.createNewFile();

FileOutputStream outStream = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outStream);

此部分代碼為將拍攝到的圖片保存為以bitmap格式保存在指定的目錄下

3.開子線程用于倒計時拍攝

public void run() {

while (!stopThread) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

cameratime--;

mHandler.sendEmptyMessage(222);

if (cameratime <= 0) {

break;

}

}

}

希望大家理解核心代碼的詳細注釋,歡迎提供意見,希望能給大家帶來幫助,謝謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【經典回放】多種語言系列數據結構算法:樹(C#、JavaScript、VB6版)

目 錄 一、樹的C#語言實現以及顯示 二、樹的JavaScript語言實現以及顯示 三、樹的VB6語言實現以及顯示 一、樹的C#語言實現以及顯示 1

『技術群里聊些啥』查看 dotnet 源碼,用它!用它!用它!

前言有網友在交流群中詢問&#xff0c;怎么找到 System.Linq 源碼的庫&#xff1a;其實&#xff0c;我一直使用http://source.dot.net查看 dotnet 源碼&#xff0c;這可是David Fowler&#xff08;微軟 .NET 架構師&#xff09;也推薦的&#xff1a;功能演示那它到底有哪些功能…

Android之解決PC瀏覽器上傳表單文件到手機服務器read數據錯誤導致有時候下載到手機的文件打開文字錯亂問題

1 、問題 手機客戶端app通過java socket寫了一個服務器,然后PC端通過瀏覽器訪問服務端顯示上傳頁面(這些資源都在手機端),然后其中有一個功能是PC端上傳文件到手機服務器,然后把這個文件下載到手機本地,但是我有時候PC上傳的文件打文字會錯亂。 2、http的表單文件上傳文…

javadoc注釋規范

javadoc注釋規范 javadoc做注釋 一. Java 文檔 // 注釋一行 /* ...... */ 注釋若干行 /** ...... */ 注釋若干行&#xff0c;并寫入 javadoc 文檔 通常這種注釋的多行寫法如下&#xff1a; /** * ......... * ......... */ javadoc -d 文檔存放目錄 -author -version 源文件名.…

(7)3分鐘搞定 C# 邏輯運算

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【經典回放】多種語言系列數據結構算法:二叉樹(C#版)

實驗任務描述 1 用C#語言完成二叉樹的類、并構造出一個二叉樹; 2 用遞歸方法完成二叉樹的遍歷; 3 泛型的二叉樹遍歷之一、用隊列給出遍歷結果 4 泛型的二叉樹遍歷之二、委托方式給出二叉樹遍歷結果 1 二叉樹類的設計 同C語言一樣,要構建一個二叉樹,要用到類似struct的東西…

ThinkPHP講解(十二)——文本編輯器和ajax傳址

一、文本編輯器 1.首先&#xff0c;在網上下載ueditor文件 2.在要添加文本編輯器的頁面中引用ueditor文件中的js文件 <script type"text/javascript" charset"utf-8" src"../ueditor/utf8-php/ueditor.config.js"></script> <scr…

(8)小白又如何?3分鐘搞定一個 C# 知識點

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

Android之解決PC端上傳http表單格式文件手機解析文件名亂碼問題和PC瀏覽器下載文件的文件名顯示亂碼問題

1 問題 問題1、 手機寫socket作為服務器,PC瀏覽器上傳http表單格式文件,然后手機端解析攜帶中文的文件名我解析是亂碼。 問題2、 手機寫了socket作為服務器,PC瀏覽器下載文件,但是瀏覽器里面的文件名有中文的時候會有亂碼。 2 分析 問題1分析 User-Agent: PostmanRun…

華為鴻蒙vogtloop30pro價格,華為Mate30系列基本確認:首發麒麟985+鴻蒙系統,價格感人!...

原標題&#xff1a;華為Mate30系列基本確認&#xff1a;首發麒麟985鴻蒙系統&#xff0c;價格感人&#xff01;轉眼間即將步入6月份&#xff0c;近期關于各大廠商下半年的新機消息也是多了起來&#xff0c;就拿華為下半年的高端旗艦華為Mate30系列來說&#xff0c;在各方媒體的…

[不一樣的依賴注入]容器與服務周期的結合

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.Net日常開發技巧&#xff0c;如需源碼請后臺留言 源碼;如果覺得本公眾號對您有幫助&#xff0c;歡迎關注前文回顧[不一樣的依賴注入]通過遞歸實現容器里依賴注入不一樣的依賴注入 創建周期的加入首先創建一個依賴提供類&#…

(11)python里面while到底有多少知識點

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【經典回放】多種語言系列數據結構算法:二叉樹(JavaScript版)

1 二叉樹類的設計以及二叉樹遍歷 要完成二叉樹的類設計&#xff0c;最好把鏈表下的Node.js復制過來&#xff0c;相比鏈表的結點&#xff0c;二叉樹僅僅是多了一個結點指針而已。略加修改后&#xff0c;就是&#xff1a; function TNODE(DATA) { this.DataDATA; this.lChildnu…

Fiddler之解決https鏈接返回數據顯示亂碼問題

1 、問題 我網頁訪問淘寶&#xff0c;然后F12查看關鍵鏈接&#xff0c;返回的數據里面有json各式的數據&#xff0c;然后我通過關鍵字在Fiddler里面找到鏈接&#xff0c;然后查看返回的內容是亂碼。 2 、解決辦法 然后這樣設置&#xff0c;再去查看SyntaxView或者Raw都可以看到…

android上傳圖片被旋轉,input上傳照片旋轉解決辦法

需求很簡單&#xff1a;h5拍照上傳照片&#xff0c;然后顯示出來問題在&#xff1a;上傳之后的圖片在PC&#xff0c;IOS端均能正常顯示&#xff0c;Android端顯示的則是被旋轉90度的。直接上代碼下面這個方法傳入file對象&#xff0c;然后會去除掉照片中的exIf信息&#xff0c;…

(12)python 的列表我從沒想過會那么好用

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

如何優雅的跨 Namespace 同步 Secret 和 ConfigMap?

Secret 和 ConfigMap 資源對象是命名空間級別的。它們只能被同一命名空間中的 Pod 引用。所以有時候不得不手動為每個命名空間創建它們。但有很多場景&#xff0c;我們想讓它們是全局的&#xff0c;至少可以是跨命名空間共享的 Secret 和 ConfigMap&#xff0c;例如這些場景&am…

定量遙感:計算地方時和太陽高度角(C++代碼)

在定量遙感中,通常需要計算地方時和太陽高度角,本文采用C++語言實現。 #include <cmath> #include <iostream> #include <fstream> using namespace std; void main() {int JD,NF,Y,R,s[5],F[5];float JF,WD;float N0;ifstream data1("d:\\result\\da…

html5 語義化標簽

html5 語義化標簽 在HTML 5出來之前&#xff0c;我們用div來表示頁面章節&#xff0c;但是這些div都沒有實際意義。&#xff08;即使我們用css樣式的id和class形容這塊內容的意義&#xff09;。這些標簽只是我們提供給瀏覽器的指令&#xff0c;只是定義一個網頁的某些部分。但…

Android之實現首尾帶圓角的多顏色水平條

1 效果圖 3 代碼實現 這里我們采用PercentRelativeLayout布局,首尾我們用半圓shape實現,代碼如下 color.xml <color name="progress_first">#1ebBd5</color><color name="progress_second">#f36f53</color><color name=&…