Android實現(xiàn)拍照和錄制視頻功能
本文實例為大家分享了Android實現(xiàn)拍照和錄制視頻功能的具體代碼,供大家參考,具體內(nèi)容如下
文檔中的Camera
要使用Camera,首先我們先看一下文檔中是怎么介紹的。相對于其他絕大多數(shù)類,文檔對Camera的介紹還是比較詳盡的,包含了使用過程中所需要的步驟說明,當(dāng)然,這也表明了它在實際使用中的繁瑣。
首先,需要在AndroidManifest.xml中聲明以下權(quán)限和特性:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
然后,拍照的話,需要以下十步:
1. 通過open(int)方法得到一個實例
2. 通過getParameters()方法得到默認(rèn)的設(shè)置
3. 如果有必要,修改上面所返回的Camera.Parameters對象,并調(diào)用setParameters(Camera.Parameters) 進(jìn)行設(shè)置
4. 如果有需要,調(diào)用setDisplayOrientation(int)設(shè)置顯示的方向
5. 這一步很重要,通過setPreviewDisplay(SurfaceHolder)傳入一個已經(jīng)初始化了的SurfaceHolder,否則無法進(jìn)行預(yù)覽。
6. 這一步也很重要,通過startPreview()開始更新你的預(yù)覽界面,在你拍照之前,它必須開始。
7. 調(diào)用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)進(jìn)行拍照,等待它的回調(diào)
8. 拍照之后,預(yù)覽的展示會停止。如果想繼續(xù)拍照,需要先再調(diào)用startPreview()。
9. 調(diào)用stopPreview()停止預(yù)覽。
10. 非常重要,調(diào)用release()釋放Camera,以使其他應(yīng)用也能夠使用相機(jī)。你的應(yīng)用應(yīng)該在onPause()被調(diào)用時就進(jìn)行釋放,在onResume()時再重新open()。
上面就是文檔中關(guān)于使用Camera進(jìn)行拍照的介紹了。接下來說一下我的使用場景。
直接上代碼好咯
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
>
<SurfaceView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/sv_main_surface"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="takePhoto"
android:text="拍照"
/>
</LinearLayout>
Activity
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private SurfaceView sv_main_surface;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sv_main_surface = (SurfaceView) findViewById(R.id.sv_main_surface);
sv_main_surface.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//打開照相機(jī)
camera = Camera.open();
//設(shè)置參數(shù)
Camera.Parameters parameters=camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.set("jpeg-quality",85);
camera.setParameters(parameters);
//將畫面展示到SurfaceView
try {
camera.setPreviewDisplay(sv_main_surface.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
//開啟預(yù)覽效果
camera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(camera!=null){
camera.stopPreview();
camera.release();
camera=null;
}
}
});
}
public void takePhoto(View view){
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
//技術(shù):圖片壓縮技術(shù)
Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
try {
FileOutputStream fos=new FileOutputStream("/mnt/sdcard/G150820_"+System.currentTimeMillis()+".png");
bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);
camera.stopPreview();
camera.startPreview();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
}
錄制視頻:
布局
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/sv_recorder_surface"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="開始"
android:onClick="start"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止"
android:onClick="stop"
/>
</LinearLayout>
</RelativeLayout>
代碼:
import android.media.MediaRecorder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;
import java.io.IOException;
public class MediaRecorderActivity extends AppCompatActivity {
private SurfaceView sv_recorder_surface;
private MediaRecorder mediaRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_recorder);
sv_recorder_surface = (SurfaceView) findViewById(R.id.sv_recorder_surface);
//實例化媒體錄制器
mediaRecorder = new MediaRecorder();
}
public void start(View view){
mediaRecorder.reset();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//設(shè)置格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//設(shè)置保存路徑
mediaRecorder.setOutputFile("/mnt/sdcard/G150820_"+System.currentTimeMillis()+".mp4");
mediaRecorder.setPreviewDisplay(sv_recorder_surface.getHolder().getSurface());
try {
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void stop(View view){
if(mediaRecorder!=null){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder=null;
}
}
}
最重要的是別忘了加權(quán)限哦
<!-- 打開照相機(jī)的權(quán)限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO"> </uses-permission>
簡單的拍照還錄制視頻的功能就實現(xiàn)了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android獲取網(wǎng)絡(luò)圖片并顯示的方法
這篇文章主要為大家詳細(xì)介紹了Android獲取網(wǎng)絡(luò)圖片并顯示的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
Android實現(xiàn)底部對話框BottomDialog彈出實例代碼
本篇文章主要介紹了Android實現(xiàn)底部對話框BottomDialog代碼。這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-03-03
Java4Android開發(fā)教程(三)java基本概念
本文介紹了Java4Android的基本概念,都是開發(fā)必備的基礎(chǔ)知識,希望能對大家有所幫助2014-10-10
Android Studio 視頻播放失敗 start called in state1 異常怎么解決
很多朋友問小編在使用MediaPlayer播放音頻時報出 E/MediaPlayerNative: start called in state 1, mPlayer(0x0)問題,該如何處理呢,今天小編給大家?guī)砹薃ndroid Studio 視頻播放失敗 start called in state1 異常問題,需要的朋友可以參考下2020-03-03
Flutter實現(xiàn)webview與原生組件組合滑動的示例代碼
這篇文章主要介紹了Flutter實現(xiàn)webview與原生組件組合滑動的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

