国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - Android實(shí)現(xiàn)拍照和錄制視頻功能

Android實(shí)現(xiàn)拍照和錄制視頻功能

2022-02-25 15:35HuangGui971022 Android

這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照和錄制視頻功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android實(shí)現(xiàn)拍照錄制視頻功能的具體代碼,供大家參考,具體內(nèi)容如下

文檔中的Camera

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

?
1
2
3
<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)方法得到一個(gè)實(shí)例
2. 通過getParameters()方法得到默認(rèn)的設(shè)置
3. 如果有必要,修改上面所返回的Camera.Parameters對(duì)象,并調(diào)用setParameters(Camera.Parameters) 進(jìn)行設(shè)置
4. 如果有需要,調(diào)用setDisplayOrientation(int)設(shè)置顯示的方向
5. 這一步很重要,通過setPreviewDisplay(SurfaceHolder)傳入一個(gè)已經(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ù)覽的展示會(huì)停止。如果想繼續(xù)拍照,需要先再調(diào)用startPreview()。
9. 調(diào)用stopPreview()停止預(yù)覽。
10. 非常重要,調(diào)用release()釋放Camera,以使其他應(yīng)用也能夠使用相機(jī)。你的應(yīng)用應(yīng)該在onPause()被調(diào)用時(shí)就進(jìn)行釋放,在onResume()時(shí)再重新open()。

上面就是文檔中關(guān)于使用Camera進(jìn)行拍照的介紹了。接下來說一下我的使用場(chǎng)景。

直接上代碼好咯

布局:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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();
        }
 
      }
    });
  }
}

錄制視頻:

布局

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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>

代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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);
 
    //實(shí)例化媒體錄制器
    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)限哦

?
1
2
3
4
5
6
7
<!-- 打開照相機(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>

簡(jiǎn)單的拍照還錄制視頻的功能就實(shí)現(xiàn)了。

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

原文鏈接:https://blog.csdn.net/HuangGui971022/article/details/55046385

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久男人精品 | 精品在线一区二区三区 | 国产精品日韩高清伦字幕搜索 | 日韩欧美精品一区二区 | 日韩欧美视频 | 中文字幕av在线播放 | 久久亚洲精品中文字幕 | 国产亲子乱弄免费视频 | 国产福利91精品一区二区三区 | 国产免费爽爽视频在线观看 | 欧美一区二区三区免费视频 | 天堂资源 | 午夜精品久久久久久久久久久久 | 中国一级黄色片子 | 九九久久国产 | 精品久久久久久久久久久久久久 | 日日操狠狠操 | 国产香蕉视频在线播放 | 国产99精品 | 精品在线二区 | 91精品国产综合久久久久 | 极品美女销魂一区二区三区 | 成人在线观看免费爱爱 | 欧美在线视频网站 | 国产成人影院 | 国产一区二区三区四区在线观看 | 亚洲综合视频 | 黄色二区 | 久久av一区二区三区 | 成人黄色电影小说 | 午夜视频在线 | 中文字幕亚洲精品 | 午夜精品久久久久久久 | 91性高湖久久久久久久久网站 | 国产精品毛片无码 | 成人影院在线观看 | 精品亚洲一区二区 | 毛片网站大全 | 在线国产一区二区 | av在线综合网 | 一级片在线播放 |