国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現拍照和錄制視頻功能

2019-10-22 18:10:25
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android實現拍照錄制視頻功能的具體代碼,供大家參考,具體內容如下

文檔中的Camera

要使用Camera,首先我們先看一下文檔中是怎么介紹的。相對于其他絕大多數類,文檔對Camera的介紹還是比較詳盡的,包含了使用過程中所需要的步驟說明,當然,這也表明了它在實際使用中的繁瑣。 
首先,需要在AndroidManifest.xml中聲明以下權限和特性:

 <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()方法得到默認的設置 
3. 如果有必要,修改上面所返回的Camera.Parameters對象,并調用setParameters(Camera.Parameters) 進行設置 
4. 如果有需要,調用setDisplayOrientation(int)設置顯示的方向 
5. 這一步很重要,通過setPreviewDisplay(SurfaceHolder)傳入一個已經初始化了的SurfaceHolder,否則無法進行預覽。 
6. 這一步也很重要,通過startPreview()開始更新你的預覽界面,在你拍照之前,它必須開始。 
7. 調用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)進行拍照,等待它的回調 
8. 拍照之后,預覽的展示會停止。如果想繼續拍照,需要先再調用startPreview()。 
9. 調用stopPreview()停止預覽。 
10. 非常重要,調用release()釋放Camera,以使其他應用也能夠使用相機。你的應用應該在onPause()被調用時就進行釋放,在onResume()時再重新open()。

上面就是文檔中關于使用Camera進行拍照的介紹了。接下來說一下我的使用場景。

直接上代碼好咯

布局:

<?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) {         //打開照相機         camera = Camera.open();         //設置參數         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();         }          //開啟預覽效果         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) {         //技術:圖片壓縮技術          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);      //設置格式     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);      mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);      //設置保存路徑     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;     }   } } 

最重要的是別忘了加權限哦

<!-- 打開照相機的權限 -->   <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> 

簡單的拍照還錄制視頻的功能就實現了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凭祥市| 饶平县| 南江县| 通江县| 高密市| 慈利县| 会昌县| 文水县| 利津县| 奇台县| 财经| 无极县| 廊坊市| 陈巴尔虎旗| 临沭县| 红安县| 闸北区| 石阡县| 三门县| 红河县| 赤壁市| 分宜县| 武定县| 延川县| 安丘市| 龙州县| 静海县| 洞口县| 中阳县| 沧州市| 五家渠市| 嘉定区| 兴安县| 泸定县| 西乌| 日照市| 扎鲁特旗| 芷江| 武穴市| 吉林省| 盐山县|