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类用于音频的录制,步骤如下
- 创建android.media.MediaRecorder实例
- 设置音频 MediaRecorder.setAudioSource(),通常可以是MediaRecorder.AudioSource.MIC
- 设置输出文件格式,MediaRecorder.setOutputFormat()
- 设置输出文件,MediaRecorder.setOutputFile()
- 设置使用音频编码器 MediaRecorder.setAudioEncoder()
- 调用MediaRecorder.prepare()
- 调用 MediaRecorder.start()开始录制
- 调用MediaRecorder.stop()停止录制
- 完成或结束录制调用 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();
}
}