package com.zzk.a1509videorecord;
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO};
File videoFile;
Uri videoUri;
Camera mCamera;
MediaRecorder mRecorder;
SurfaceView mPreview;
int cameraID = 0;
List<Size> sizes;
int curSize;
String[] sizeItems;
List<int[]> fpsRanges;
int curFpsRange;
String[] fpsRangeItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(ll);
LinearLayout line1 = new LinearLayout(this);
line1.setOrientation(LinearLayout.HORIZONTAL);
ll.addView(line1);
LinearLayout line2 = new LinearLayout(this);
line2.setOrientation(LinearLayout.HORIZONTAL);
ll.addView(line2);
LinearLayout line3 = new LinearLayout(this);
line3.setOrientation(LinearLayout.HORIZONTAL);
ll.addView(line3);
videoFile = new File(getExternalFilesDir(null), "video.3gp");
// 定义多媒体文件的uri,在应用之间传递文件时需要用uri
if(Build.VERSION.SDK_INT>=24){ // Android 7 以后不能直接用file uri分享文件,要使用FileProvider
String fileProviderAuthority = getPackageName() + ".fileProvider"; // FileProvider的名字,FileProvider在应用配置文件AndroidManifest中定义
// 格式为:content://com.zzk.a1509videorecord.fileProvider/testdir/video.3gp, testdir是res/file_paths/file_paths.xml中定义的目录别名
videoUri = FileProvider.getUriForFile(MainActivity.this, fileProviderAuthority, videoFile);
} else { // Android 7 以前可以直接用file uri分享文件
// 格式为:file:///storage/emulated/0/Android/data/com.zzk.a1509videorecord/files/video.3gp
videoUri = Uri.fromFile(videoFile);
}
mRecorder = new MediaRecorder();
Button btnRecord = new Button(this);
btnRecord.setText("Record");
line1.addView(btnRecord);
btnRecord.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) { // 下列设置的顺序不能随便调整
if(!checkPermissions(permissions, 100)) {
return;
}
startRecord();
}
});
Button btnStop = new Button(this);
btnStop.setText("Stop");
line1.addView(btnStop);
btnStop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
mRecorder.stop();
if(mCamera!=null)
mCamera.lock();
}
});
Button btnView = new Button(this);
btnView.setText("View");
line1.addView(btnView);
btnView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(videoFile.exists()){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(videoUri, "video/*");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予对方读取该文件的权限
startActivity(intent);
}
}
});
Button btnOpen = new Button(this);
btnOpen.setText("Open");
line2.addView(btnOpen);
btnOpen.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(!checkPermissions(permissions, 101)) {
return;
}
open(cameraID);
}
});
Button btnStartPreview = new Button(this);
btnStartPreview.setText("StartPre");
line2.addView(btnStartPreview);
btnStartPreview.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(mCamera!=null) {
mCamera.startPreview();
}
}
});
Button btnStopPreview = new Button(this);
btnStopPreview.setText("StopPre");
line2.addView(btnStopPreview);
btnStopPreview.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(mCamera!=null) {
mCamera.stopPreview();
}
}
});
Button btnRelease = new Button(this);
btnRelease.setText("Release");
line2.addView(btnRelease);
btnRelease.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(mCamera!=null) {
mCamera.release();
mCamera=null;
}
}
});
Button btnSwitch = new Button(this);
btnSwitch.setText("Switch Camera");
line3.addView(btnSwitch);
btnSwitch.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
cameraID++;
if(cameraID>=Camera.getNumberOfCameras()) cameraID = 0;
mCamera.stopPreview();
mCamera.release();
open(cameraID);
mCamera.startPreview();
}
});
Button btnSize = new Button(this);
btnSize.setText("Size");
line3.addView(btnSize);
btnSize.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setSingleChoiceItems(sizeItems, curSize, new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
curSize = arg1;
arg0.dismiss();
}
});
builder.show();
}
});
Button btnFps = new Button(this);
btnFps.setText("FrameRate");
line3.addView(btnFps);
btnFps.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setSingleChoiceItems(fpsRangeItems, curFpsRange, new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
curFpsRange = arg1;
arg0.dismiss();
}
});
builder.show();
}
});
mPreview = new SurfaceView(this);
ll.addView(mPreview);
}
@Override
pro
没有合适的资源?快使用搜索试试~ 我知道了~
Android多媒体功能开发-使用MediaRecorder类录制视频的例子
共113个文件
xml:71个
webp:10个
properties:7个
需积分: 0 19 下载量 91 浏览量
2023-11-16
10:12:09
上传
评论
收藏 307KB ZIP 举报
温馨提示
Android应用使用MediaRecorder类录制视频的例子代码
资源推荐
资源详情
资源评论
收起资源包目录
Android多媒体功能开发-使用MediaRecorder类录制视频的例子 (113个子文件)
gradlew.bat 3KB
executionHistory.bin 778KB
fileHashes.bin 68KB
outputFiles.bin 21KB
resourceHashesCache.bin 19KB
last-build.bin 1B
.gitignore 225B
.gitignore 50B
.gitignore 6B
build.gradle 1024B
settings.gradle 332B
build.gradle 291B
gradlew 6KB
1509VideoRecord.app.iml 9KB
1509VideoRecord.iml 923B
gradle-wrapper.jar 58KB
MainActivity.java 12KB
ExampleInstrumentedTest.java 762B
ExampleUnitTest.java 385B
executionHistory.lock 17B
buildOutputCleanup.lock 17B
checksums.lock 17B
dependencies-accessors.lock 17B
fileHashes.lock 17B
proguard-rules.pro 750B
gradle.properties 1KB
local.properties 425B
gradle-wrapper.properties 236B
cache.properties 51B
gc.properties 0B
gc.properties 0B
gc.properties 0B
ic_launcher_round.webp 8KB
ic_launcher_round.webp 6KB
ic_launcher_round.webp 4KB
ic_launcher.webp 4KB
ic_launcher_round.webp 3KB
ic_launcher.webp 3KB
ic_launcher.webp 2KB
ic_launcher_round.webp 2KB
ic_launcher.webp 1KB
ic_launcher.webp 982B
workspace.xml 6KB
ic_launcher_background.xml 5KB
ic_launcher_foreground.xml 2KB
AndroidManifest.xml 1KB
Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml 1KB
Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml 1KB
Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml 1KB
Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml 1KB
Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml 1KB
Gradle__com_google_android_material_material_1_4_0_aar.xml 1015B
Gradle__androidx_transition_transition_1_2_0_aar.xml 1013B
Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml 1013B
Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml 1004B
Gradle__androidx_activity_activity_1_2_3_aar.xml 995B
Gradle__androidx_fragment_fragment_1_3_4_aar.xml 995B
Gradle__androidx_test_monitor_1_4_0_aar.xml 981B
Gradle__androidx_test_ext_junit_1_1_3_aar.xml 978B
Gradle__androidx_test_runner_1_4_0_aar.xml 974B
Gradle__androidx_print_print_1_0_0_aar.xml 968B
Gradle__androidx_core_core_1_5_0_aar.xml 959B
Gradle__androidx_test_core_1_4_0_aar.xml 958B
Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml 944B
Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml 913B
Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml 912B
Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml 908B
Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml 904B
Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml 902B
Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml 898B
Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml 878B
Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml 877B
Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml 874B
Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml 872B
Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml 866B
Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml 858B
Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml 850B
Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml 842B
Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml 842B
themes.xml 837B
themes.xml 837B
Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml 836B
Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml 836B
Gradle__androidx_customview_customview_1_0_0_aar.xml 826B
Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml 825B
Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml 818B
Gradle__androidx_test_services_storage_1_4_0_aar.xml 814B
Gradle__androidx_cardview_cardview_1_0_0_aar.xml 810B
Gradle__androidx_loader_loader_1_0_0_aar.xml 794B
Gradle__org_hamcrest_hamcrest_integration_1_3.xml 789B
activity_main.xml 780B
gradle.xml 765B
Gradle__org_hamcrest_hamcrest_library_1_3.xml 760B
Gradle__org_hamcrest_hamcrest_core_1_3.xml 740B
Gradle__com_squareup_javawriter_2_1_1.xml 733B
Gradle__javax_inject_javax_inject_1.xml 719B
Gradle__junit_junit_4_13_2.xml 677B
Gradle__junit_junit_4_12.xml 663B
Gradle__androidx_constraintlayout_constraintlayout_2_0_4_aar.xml 658B
Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml 589B
共 113 条
- 1
- 2
资源评论
nanoage
- 粉丝: 42
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 关于mybatis的一些相关资源
- 关于mybatist的一些相关资源
- uni-app实战社区交友类app开发&带视频教程
- mybatis动态sql的一些相关资源
- 隐马尔可夫模型在期货市场的应用_曾琦裕 (1).caj
- 极域解控和极域反控!!!
- 安卓android-serialport-api 串口demo源代码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功