当前位置: 首页 > news >正文

网站建设的概念北京计算机培训机构前十名

网站建设的概念,北京计算机培训机构前十名,郑州做网站制作的公司,找设计师思路: 通过媒体录制器MediaRecorder实现:MediaRecorder是Android自带的音频和视频录制工具,它通过操纵摄像头和麦克风完成媒体录制,既可录制视频,又可单独录制音频。 MediaRecorder常用方法(录音与录像通用)&#xf…

思路:

通过媒体录制器MediaRecorder实现:MediaRecorder是Android自带的音频和视频录制工具,它通过操纵摄像头和麦克风完成媒体录制,既可录制视频,又可单独录制音频。

MediaRecorder常用方法(录音与录像通用):

  • reset:重置录制资源。
  • prepare:准备录制。
  • start:开始录制。
  • stop:结束录制。
  • release:释放录制资源。
  • setOnErrorListener:设置错误监听器。可监听服务器异常和未知错误的事件。需要实现接口MediaRecorder.OnErrorListener的onError方法。
  • setOnInfoListener:设置信息监听器。可监听录制结束事件,包括达到录制时长或达到录制大小。需要实现接口MediaRecorder.OnInfoListener的onInfo方法。
  • setMaxDuration:设置可录制的最大时长,单位毫秒。
  • setMaxFileSize:设置可录制的最大文件大小,单位字节。
  • setOutputFile:设置输出文件的路径。
setOutputFormat:设置媒体输出格式
OutputFormat类的输出格式格式分类扩展名格式说明
AMR_NB音频.amr窄带格式
AMR_WB音频.amr宽带格式
AAC_ADTS音频.aac高级的音频传输流格式
MPEG_4视频.mp4MPEG4格式
THREE_GPP视频.3gp3GP格式

音频录制示例,上代码

一.权限添加

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /><uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>

权限区分版本33及以上和以下

动态权限请求:

使用权限请求库,在app的build.gradle添加

// 权限请求implementation 'com.guolindev.permissionx:permissionx:1.7.1'

 使用音频抖动动效

// https://github.com/xfans/VoiceWaveView
implementation 'com.github.xfans:VoiceWaveView:1.0.2'
/*** 请求视频、音频、图片权限*/private void requestPermission() {ArrayList<String> requestList = new ArrayList<>();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {requestList.add(Manifest.permission.READ_MEDIA_IMAGES);requestList.add(Manifest.permission.RECORD_AUDIO);requestList.add(Manifest.permission.READ_MEDIA_VIDEO);} else {requestList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);requestList.add(Manifest.permission.READ_EXTERNAL_STORAGE);requestList.add(Manifest.permission.RECORD_AUDIO);}PermissionX.init(this).permissions(requestList).onExplainRequestReason((scope, deniedList) -> {scope.showRequestReasonDialog(deniedList, UiUtil.getString(R.string.toast_permission_request), UiUtil.getString(R.string.toast_permission_allow), UiUtil.getString(R.string.toast_permission_deny));}).request((allGranted, grantedList, deniedList) -> {if (allGranted) {showVoiceAddDialog();LogUtil.i(TAG, "所有申请的权限都已通过");} else {LogUtil.i(TAG, "您拒绝了如下权限:" + deniedList);}});}/*** 判断是否有存储、音频权限* @return */public boolean hasStoragePermissions() {boolean isStorage, isAudio, isVideo, isImages;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {isImages = ContextCompat.checkSelfPermission(MyApplication.getInstance(), Manifest.permission.READ_MEDIA_IMAGES)== PackageManager.PERMISSION_GRANTED;isAudio = ContextCompat.checkSelfPermission(MyApplication.getInstance(), Manifest.permission.RECORD_AUDIO)== PackageManager.PERMISSION_GRANTED;isVideo = ContextCompat.checkSelfPermission(MyApplication.getInstance(), Manifest.permission.READ_MEDIA_VIDEO)== PackageManager.PERMISSION_GRANTED;return isImages && isAudio && isVideo;} else {isStorage = ContextCompat.checkSelfPermission(MyApplication.getInstance(), Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED;isAudio = ContextCompat.checkSelfPermission(MyApplication.getInstance(), Manifest.permission.RECORD_AUDIO)== PackageManager.PERMISSION_GRANTED;return isStorage || isAudio;}}

二.录制代码

package com.calendar.master.gp.dialog;import android.app.AlertDialog;
import android.app.Dialog;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.format.DateFormat;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;import com.calendar.master.gp.R;
import com.calendar.master.gp.bean.NoteVoice;
import com.calendar.master.gp.databinding.DialogAddVoiceBinding;
import com.calendar.master.gp.databinding.DialogEmojiBinding;
import com.calendar.master.gp.fragment.EmojiFragment;
import com.calendar.master.gp.listener.IVoiceSaveListener;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.oooppqqzzz.base.utils.LogUtil;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import me.xfans.lib.voicewaveview.VoiceWaveView;/*** 描述:* 作者: shawn* 时间: 2023/4/2716:44*/
public class VoiceAddDialogFragment extends DialogFragment {private static final String TAG = "VoiceAddDialogFragment";private MediaRecorder mMediaRecorder;private String voicePath;private String outputFileName;private File fileVoice;private IVoiceSaveListener iVoiceSaveListener;private DialogAddVoiceBinding mBinding;private int recordingTime = 0; // 记录录音时长(秒)private Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {// 更新UI显示录音时长mBinding.tvVoiceTime.setText(getRecordTime(recordingTime));}};;@Overridepublic void onStart() {super.onStart();setCustomStyle();}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {if (getDialog() == null) {return super.onCreateView(inflater, container, savedInstanceState);}// 设置宽度为屏宽、靠近屏幕底部。final Window window = getDialog().getWindow();window.setBackgroundDrawableResource(R.color.transparent);window.getDecorView().setPadding(0, 0, 0, 0);WindowManager.LayoutParams wlp = window.getAttributes();wlp.gravity = Gravity.BOTTOM;wlp.width = WindowManager.LayoutParams.MATCH_PARENT;wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;window.setAttributes(wlp);return super.onCreateView(inflater, container, savedInstanceState);}@NonNull@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {// 加载布局文件mBinding = DialogAddVoiceBinding.inflate(getLayoutInflater());// 音频抖动控件VoiceWaveView voiceWaveView = mBinding.vwvVoice;voiceWaveView.setDuration(100);voiceWaveView.addHeader(12).addHeader(14).addHeader(26);voiceWaveView.addBody(27).addBody(17).addBody(38).addBody(88).addBody(38).addBody(24).addBody(8).addBody(18).addBody(48).addBody(30).addBody(60).addBody(38);voiceWaveView.addFooter(24).addFooter(14).addFooter(8);mBinding.ivClose.setOnClickListener(v -> {this.dismiss();});mBinding.ivVoiceEdit.setOnClickListener(new View.OnClickListener() {boolean isInput = true;@Overridepublic void onClick(View v) {if (isInput) {isInput = false;voiceWaveView.start();mBinding.ivVoiceEdit.setBackgroundResource(R.mipmap.icon_voice_edit_stop);getPath();startRecord();} else {isInput = true;voiceWaveView.stop();cancelRecord();// 移除定时任务handler.removeCallbacks(timerRunnable);voiceStop(true);}}});mBinding.ivVoiceCancel.setOnClickListener(v -> {voiceStop(false);fileVoice.delete();recordingTime = 0;mBinding.tvVoiceTime.setText("00:00");mBinding.ivVoiceEdit.setBackgroundResource(R.mipmap.icon_voice_edit_start);});mBinding.ivVoiceSave.setOnClickListener(v -> {NoteVoice noteVoice = new NoteVoice();noteVoice.setUrl(voicePath);noteVoice.setTime(getRecordTime(recordingTime));noteVoice.setFileName(outputFileName);if (iVoiceSaveListener != null) {iVoiceSaveListener.save(noteVoice);}dismiss();});return new AlertDialog.Builder(getActivity()).setView(mBinding.getRoot()).create();}private void showAd(int selectIndex) {}private void voiceStop(boolean isStop) {if (isStop) {mBinding.ivVoiceCancel.setVisibility(View.VISIBLE);mBinding.ivVoiceSave.setVisibility(View.VISIBLE);mBinding.ivVoiceEdit.setVisibility(View.GONE);} else {mBinding.ivVoiceCancel.setVisibility(View.GONE);mBinding.ivVoiceSave.setVisibility(View.GONE);mBinding.ivVoiceEdit.setVisibility(View.VISIBLE);}}private void setCustomStyle() {// 设置主题,这里只能通过xml方式设置主题,不能通过Java代码处理,因为这是getWindow还是null,// 而且window的几乎所有属性,都可以通过xml设置setStyle(STYLE_NORMAL, R.style.AddDialogTheme);}/*** 录制前创建一个空文件并获取路径*/private void getPath() {File appDir = new File(Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_MUSIC, "NoteToVoice");if (!appDir.exists()) {appDir.mkdirs();}outputFileName = System.currentTimeMillis() + ".amr";fileVoice = new File(appDir, outputFileName);if (!fileVoice.exists()) {try {fileVoice.createNewFile();voicePath = fileVoice.getPath();LogUtil.i("shawn", "音频保存路径:" + voicePath);} catch (IOException e) {e.printStackTrace();}}}/*** 开始录音*/private void startRecord() {// 充值录音时长recordingTime = 0;//开始录音操作mMediaRecorder = new MediaRecorder(); // 创建一个媒体录制器mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {@Overridepublic void onError(MediaRecorder mr, int what, int extra) {if (mr != null) {mr.reset(); // 重置媒体录制器}}}); // 设置媒体录制器的错误监听器mMediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {@Overridepublic void onInfo(MediaRecorder mr, int what, int extra) {// 录制达到最大时长,或者达到文件大小限制,都停止录制if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED|| what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED) {cancelRecord();}}}); // 设置媒体录制器的信息监听器mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频源为麦克风mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); // 设置媒体的输出格式mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置媒体的音频编码器// mMediaRecorder.setAudioSamplingRate(8); // 设置媒体的音频采样率。可选// mMediaRecorder.setAudioChannels(2); // 设置媒体的音频声道数。可选// mMediaRecorder.setAudioEncodingBitRate(1024); // 设置音频每秒录制的字节数。可选mMediaRecorder.setMaxDuration(10 * 1000); // 设置媒体的最大录制时长// mMediaRecorder.setMaxFileSize(1024*1024*10); // 设置媒体的最大文件大小// setMaxFileSize与setMaxDuration设置其一即可mMediaRecorder.setOutputFile(voicePath); // 设置媒体文件的保存路径try {mMediaRecorder.prepare(); // 媒体录制器准备就绪mMediaRecorder.start(); // 媒体录制器开始录制startRecordingTimer();} catch (Exception e) {LogUtil.i("shawn", "录音出错 = " + e.getMessage());e.printStackTrace();}}// 取消录制操作private void cancelRecord() {if (mMediaRecorder != null) {mMediaRecorder.setOnErrorListener(null); // 错误监听器置空mMediaRecorder.setPreviewDisplay(null); // 预览界面置空try {LogUtil.i("shawn", "结束录音");mMediaRecorder.stop(); // 媒体录制器停止录制} catch (Exception e) {LogUtil.i("shawn", "结束录音出错 = " + e.getMessage());e.printStackTrace();}mMediaRecorder.release(); // 媒体录制器释放资源mMediaRecorder = null;}}@Overridepublic void onDestroy() {super.onDestroy();// 移除定时任务handler.removeCallbacks(timerRunnable);}public void setVoiceSaveListener(IVoiceSaveListener iVoiceSaveListener) {this.iVoiceSaveListener = iVoiceSaveListener;}private void startRecordingTimer() {handler.postDelayed(timerRunnable, 1000); // 每隔一秒执行一次}private Runnable timerRunnable = new Runnable() {@Overridepublic void run() {recordingTime++;handler.sendEmptyMessage(0); // 通知UI更新startRecordingTimer(); // 继续下一次定时}};private String getRecordTime(int recordingTime) {StringBuilder stringBuilder = new StringBuilder();if (recordingTime < 10) {stringBuilder.append("00:0").append(recordingTime);} else if (recordingTime < 60) {stringBuilder.append("00:").append(recordingTime);} else {int minutes = recordingTime / 60;int seconds = recordingTime % 60;if (minutes < 10) {stringBuilder.append("0").append(minutes).append(":");} else {stringBuilder.append(minutes).append(":");}if (seconds < 10) {stringBuilder.append("0").append(seconds);} else {stringBuilder.append(seconds);}}return stringBuilder.toString();}
}

设置dialog样式,在style.xml

<!-- 这里的parent必须是Theme.AppCompat.Dialog --><style name="AddDialogTheme" parent="Theme.AppCompat.Dialog"><!-- 这两个属性对于一个常规的Dialog,一般必须设置的--><!-- 这两个属性按照下面的值设置之后,确保了弹窗的实际显示效果,跟你在layout文件中的定义效果是一样的 --><item name="android:windowIsFloating">false</item>
<!--        <item name="android:windowBackground">@drawable/radius_add_dialog_bg</item>--></style>


文章转载自:
http://dinncoriff.ssfq.cn
http://dinncokathi.ssfq.cn
http://dinncocatfall.ssfq.cn
http://dinncorss.ssfq.cn
http://dinncomusicianship.ssfq.cn
http://dinnconabam.ssfq.cn
http://dinncobiquadratic.ssfq.cn
http://dinncosilklike.ssfq.cn
http://dinncowll.ssfq.cn
http://dinncoplastochron.ssfq.cn
http://dinncosequence.ssfq.cn
http://dinncoocker.ssfq.cn
http://dinncohetman.ssfq.cn
http://dinncolimitarian.ssfq.cn
http://dinncosomnambulant.ssfq.cn
http://dinncoshitwork.ssfq.cn
http://dinncoauthoritarian.ssfq.cn
http://dinncocatskinner.ssfq.cn
http://dinncotardily.ssfq.cn
http://dinncobuttonhold.ssfq.cn
http://dinncofullery.ssfq.cn
http://dinncodeadass.ssfq.cn
http://dinncohaemocyte.ssfq.cn
http://dinncocommuter.ssfq.cn
http://dinncodipropellant.ssfq.cn
http://dinncoskeeler.ssfq.cn
http://dinncogsdi.ssfq.cn
http://dinncozoograft.ssfq.cn
http://dinncodepartmentalize.ssfq.cn
http://dinncoarabella.ssfq.cn
http://dinncoemulatory.ssfq.cn
http://dinncosyntone.ssfq.cn
http://dinncoussuri.ssfq.cn
http://dinncojampan.ssfq.cn
http://dinncoascogonium.ssfq.cn
http://dinncoroadworthiness.ssfq.cn
http://dinncosonoluminescence.ssfq.cn
http://dinncoplanirostral.ssfq.cn
http://dinncofoppish.ssfq.cn
http://dinncoamelioration.ssfq.cn
http://dinncoisc.ssfq.cn
http://dinncoseggie.ssfq.cn
http://dinncosurliness.ssfq.cn
http://dinncowhether.ssfq.cn
http://dinncobowsprit.ssfq.cn
http://dinncoclinoscope.ssfq.cn
http://dinncoshapeable.ssfq.cn
http://dinncochromatic.ssfq.cn
http://dinncovindicability.ssfq.cn
http://dinncoroil.ssfq.cn
http://dinncotooltips.ssfq.cn
http://dinncooutscore.ssfq.cn
http://dinncodesulfuration.ssfq.cn
http://dinncosmyrna.ssfq.cn
http://dinncounabbreviated.ssfq.cn
http://dinncosuedette.ssfq.cn
http://dinncoamygdule.ssfq.cn
http://dinncoambary.ssfq.cn
http://dinncounmeddled.ssfq.cn
http://dinncoantiallergic.ssfq.cn
http://dinncodinaric.ssfq.cn
http://dinncotelltale.ssfq.cn
http://dinncodilacerate.ssfq.cn
http://dinncofley.ssfq.cn
http://dinncobajra.ssfq.cn
http://dinncozugzwang.ssfq.cn
http://dinncocelaeno.ssfq.cn
http://dinncocarlist.ssfq.cn
http://dinncocrackers.ssfq.cn
http://dinnconevoid.ssfq.cn
http://dinncofootstool.ssfq.cn
http://dinncomauve.ssfq.cn
http://dinncobenthonic.ssfq.cn
http://dinncosaxhorn.ssfq.cn
http://dinnconidget.ssfq.cn
http://dinncopolychasium.ssfq.cn
http://dinncoeconomize.ssfq.cn
http://dinncotune.ssfq.cn
http://dinncoexcuria.ssfq.cn
http://dinnconetcropper.ssfq.cn
http://dinncoframeable.ssfq.cn
http://dinncobacteriochlorophyll.ssfq.cn
http://dinncoanemophily.ssfq.cn
http://dinncocontrariousness.ssfq.cn
http://dinncotelson.ssfq.cn
http://dinncodistract.ssfq.cn
http://dinncoindigirka.ssfq.cn
http://dinncoinspect.ssfq.cn
http://dinncointoneme.ssfq.cn
http://dinncoaleatorism.ssfq.cn
http://dinncocoalitionist.ssfq.cn
http://dinnconortheastern.ssfq.cn
http://dinncoglumose.ssfq.cn
http://dinncorevisory.ssfq.cn
http://dinncoupgrowth.ssfq.cn
http://dinncowander.ssfq.cn
http://dinncogazabo.ssfq.cn
http://dinncostagirite.ssfq.cn
http://dinncorighteous.ssfq.cn
http://dinncoandrogyne.ssfq.cn
http://www.dinnco.com/news/135284.html

相关文章:

  • 做美图 网站有哪些东西吗近期发生的重大新闻
  • 最专业网站建设公司冯耀宗seo视频教程
  • 网站系统建设项目百度一下马上知道
  • 邯郸网站建设品牌加盟广州网站建设系统
  • 存储网站建设网站推广在线推广
  • wordpress导航栏锚点semseo是什么意思
  • 自己电脑做网站服务器系统百度搜索推广的五大优势
  • 网站制作属于什么专业免费写文章的软件
  • asp网站开发开题报告sem百度竞价推广
  • 游戏网站开发百度app安装下载
  • 电商首页模板网站关键词seo排名怎么做的
  • 南京网站开发xuan南京乐识网站优化平台
  • 海外站推广自己做网站需要多少钱
  • 2022中央经济工作会议东营网站seo
  • 营销型网站工程百度提交网站入口网址
  • 怎么在网站上做下载企业推广视频
  • 建网站需花哪几种钱外贸推广
  • 申请域名后怎样做网站最好的bt种子搜索神器
  • 嘉鱼网站建设公司百度新闻app
  • 我帮诈骗团伙做诈骗网站获利个人网站制作
  • 乌鲁木齐市建设委员会网站保定seo推广
  • 中国银行官网西安网站关键词优化费用
  • 临沂外贸网站网页游戏推广平台
  • 唐山网站制作appseo优化外链平台
  • 企业网站建设费用会计科目莆田关键词优化报价
  • 哪里找做网站客户东莞网络科技公司排名
  • 政府网站建设工作的自查报告今日足球比赛分析推荐
  • 龙岗营销型网站建设网络推广网站排名
  • 深圳市移动端网站建设公司网站模板
  • 个人站长做什么类型的网站网络营销整合营销