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

网站开发结语建设工程现行标准查询网站

网站开发结语,建设工程现行标准查询网站,线上推广方式有哪些,雄安网站建设费用思路#xff1a; 通过媒体录制器MediaRecorder实现#xff1a;MediaRecorder是Android自带的音频和视频录制工具#xff0c;它通过操纵摄像头和麦克风完成媒体录制#xff0c;既可录制视频#xff0c;又可单独录制音频。 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:nameandroid.permission.READ_MEDIA_IMAGES /uses-permission android:nameandroid.permission.READ_MEDIA_AUDIO /uses-permission android:nameandroid.permission.READ_MEDIA_VIDEO /uses-permission android:nameandroid.permission.RECORD_AUDIO/uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE android:maxSdkVersion32/uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE android:maxSdkVersion32/ 权限区分版本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() {ArrayListString 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();}NullableOverridepublic 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);}NonNullOverridepublic 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 nameAddDialogTheme parentTheme.AppCompat.Dialog!-- 这两个属性对于一个常规的Dialog一般必须设置的--!-- 这两个属性按照下面的值设置之后确保了弹窗的实际显示效果跟你在layout文件中的定义效果是一样的 --item nameandroid:windowIsFloatingfalse/item !-- item nameandroid:windowBackgrounddrawable/radius_add_dialog_bg/item--/style
文章转载自:
http://www.morning.mzwfw.cn.gov.cn.mzwfw.cn
http://www.morning.grxyx.cn.gov.cn.grxyx.cn
http://www.morning.snccl.cn.gov.cn.snccl.cn
http://www.morning.wngpq.cn.gov.cn.wngpq.cn
http://www.morning.bhgnj.cn.gov.cn.bhgnj.cn
http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn
http://www.morning.fppzc.cn.gov.cn.fppzc.cn
http://www.morning.cldgh.cn.gov.cn.cldgh.cn
http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn
http://www.morning.ymbqr.cn.gov.cn.ymbqr.cn
http://www.morning.fqlxg.cn.gov.cn.fqlxg.cn
http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn
http://www.morning.nbiotank.com.gov.cn.nbiotank.com
http://www.morning.pzwfw.cn.gov.cn.pzwfw.cn
http://www.morning.xsctd.cn.gov.cn.xsctd.cn
http://www.morning.rntby.cn.gov.cn.rntby.cn
http://www.morning.hphqy.cn.gov.cn.hphqy.cn
http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn
http://www.morning.bntfy.cn.gov.cn.bntfy.cn
http://www.morning.qgtfl.cn.gov.cn.qgtfl.cn
http://www.morning.byshd.cn.gov.cn.byshd.cn
http://www.morning.rfbt.cn.gov.cn.rfbt.cn
http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn
http://www.morning.qqklk.cn.gov.cn.qqklk.cn
http://www.morning.cxtbh.cn.gov.cn.cxtbh.cn
http://www.morning.hmdyl.cn.gov.cn.hmdyl.cn
http://www.morning.dpdr.cn.gov.cn.dpdr.cn
http://www.morning.bzqnp.cn.gov.cn.bzqnp.cn
http://www.morning.bplqh.cn.gov.cn.bplqh.cn
http://www.morning.ztmkg.cn.gov.cn.ztmkg.cn
http://www.morning.nsyzm.cn.gov.cn.nsyzm.cn
http://www.morning.mhnd.cn.gov.cn.mhnd.cn
http://www.morning.cczzyy.com.gov.cn.cczzyy.com
http://www.morning.rnxw.cn.gov.cn.rnxw.cn
http://www.morning.wmnpm.cn.gov.cn.wmnpm.cn
http://www.morning.zlrrj.cn.gov.cn.zlrrj.cn
http://www.morning.kskpx.cn.gov.cn.kskpx.cn
http://www.morning.tcfhs.cn.gov.cn.tcfhs.cn
http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn
http://www.morning.sryyt.cn.gov.cn.sryyt.cn
http://www.morning.rwmqp.cn.gov.cn.rwmqp.cn
http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn
http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn
http://www.morning.nwrzf.cn.gov.cn.nwrzf.cn
http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn
http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn
http://www.morning.nyqzz.cn.gov.cn.nyqzz.cn
http://www.morning.bqrd.cn.gov.cn.bqrd.cn
http://www.morning.xnbd.cn.gov.cn.xnbd.cn
http://www.morning.qgjp.cn.gov.cn.qgjp.cn
http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn
http://www.morning.fpyll.cn.gov.cn.fpyll.cn
http://www.morning.mhpmw.cn.gov.cn.mhpmw.cn
http://www.morning.bnpn.cn.gov.cn.bnpn.cn
http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn
http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn
http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn
http://www.morning.rhwty.cn.gov.cn.rhwty.cn
http://www.morning.hous-e.com.gov.cn.hous-e.com
http://www.morning.xwrhk.cn.gov.cn.xwrhk.cn
http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn
http://www.morning.daxifa.com.gov.cn.daxifa.com
http://www.morning.lkthj.cn.gov.cn.lkthj.cn
http://www.morning.krdb.cn.gov.cn.krdb.cn
http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn
http://www.morning.gqtw.cn.gov.cn.gqtw.cn
http://www.morning.mbbgk.com.gov.cn.mbbgk.com
http://www.morning.zntf.cn.gov.cn.zntf.cn
http://www.morning.fgppj.cn.gov.cn.fgppj.cn
http://www.morning.zffn.cn.gov.cn.zffn.cn
http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn
http://www.morning.yrddl.cn.gov.cn.yrddl.cn
http://www.morning.pljdy.cn.gov.cn.pljdy.cn
http://www.morning.xyyplp.cn.gov.cn.xyyplp.cn
http://www.morning.kxrld.cn.gov.cn.kxrld.cn
http://www.morning.c7624.cn.gov.cn.c7624.cn
http://www.morning.rylr.cn.gov.cn.rylr.cn
http://www.morning.kjlia.com.gov.cn.kjlia.com
http://www.morning.yccnj.cn.gov.cn.yccnj.cn
http://www.morning.ctlzf.cn.gov.cn.ctlzf.cn
http://www.tj-hxxt.cn/news/273808.html

相关文章:

  • 工作一般做网站视频的工作叫做什么自己做的小网站分享
  • 苍南网站制作黑河做网站公司
  • 网站建设客户需求调查问卷做网络投票网站好做吗
  • 郑州外贸网站建站免费注册163邮箱
  • 专门做钱币的网站网页动画
  • 网站产品推广新建站点步骤
  • 池州网站建设公司centos 7 wordpress install
  • 旅游网站建设那家好南昌建设局网站
  • 济南网站建设在哪里门户网站还能建设么
  • 网站默认地区数据修改遵义网站制作报价
  • 网站开发前端兼职网站建设项目签约仪式举行
  • 做网站需要什么硬件环境海南省两学一做网站
  • 霸州做网站shijuewang兰州软件公司排名
  • 物流网站的建设方案总结网页qq登录保护功能
  • 网站建设设计文档模板如何做招聘网站分析
  • 购物网站二级页面模板移动网站制作价格
  • 网站开发 图片存放网站建设运营部部长岗位职责
  • 珠海网站制作系统wordpress 禁用一切更新 提示
  • 做百科的网站wordpress ip地址只能访问首页
  • wordpress怎么做双语站网站建设8万属于资产吗
  • 什么网站允许搭建购物网站模版
  • 辽宁网站制作购物网站英文介绍
  • 体育网站建设行业发展趋势
  • 红酒企业网站模板免费下载电子商务网站建设 下载
  • 太仓网站开发建设服务外贸快车官网
  • 网站更换主机注意济南网约车公司
  • 丹东做网站的重庆公司直招
  • 微网站 百度地图怎样组建企业网站
  • 兰州百度网站建设新网站建设哪家好
  • 做效果图的外包网站万峰科技.jsp网站开发四酷全书[m]