日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android音频播放器

發(fā)布時(shí)間:2023/12/18 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android音频播放器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

根據(jù)工作需要自己寫的實(shí)現(xiàn)錄音,試聽,保存及上傳的音頻播放器:

public ImageView mBtnRecord;public LinearLayout activity_record_video_send;public LinearLayout activity_record_video_paly;public LinearLayout activity_record_vedio_again;public LinearLayout activity_record_ll;public TextView mTime;public TextView activity_recording_show;public TextView activity_record_time_tv;private AnimatedRecordingView mArvView;private boolean isRecording;private boolean isStart;private int timeCount;final int TIME_COUNT = 0x101;private RecordDaoImpl mDao;//錄音文件保存路徑 private File myRecAudioDir;//合成的錄音文件 private File myFinalFile;//SDka存在 private boolean mSDCardExit;//記錄需要合成的amr音頻文件 private ArrayList<String> mTempList;//計(jì)時(shí)器 private Timer timer = null;private TimerTask timeTask = null;//暫停狀態(tài) private boolean inPause; // private String finish @Override public void recorderStart() {}@Override public void recorderStop() {}@Override public void volumeChange(float vol) {mArvView.setVolume(vol);}@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);RecorderHelper.getInstance().setRecorderListener(this);mDao = new RecordDaoImpl(this);EventBus.getDefault().register(this);// 判斷sd Card是否插入 mSDCardExit = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);mTempList = new ArrayList<String>();initView();initEvent();}private void initView() {setContentView(R.layout.activity_record_video);activity_record_video_paly = (LinearLayout) findViewById(R.id.activity_record_video_paly);activity_record_vedio_again = (LinearLayout) findViewById(R.id.activity_record_vedio_again);activity_record_ll = (LinearLayout) findViewById(R.id.activity_record_ll);mBtnRecord = (ImageView) findViewById(R.id.btn_record);activity_record_video_send = (LinearLayout) findViewById(R.id.activity_record_video_send);mTime = (TextView) findViewById(R.id.text_time);activity_recording_show = (TextView) findViewById(R.id.activity_recording_show);activity_record_time_tv = (TextView) findViewById(R.id.activity_record_time_tv);mArvView = (AnimatedRecordingView) findViewById(R.id.activity_record_wave);((TextView) findViewById(R.id.layout_daohanglan_title)).setText("錄音");}private void initEvent() {activity_record_video_send.setOnClickListener(this);mBtnRecord.setOnClickListener(this);activity_record_video_paly.setOnClickListener(this);activity_record_vedio_again.setOnClickListener(this);((ImageView) findViewById(R.id.layout_daohanglan_fanhui)).setOnClickListener(this);}@Override protected void onResume() {super.onResume();}@Override public void onClick(View v) {switch (v.getId()) {case R.id.layout_daohanglan_fanhui:finish();break;case R.id.activity_record_video_paly:if (inPause) {Intent intent = new Intent(this, TestListeningActivity.class);intent.putExtra("countTime", timeCount);startActivity(intent);} else {Toast.makeText(RecordVideoActivity.this, "請停止錄制課程之后再進(jìn)行試聽", Toast.LENGTH_SHORT).show();}break;case R.id.activity_record_vedio_again:if (isStart) {if (inPause) {recordAgain();} else {Toast.makeText(RecordVideoActivity.this, "請停止錄制課程之后再重新錄制", Toast.LENGTH_SHORT).show();}} else {Toast.makeText(RecordVideoActivity.this, "請錄音之后再試聽", Toast.LENGTH_SHORT).show();}break;case R.id.activity_record_video_send://這里寫暫停處理的 文件!加上list里面 語音合成起來 if (inPause) {//在暫停狀態(tài)按下結(jié)束鍵,處理list就可以了 PreferenceUtil.setPreferenceInt(this, "TotalRecordTime", timeCount);getInputCollection(mTempList);//還原標(biāo)志位 isStart = false;inPause = false;isRecording = false;timeCount = 0;mTime.setText("00:00");activity_recording_show.setVisibility(View.GONE);activity_record_time_tv.setVisibility(View.VISIBLE);activity_record_ll.setVisibility(View.GONE);Intent intent = new Intent(RecordVideoActivity.this, RecordCourseListActivity.class);intent.putExtra("filepath", myFinalFile.getAbsolutePath());startActivity(intent);} else {Toast.makeText(RecordVideoActivity.this, "請停止錄制課程之后再進(jìn)行上傳", Toast.LENGTH_SHORT).show();return;} // postToOss(); break;case R.id.btn_record:// TODO: 2017/9/25 0025 添加錄音邏輯的判斷及異常處理 每次錄音檢查權(quán)限 requestPermission(Manifest.permission.RECORD_AUDIO, Configuration.RECORD_AUDIO);if (isStart) {//已經(jīng)暫停過了,再次點(diǎn)擊按鈕 開始錄音,錄音狀態(tài)在錄音中 if (inPause) {RecorderHelper.getInstance().startRecord();mArvView.start();inPause = false;isRecording = true;activity_recording_show.setVisibility(View.VISIBLE);activity_recording_show.setText("麥克風(fēng)錄制中");startTime();}//正在錄音,點(diǎn)擊暫停,現(xiàn)在錄音狀態(tài)為暫停 else {//當(dāng)前正在錄音的文件名全稱 mTempList.add(RecorderHelper.getInstance().getFilePath());inPause = true;isRecording = false;mArvView.stop();stopRecord();activity_recording_show.setVisibility(View.VISIBLE);activity_recording_show.setText("錄音已暫停");stopTime(); // RecorderHelper.getInstance().cancel(); }} else {if (mTempList != null) {mTempList.clear();}if (!mSDCardExit) {Toast.makeText(RecordVideoActivity.this, "請插入SD card",Toast.LENGTH_LONG).show();return;}RecorderHelper.getInstance().startRecord();activity_recording_show.setVisibility(View.VISIBLE);activity_recording_show.setText("麥克風(fēng)錄制中");activity_record_time_tv.setVisibility(View.GONE);activity_record_ll.setVisibility(View.VISIBLE);mArvView.start();isStart = true;startTime();isRecording = true;}break;}}public void recordAgain() {DialogUtil.showDialog(this, 0, "溫馨提示", "是否確定重新錄制", "確定", "取消", new DialogUtil.DialogCallback() {@Override protected void onCancel(DialogInterface dialog) {super.onCancel(dialog);}@Override public void onOk(DialogInterface dialog) {dialog.dismiss();deleteListRecord();isStart = false;inPause = false;isRecording = false;timeCount = 0;mTime.setText("00:00");activity_recording_show.setVisibility(View.GONE);activity_record_time_tv.setVisibility(View.VISIBLE);activity_record_ll.setVisibility(View.GONE);}});}public void startTime() {if (timer == null) {timer = new Timer();}if (timeTask == null) {timeTask = new TimerTask() {public void run() {timeCount++;timeCount();}};}if (timer != null && timeTask != null) {timer.schedule(timeTask, 0, 1000);}}public void stopTime() {if (timer != null) {timer.cancel();timer = null;}if (timeTask != null) {timeTask.cancel();timeTask = null;}}/** * @return 將合并的流用字符保存 */ public void getInputCollection(ArrayList<String> list) {if (mSDCardExit) {String pathStr = FileUtil.getAudioRecordFilePath();myRecAudioDir = new File(pathStr);if (!myRecAudioDir.exists()) {myRecAudioDir.mkdirs();Log.v("錄音", "創(chuàng)建錄音文件!" + myRecAudioDir.exists());}}RecordFile filerecord = new RecordFile();String mMinute1 = getTime();// 創(chuàng)建音頻文件,合并的文件放這里 myFinalFile = new File(myRecAudioDir, mMinute1 + Contact.AMR_NB);if (!myFinalFile.exists()) {try {myFinalFile.createNewFile();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}}FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(myFinalFile);} catch (FileNotFoundException e) {e.printStackTrace();}//list里面為暫停錄音 所產(chǎn)生的 幾段錄音文件的名字,中間幾段文件的減去前面的6個(gè)字節(jié)頭文件 for (int i = 0; i < list.size(); i++) {File file = new File(list.get(i));Log.d("list的長度", list.size() + "");try {FileInputStream fileInputStream = new FileInputStream(file);byte[] myByte = new byte[fileInputStream.available()];//文件長度 int length = myByte.length;//頭文件 if (i == 0) {while (fileInputStream.read(myByte) != -1) {fileOutputStream.write(myByte, 0, length);}} else {while (fileInputStream.read(myByte) != -1) {fileOutputStream.write(myByte, 6, length - 6);}}fileOutputStream.flush();fileInputStream.close();System.out.println("合成文件長度:" + myFinalFile.length());} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}}//結(jié)束后關(guān)閉流 try {if (fileOutputStream != null) {fileOutputStream.close();}} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}filerecord.setCreateTime(mMinute1);filerecord.setShowTime(mTime.getText().toString().trim());filerecord.setFilePath(myFinalFile.getAbsolutePath());String size = FileUtil.FormetFileSize(myFinalFile.length());filerecord.setFileSize(size);filerecord.setTimeCount(timeCount);mDao.add(filerecord);//合成一個(gè)文件后,刪除之前暫停錄音所保存的零碎合成文件 deleteListRecord(); // adapter.add(file1.getName()); }private void deleteListRecord() {for (int i = 0; i < mTempList.size(); i++) {File file = new File((String) mTempList.get(i));if (file.exists()) {file.delete();}}//正在暫停后,繼續(xù)錄音的這一段音頻文件 // if (isAddLastRecord) { // myRecAudioFile.delete(); // } }private String getTime() {SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHH-mm-ss");Date curDate = new Date(System.currentTimeMillis());//獲取當(dāng)前時(shí)間 String createData = formatter.format(curDate);long data = curDate.getTime();System.out.println("當(dāng)前時(shí)間");return createData;}@Subscribe(threadMode = ThreadMode.MAIN)public void recAgain(RecordAgain event) {deleteListRecord();isStart = false;inPause = false;isRecording = false;timeCount = 0;mTime.setText("00:00");activity_recording_show.setVisibility(View.GONE);activity_record_time_tv.setVisibility(View.VISIBLE);activity_record_ll.setVisibility(View.GONE);}@Override protected void onPause() {super.onPause(); // RecorderHelper.getInstance().cancel(); }private void stopRecord() {RecorderHelper.getInstance().cancel();mArvView.stop(); // } }Runnable mLoading = new Runnable() {@Override public void run() {mArvView.stop();}};public static String FormatMiss(int miss) {String hh = miss / 3600 > 9 ? miss / 3600 + "" : "0" + miss / 3600;String mm = (miss % 3600) / 60 > 9 ? (miss % 3600) / 60 + "" : "0" + (miss % 3600) / 60;String ss = (miss % 3600) % 60 > 9 ? (miss % 3600) % 60 + "" : "0" + (miss % 3600) % 60;return hh + ":" + mm + ":" + ss;}Handler myHandler = new Handler() {@Override public void handleMessage(Message msg) {switch (msg.what) {case TIME_COUNT:int count = (int) msg.obj;Log.e("mainActivity", "count == " + count);mTime.setText(FormatMiss(count));break;}}};public void timeCount() {Message msg = Message.obtain();msg.what = TIME_COUNT;msg.obj = timeCount;myHandler.sendMessage(msg);}@Override protected void onDestroy() {super.onDestroy();myHandler.removeCallbacksAndMessages(null);stopTime();EventBus.getDefault().unregister(this);}public void requestPermission(String permission,int requestCode){PermissionUtils.REQUEST_CODE_PERMISSION = requestCode;boolean checkPermission = PermissionUtils.checkPermission(this,permission,requestCode);if (checkPermission){permissionSuccess(PermissionUtils.REQUEST_CODE_PERMISSION);}}private void permissionSuccess(int requestCode) {LogUtil.d("recordvideoactivity", "獲取權(quán)限成功=" + requestCode);}@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PermissionUtils.REQUEST_CODE_PERMISSION){if (PermissionUtils.verifyPermissions(grantResults)){permissionSuccess(PermissionUtils.REQUEST_CODE_PERMISSION);}else{permissionFail(PermissionUtils.REQUEST_CODE_PERMISSION);}}}/** * 權(quán)限獲取失敗 * * @param requestCode */ public void permissionFail(int requestCode) {LogUtil.d("recordvideoactivity", "獲取權(quán)限失敗=" + requestCode);}

錄音幫助類:

public class RecorderHelper {private static final String TAG = "RecorderHelper";String PATH;// static final int MAX_RECORDER_TIME = 3000; private int BASE = 1;private int SPACE = 20;// 間隔取樣時(shí)間 private MediaRecorder mMediaRecorder;private static volatile RecorderHelper sInst = null;onRecorderListener mListener;Handler mHandler = new Handler();public File myRecAudioFile;//錄音文件保存路徑 private File myRecAudioDir;//文件存在 private boolean mSDCardExit;public static RecorderHelper getInstance() {RecorderHelper inst = sInst;if (inst == null) {synchronized (RecorderHelper.class) {inst = sInst;if (inst == null) {inst = new RecorderHelper();sInst = inst;}}}return inst;}public RecorderHelper setPath(String path) {this.PATH = path;return this;}private RecorderHelper() {}public void startRecord() {// 判斷sd Card是否插入 mSDCardExit = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);// 取得sd card路徑作為錄音文件的位置 if (mSDCardExit) {String pathStr = FileUtil.getAudioRecordFilePath();myRecAudioDir = new File(pathStr);if (!myRecAudioDir.exists()) {myRecAudioDir.mkdirs();Log.v("錄音", "創(chuàng)建錄音文件!" + myRecAudioDir.exists());}}String mMinute1 = FileUtil.getTime();myRecAudioFile = new File(myRecAudioDir, mMinute1 + Contact.AMR_NB);if (!myRecAudioFile.exists()) {try {myRecAudioFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}try {mMediaRecorder = new MediaRecorder();// 設(shè)置錄音文件的保存位置 LogUtil.e("recoderVideoActivitypATH", myRecAudioFile.getAbsolutePath());LogUtil.e("recoderVideoActivitypATH", myRecAudioFile.getPath());// 設(shè)置錄音的來源(從哪里錄音) mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設(shè)置錄音的保存格式 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);// 設(shè)置錄音的編碼 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);mMediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath());mMediaRecorder.prepare();mMediaRecorder.start();updateMicStatus();} catch (Exception e) {e.printStackTrace();}}public void playSound() {if (!myRecAudioFile.exists()) {Toast.makeText(MyApplication.getmContext(), "無音頻文件", Toast.LENGTH_SHORT).show();return;}MediaPlayer mediaPlayer;if (myRecAudioFile.length() <= 0) {Toast.makeText(MyApplication.getmContext(), "錄音權(quán)限已被禁止,請前往設(shè)置中心添加錄音權(quán)限", Toast.LENGTH_SHORT).show();return;}try {Uri uri = Uri.fromFile(myRecAudioFile);mediaPlayer = MediaPlayer.create(MyApplication.getmContext(), uri);mediaPlayer.start();mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Override public void onCompletion(MediaPlayer mp) {Toast.makeText(MyApplication.getmContext(),"播放完成",Toast.LENGTH_SHORT).show();EventBus.getDefault().post(new PlayFinish());}});} catch (Exception e) {e.printStackTrace();}}public void stopAndRelease() {if (null != mMediaRecorder) {mMediaRecorder.stop();mMediaRecorder.release();mMediaRecorder = null;}if (myRecAudioFile.length() <= 0) {Toast.makeText(MyApplication.getmContext(), "錄音失敗,錄音權(quán)限已被禁止,請前往設(shè)置中心添加錄音權(quán)限", Toast.LENGTH_SHORT).show();return;}}public void setRecorderListener(onRecorderListener listener) {this.mListener = listener;}public void cancel() {mHandler.removeCallbacks(mUpdateMicStatusTimer, SPACE);stopAndRelease();}public String getFilePath() {if (myRecAudioFile != null && myRecAudioFile.exists()) {return myRecAudioFile.getAbsolutePath();}return "";}public interface onRecorderListener {void recorderStart();void recorderStop();void volumeChange(float vol);}private void updateMicStatus() {if (mMediaRecorder != null) {double ratio = (double) mMediaRecorder.getMaxAmplitude() / BASE;double db = 0;// 分貝 if (ratio > 1) {db = 20 * Math.log10(ratio);}if (null != mListener) {mListener.volumeChange((float) db);}mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);}}private Runnable mUpdateMicStatusTimer = new Runnable() {public void run() {updateMicStatus();}};// private Runnable mTimeOut = new Runnable() { // @Override // public void run() { // cancel(); // } // }; }

總結(jié)

以上是生活随笔為你收集整理的Android音频播放器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。