因为本人不是专门从事Android开发,但是工作中需要Android原生的一些功能打包成aar包放入unity中使用,而网上的大多数Android示例都比较繁琐,而Unity调用只需功能函数即可,因此将抽离的函数继承在一个activity记录下来
参考:https://www.jianshu.com/p/6bbb51ac4938
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.TimerTask;
public class Main extends AppCompatActivity {
private Button mBtnRecordAudio;
private Button mBtnPlayAudio;
private Chronometer mChronometerTime;
private static final String LOG_TAG = "RecordingService";
private String mFileName = null; //录音名字
private String mFilePath = null; //文件路径
private MediaRecorder mRecorder = null;
private long mStartingTimeMillis = 0;
private long mElapsedMillis = 0;
private TimerTask mIncrementTimerTask = null;
//播放参数
private MediaPlayer mMediaPlayer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBtnRecordAudio = (Button)findViewById(R.id.main_btn_record_sound);
mBtnPlayAudio = (Button) findViewById(R.id.main_btn_play_sound);
mChronometerTime = (Chronometer) findViewById(R.id.record_audio_chronometer_time);
mRecorder = new MediaRecorder();
mBtnRecordAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start Chronometer
mChronometerTime.setBase(SystemClock.elapsedRealtime());
mChronometerTime.start();
startRecording(); //开始录音
}
});
mBtnPlayAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startPlaying();
}
});
mChronometerTime.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
// TODO Auto-generated method stub
//如果从开始计时到现在超过50秒则停止计时
if(SystemClock.elapsedRealtime()-mChronometerTime.getBase()>10*1000)
{
//Log.d("onChronometerTick", mRecorder.toString());
mChronometerTime.stop();
stopRecording();
}
}
});
}
public void startRecording() {
setFileNameAndPath(); //初始化录音文件的名字和保存的路径
//mRecorder参数设置 是 MediaRecorder 的一个实例,专门用于录音的存储
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //录音文件保存的格式 这里是MP4格式
mRecorder.setOutputFile(mFilePath); //设置保存的路径
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioChannels(1);
mRecorder.setAudioSamplingRate(44100);
mRecorder.setAudioEncodingBitRate(192000);
try {
mRecorder.prepare();
Toast.makeText(Main.this, "开始录音...", Toast.LENGTH_SHORT).show();
mRecorder.start(); //启动mRecorder开始录音
mStartingTimeMillis = System.currentTimeMillis(); //保存当前时间
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}
//初始化录音文件的名字和保存的路径
public void setFileNameAndPath() {
int count = 0;
File f;
do {
count++;
mFileName ="My Recording"
+ "_" + (System.currentTimeMillis()) + ".mp4";
mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath();
mFilePath += "/SoundRecorder/" + mFileName;
f = new File(mFilePath);
} while (f.exists() && !f.isDirectory());
}
public void stopRecording() {
mRecorder.stop(); //结束录音
Toast.makeText(Main.this, "录音结束...", Toast.LENGTH_SHORT).show();
mElapsedMillis = (System.currentTimeMillis() - mStartingTimeMillis);
mRecorder.release();
getSharedPreferences("sp_name_audio", MODE_PRIVATE)
.edit()
.putString("audio_path", mFilePath)
.putLong("elpased", mElapsedMillis)
.apply();
if (mIncrementTimerTask != null) {
mIncrementTimerTask.cancel();
mIncrementTimerTask = null;
}
mRecorder = null;
}
//开启播放录音
private void startPlaying() {
mMediaPlayer = new MediaPlayer();
try {
mMediaPlayer.setDataSource(mFilePath);
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
});
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlaying();
}
});
}
private void stopPlaying() {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/main_btn_record_sound"
android:layout_width="match_parent"
android:layout_height="64dp"
android:text="开始录音" />
<Button
android:id="@+id/main_btn_play_sound"
android:layout_width="match_parent"
android:layout_height="64dp"
android:text="播放录音" />
<Chronometer
android:id="@+id/record_audio_chronometer_time"
android:layout_below="@+id/record_audio_iv_close"
android:layout_width="240dp"
android:layout_height="84dp"
android:layout_centerHorizontal="true"
android:fontFamily="sans-serif-light"
android:textSize="60sp"
android:gravity="center"
/>
</LinearLayout>
但是MediaRecorder不能边录边播放,不符合我的需求,后面再出一份边录边播放的