安卓核心技术高级——Camera、音频录制与Vitamio框架

Camera

Android框架中包含了各种相机和相机功能的支持,使你可以在你的应用中捕获图像中和图片

支持通过Camera API或Camera intent来抓取图像和视频:

  • Camera  此类事控制设备相机的主要API,此类用于在创建相机应用时获取图片和视频
  • SurfaceView  此类为用户提供camera的实时图像预览
  • MediaRecorder 此类用于从camera录制视频
  • Intent  一个MediaStore.ACTUIN_IMAGE_CAPTURE或MediaStore.ACTION_VIDIO_CAPTURE的intent,可以使用它来抓取图像或视频,而不用操作Camera对象。

需要权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera2" android:required="false"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

使用现有的相机应用

一个不用写代码来获取图片和视频的快速方法是使用intent来调用现有的Androidcamera 应用.一个cameraintent调用现存的相机应用抓取图片或视频剪辑然后返回的你的应用。

调用一个相机intent,主要有以下步骤

  • 组建一个相机Intent– 创建一个请求图片或视频的Intent,使用以下intent类型中的一个:MediaStore.ACTION_IMAGE_CAPTURE- 从已存在的相机应用中请求一个图片。MediaStore.ACTION_VIDEO_CAPTURE- 从已存在的相机应用中请求一个视频。

  • 启动这个相机Intent-使用startActivityForResult()方法来执行相机intent.在你启动intent后,相机应用的界面会出现在设备屏幕上,然后用户就可以用它来获取图片或视频。

  • 接收Intent结果-在你的应用中设置一个onActivityResult()方法来接收从相机intent来的回调和数据.当用户获取了一个图或视频之后(或取消了操作),系统就会调用此方法。

Android 7.0开始,应用私有目录的访问权限被限制,所以使用相机相册功能,必须在onCreat()方法中加上

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            builder.detectFileUriExposure();
        }

参考详见https://blog.csdn.net/u011489043/article/details/86721895

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private static final int MEDIA_TYPE_IMAGE = 1;
    private static final int MEDIA_TYPE_VIDEO = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            builder.detectFileUriExposure();
        }
    }

    public void imageCapture(View view) {
        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,getOutputMediaFileUri(MEDIA_TYPE_IMAGE));
        startActivityForResult(intent,MEDIA_TYPE_IMAGE);
    }

    public void videoCapture(View view) {
        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,getOutputMediaFileUri(MEDIA_TYPE_VIDEO));
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
        startActivityForResult(intent,MEDIA_TYPE_VIDEO);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode){
            case RESULT_OK:
                if (MEDIA_TYPE_IMAGE==requestCode){
                    System.out.println(file);
                }else if (MEDIA_TYPE_VIDEO==requestCode){
                    System.out.println(file);
                    System.out.println(data.getData());
                }
                break;
        }
    }

    File file = null;
    private Uri getOutputMediaFileUri(int type){
        file = getOutputMediaFile(type);
        return Uri.fromFile(file);
    }

    private File getOutputMediaFile(int type){
        File file = null;
        String rootPath = null;
        switch (type){
            case MEDIA_TYPE_IMAGE:
                rootPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
                file = new File(rootPath+File.separator+System.currentTimeMillis()+".jpg");
                break;
            case MEDIA_TYPE_VIDEO:
                rootPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getPath();
                file = new File(rootPath+File.separator+System.currentTimeMillis()+".mp4");
                break;
        }

        return file;
    }
}

 

音频录制

android.media.MediaRecorder类用于音频的录制,步骤如下

  1. 创建android.media.MediaRecorder实例
  2. 设置音频 MediaRecorder.setAudioSource(),通常可以是MediaRecorder.AudioSource.MIC
  3. 设置输出文件格式,MediaRecorder.setOutputFormat()
  4. 设置输出文件,MediaRecorder.setOutputFile()
  5. 设置使用音频编码器 MediaRecorder.setAudioEncoder()
  6. 调用MediaRecorder.prepare() 
  7. 调用 MediaRecorder.start()开始录制
  8. 调用MediaRecorder.stop()停止录制
  9. 完成或结束录制调用 MediaRecorder.release()来释放资源。

权限:

< uses-permission android:name="android.permission.RECORD_AUDIO"/>

< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

import android.content.Intent;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements MediaRecorder.OnErrorListener{

    private MediaRecorder mr;
    private boolean prepared = true;
    private Button btn_start,btn_stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_start =(Button)findViewById(R.id.button_start);
        btn_stop =(Button)findViewById(R.id.button_stop);
        mr = new MediaRecorder();
        init();
    }

    private void init() {
        mr.reset();
        mr.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音源
        mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+file.separator+System.currentTimeMillis()+".mp3";
        mr.setOutputFile(path);
        try {
            mr.prepare();
            prepared = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        btn_stop.setEnabled(false);
    }

    public void startRecorder(View view) {
        if (prepared){
            mr.start();
            prepared = false;
            btn_stop.setEnabled(true);
            btn_start.setEnabled(false);
        }
    }

    public void stopRecorder(View view) {
        mr.stop();
        btn_stop.setEnabled(false);
        btn_start.setEnabled(true);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mr!=null){
            mr.release();
        }
    }

    @Override
    public void onError(MediaRecorder mr, int what, int extra) {
        mr.reset();
    }

}

Vitamio 

Vitamio是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。

安装参考:https://blog.csdn.net/sage_wang/article/details/51493439

权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

播放音频 

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.IOException;

import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;

public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {

    private MediaPlayer mediaPlayer;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载SO类库
        Vitamio.isInitialized(this);
        setContentView(R.layout.activity_main);
        mediaPlayer = new MediaPlayer(this);
    }

    public void play(View view) {
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+"/z1.mp3";
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(path);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaPlayer.start();
    }

    public void pause(View view) {
        mediaPlayer.pause();
    }

    public void stop(View view) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
}

播放视频

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import io.vov.vitamio.Vitamio;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;

public class MainActivity2 extends AppCompatActivity {

    private VideoView vv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Vitamio.isInitialized(this);
        setContentView(R.layout.activity_main2);
        vv = (VideoView)findViewById(R.id.videoView);
        MediaController mc = new MediaController(this);
        vv.setMediaController(mc);

        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+"/d1.mp4";
        vv.setVideoPath(path);
        vv.requestFocus();
        vv.start();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值