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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

团队-手机便签-开发文档

發布時間:2025/7/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 团队-手机便签-开发文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目托管平臺地址:https://github.com/Vcandoit/Notepad.git

由于我們是團隊的開發,我們寫完直接就把代碼發給隊員了,我們有人負責的代碼的合并,所以我們直接把代碼進行合并去處理了

所以我就沒寫自己的托管平臺,我們團隊都發布在一個人的托管平臺中了。

?

?

我負責的是錄音功能木塊的開發,

首先,我先設計了一下錄音ui把需要的什么的編寫搭建完成

?

?

下面我說一下用法:

首先我們點擊按住說話,注意說話的時間要超過三秒,因為我在程序中進行了判斷,低于三秒的語音我們不進行保存,會提示你錄音失敗,

然后當你按下按住說話的按鈕后,你會發現字變成正在錄音的字,那么你就可以進行錄制了,當你錄制完成后會提示你錄音成功,多少秒。

最后點擊播放按鈕你就可以聽到你的錄音了。

?

?

開發功能實現過程:

首先我要對權限進行獲取,添加麥克風的權限,6.0以上的版本要使用程序獲得麥克風的使用權限

然后我進行錄音機的編寫,首先我要對音頻進行獲取,然后將錄取的音頻文件保存到本地的私有目錄中,然后點擊播放按鈕在從私有目錄中獲取音頻文件進行播放。

?

package com.example.apple.tuandui;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
* Created by Apple on 2017/10/25.
*/

public class RadioActivity extends AppCompatActivity {

@BindView(R.id.anjian_btn)
Button anjian_btn;

@BindView(R.id.text)
TextView text;

//多線程后臺處理
private ExecutorService mExecutorService;

private MediaRecorder mMediaRecorder;

private File mAudioFile;

private long mStartRecordTime, mStopRecordTime;

private Handler mMainThreadHandler;//主線程
//主線程和后臺播放線程數據同步
private volatile boolean mIsPlaying;

private MediaPlayer mMediaPlayer;

private ImageButton back_btn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_radio);

back_btn = (ImageButton)findViewById(R.id.fanhui);

if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED)
{
//
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECORD_AUDIO},
1);
}

ButterKnife.bind(this);
//錄音jni函數不具備線程安全性,所以調用單線程
mExecutorService = Executors.newSingleThreadExecutor();
mMainThreadHandler = new Handler(Looper.getMainLooper());

//按下說話,釋放發送所以我們不要onClickListener
anjian_btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//根據不同的touch action,執行不同的邏輯
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
startRecord();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
stopRecord();
break;
default:
break;
}
//處理了touch事件,返回true
return true;
}
});
}
//利用butterknife簡化代碼
@OnClick(R.id.play_btn)
public void play(){
//檢查當前狀態,防止重復播放
if(mAudioFile!=null&&!mIsPlaying){
//設置當前播放狀態
mIsPlaying = true;
//提交后臺任務,開始播放
mExecutorService.submit(new Runnable() {
@Override
public void run() {
doPlay(mAudioFile);

}
});
}


}


@Override
protected void onDestroy() {
super.onDestroy();

//activity銷毀時,停止后臺任務,避免內存泄漏
mExecutorService.shutdownNow();
releaseRecorder();
stopPlay();
}


/***
*
* 開始錄音
*/
private void startRecord() {
//改變UI狀態
anjian_btn.setText("正在說話");
//anjian_btn.setBackgroundResource();

//提交后臺任務,執行錄音邏輯
mExecutorService.submit(new Runnable() {
@Override
public void run() {
//釋放之前錄音的MediaRecorder
releaseRecorder();
//執行錄音邏輯,如果失敗提示用戶
if (!doStart()) {
recordFail();
}
}
});
}


/***
*
* 停止錄音
*/

private void stopRecord() {
//改變UI狀態
anjian_btn.setText("按住說話");
//anjian_btn.setBackgroundResource();
//提交后臺任務,執行停止邏輯
mExecutorService.submit(new Runnable() {
@Override
public void run() {
//執行停止錄音邏輯,失敗需要提醒用戶
if (!doStop()) {
recordFail();
}
//釋放MediaRecorder
releaseRecorder();
}
});
}


/**
* 啟動錄音邏輯
*/
private boolean doStart() {

try {
//創建MediaRecorder
mMediaRecorder = new MediaRecorder();
//創建錄音文件
//獲取絕對路徑

mAudioFile = new File(getExternalFilesDir(null).getAbsolutePath() +
"/liuming/" + System.currentTimeMillis() + ".m4a");


// mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +alStorageDirectory().getAbsolutePath() +
// "/liuming/" + System.currentTimeMillis() + ".m4a");
mAudioFile.getParentFile().mkdirs();
mAudioFile.createNewFile();

//配置MediaRecorder

//(1)//從麥克風采集
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//(2)保存文件為MP4格式
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

//(3)所有android系統都支持的采樣頻率
mMediaRecorder.setAudioSamplingRate(44100);

//通用的AAC編碼格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

//音質比較好的一個頻率
mMediaRecorder.setAudioEncodingBitRate(96000);

//設為文件保存位置
mMediaRecorder.setOutputFile(mAudioFile.getAbsolutePath());

//開始錄音
mMediaRecorder.prepare();//準備
mMediaRecorder.start();//開始

//記錄開始錄音的時間,用于統計時長
mStartRecordTime = System.currentTimeMillis();


} catch (IOException | RuntimeException e) {
e.printStackTrace();
//捕獲異常,避免閃退,返回false提醒用戶失敗
return false;
}
//錄音成功
return true;
}

/**
* 停止錄音邏輯
*/

private boolean doStop() {


try {
//停止錄音
mMediaRecorder.stop();
//記錄停止時間,統計時長
mStopRecordTime = System.currentTimeMillis();

//只接受超過三秒的錄音,在ui上顯示出來
final int second = (int) ((mStopRecordTime - mStartRecordTime) / 1000);
if (second > 3) {
//text.setText(text.getText() + "\n錄音成功" + second + "秒");
//在主線程改ui,顯示出來
mMainThreadHandler. post(new Runnable() {
@Override
public void run() {
text.setText(text.getText()+"\n錄音成功"+second+"秒");
}
});
}
} catch (RuntimeException e) {
e.printStackTrace();
//捕獲異常,避免閃退,返回false提醒用戶失敗
return false;
}


//停止成功
return true;
}

/**
* 釋放MediaRecorder
*/

private void releaseRecorder() {
//檢查MediaRecorder不為null,
if (mMediaRecorder != null) {
mMediaRecorder.release();
mMediaRecorder = null;
}
}

/**
* 錄音錯誤處理
*/

private void recordFail() {
mAudioFile = null;
//給用戶Toast提示失敗,要在主線程執行
mMainThreadHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(RadioActivity.this, "錄音失敗", Toast.LENGTH_SHORT).show();

}
});

}

/**
* 實現播放邏輯
* @param audioFile
*/

private void doPlay(File audioFile) {

//配置播放器MediaPlayer
mMediaPlayer = new MediaPlayer();
try {
//設置聲音文件
mMediaPlayer.setDataSource(audioFile.getAbsolutePath());

//設置監聽回調。
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//播放結束,釋放播放器
stopPlay();
}
});
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//提示用戶
playFail();

//釋放播放器
stopPlay();

//錯誤已經處理,返回true
return true;
}
});
//設置音量,是否循環
mMediaPlayer.setVolume(1,1);//,1,1左右聲道
mMediaPlayer.setLooping(false);//不需要重復播放
// 準備,開始
mMediaPlayer.prepare();
mMediaPlayer.start();
}catch (RuntimeException | IOException e){
//異常處理,防止閃退
e.printStackTrace();
//提醒用戶
playFail();
//釋放播放器
stopPlay();
}
}


/**
*
* 停止播放邏輯
*/
private void stopPlay() {

//重置播放狀態
mIsPlaying = false;
//釋放播放器
if(mMediaPlayer!=null){
//設置監聽器,防止內存泄漏
mMediaPlayer.setOnCompletionListener(null);
mMediaPlayer.setOnErrorListener(null);
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;

}
}

/**
*
*提醒用戶播放失敗
*/
private void playFail() {
//在主線程Toast提示用戶失敗
mMainThreadHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(RadioActivity.this,"播放失敗",Toast.LENGTH_LONG).show();
}
});
}
public void back(View view){
startActivity(new Intent(this,MainActivity.class));
}



}

?

轉載于:https://www.cnblogs.com/liuming123/p/7765679.html

總結

以上是生活随笔為你收集整理的团队-手机便签-开发文档的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。