录制音乐
<!-- 授予该程序录制声音的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 授予该程序向外部存储器写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
public class MainActivity extends AppCompatActivity {
// 定义界面上的两个按钮
private ImageButton recordBn;
private ImageButton stopBn;
// 系统的音频文件
private File soundFile;
private MediaRecorder mRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取程序界面中的两个按钮
recordBn = findViewById(R.id.record);
stopBn = findViewById(R.id.stop);
stopBn.setEnabled(false);
requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0x123);
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 0x123 && grantResults.length == 2
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
View.OnClickListener listener = source ->
{
int sourceId = source.getId();
if (sourceId == R.id.record) {
// 创建保存录音的音频文件
soundFile = new File(String.format("%s/%s.amr", getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(), System.currentTimeMillis()));
mRecorder = new MediaRecorder();
// 设置录音的声音来源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置声音编码格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(soundFile.getAbsolutePath());
try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
// 开始录音
mRecorder.start(); // ①
recordBn.setEnabled(false);
stopBn.setEnabled(true);
} else if (sourceId == R.id.stop) {
if (soundFile != null && soundFile.exists()) {
// 停止录音
mRecorder.stop(); // ②
// 释放资源
mRecorder.release(); // ③
mRecorder = null;
recordBn.setEnabled(true);
stopBn.setEnabled(false);
}
}
};
// 为两个按钮的单击事件绑定监听器
recordBn.setOnClickListener(listener);
stopBn.setOnClickListener(listener);
}
}
@Override
public void onDestroy() {
if (soundFile != null && soundFile.exists()) {
// 停止录音
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
}
super.onDestroy();
}
}
录制视频短片
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<!-- 授予该程序录制声音的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 授予该程序使用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 授予使用外部存储器的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
public class MainActivity extends AppCompatActivity {
private ImageButton recordBn;
private ImageButton stopBn;
// 系统的视频文件
private File videoFile;
private MediaRecorder mRecorder;
// 显示视频预览的SurfaceView
private SurfaceView sView;
// 记录是否正在进行录制
private boolean isRecording;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取程序界面中的两个按钮
recordBn = findViewById(R.id.record);
stopBn = findViewById(R.id.stop);
// 让stopBn按钮不可用
stopBn.setEnabled(false);
requestPermissions(new String[]{Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0x123);
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 0x123 && grantResults.length == 3
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED
&& grantResults[2] == PackageManager.PERMISSION_GRANTED) {
View.OnClickListener listener = source ->
{
int sourceId = source.getId();
if (sourceId == R.id.record) {
// 创建保存录制视频的视频文件
videoFile = new File(String.format("%s/%s.mp4", getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(), System.currentTimeMillis()));
// 创建MediaRecorder对象
mRecorder = new MediaRecorder();
mRecorder.reset();
// 设置从麦克风采集声音
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置从摄像头采集图像
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置视频文件的输出格式
// 必须在设置声音编码格式、图像编码格式之前设置
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 设置声音编码格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 设置图像编码格式
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
// 设置视频尺寸,此处要求摄像头本身支持该尺寸,否则会在调用MediaRecorder的play方法时出现异常
// mRecorder.setVideoSize(640, 560);
mRecorder.setVideoSize(1920, 1080);
// 每秒 12帧
mRecorder.setVideoFrameRate(12);
mRecorder.setOutputFile(videoFile.getAbsolutePath());
// 指定使用SurfaceView来预览视频
mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); // ①
try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
// 开始录制
mRecorder.start();
System.out.println("---recording---");
// 让recordBn按钮不可用
recordBn.setEnabled(false);
// 让stopBn按钮可用
stopBn.setEnabled(true);
isRecording = true;
} else if (sourceId == R.id.stop) {
// 如果正在进行录制
if (isRecording) {
// 停止录制
mRecorder.stop();
// 释放资源
mRecorder.release();
mRecorder = null;
// 让recordBn按钮可用
recordBn.setEnabled(true);
// 让stopBn按钮不可用
stopBn.setEnabled(false);
}
}
};
// 为两个按钮的单击事件绑定监听器
recordBn.setOnClickListener(listener);
stopBn.setOnClickListener(listener);
// 获取程序界面中的SurfaceView
sView = findViewById(R.id.sView);
// 设置分辨率
sView.getHolder().setFixedSize(320, 280);
// 设置该组件让屏幕不会自动关闭
sView.getHolder().setKeepScreenOn(true);
}
}
}
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 显示视频预览的SurfaceView -->
<SurfaceView
android:id="@+id/sView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|bottom"
android:gravity="center_horizontal"
android:orientation="horizontal">
<ImageButton
android:id="@+id/record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/record" />
<ImageButton
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop" />
</LinearLayout>
</FrameLayout>
摘抄至《疯狂Android讲义(第4版)》