80,351
社区成员
发帖
与我相关
我的任务
分享
public static final String SD_APP_DIR_NAME = "WordBar"; //存储程序在外部SD卡上的根目录的名字
public static final String VOICE_DIR_NAME = "voice"; //存储音频在根目录下的文件夹名字
public static final int VOICE_RESULT_CODE = 101; //标志符,音频的结果码,判断是哪一个Intent
private String mVoicePath; //用于存储录音的最终目录,即根目录 / 录音的文件夹 / 录音
private Uri mVoiceUri; //存储录音机返回的uri
private String mVoiceName; //保存的录音的名字
private File mVoiceFile; //录音文件
/**
* 启动录音机,创建文件,并要求返回uri
*/
private void startRecord() {
requestRunTimePermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO}, new PermissionListener() {
@Override
public void onGranted() {
Intent intent = new Intent();
intent.setAction(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
createVoiceFile();
//添加权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//获取uri
mVoiceUri = FileProvider.getUriForFile(MainActivity.this, "com.my.wordbar.provider", mVoiceFile);
//将uri加入到额外数据
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(intent, VOICE_RESULT_CODE);
}
@Override
public void onGranted(List<String> grantedPermission) {
Toast.makeText(MainActivity.this, "程序需要足够的权限才可以使用照相机!",
Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied(List<String> deniedPermission) {
Toast.makeText(MainActivity.this, "拒绝权限将无法使用该功能,可前往应用设置中开启。",
Toast.LENGTH_SHORT).show();
}
});
}
/**
* 创建音频目录
*/
private void createVoiceFile() {
mVoiceName = getMyTime() + ".amr";
mVoiceFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/" + SD_APP_DIR_NAME + "/" + VOICE_DIR_NAME + "/", mVoiceName);
mVoicePath = mVoiceFile.getAbsolutePath();
mVoiceFile.getParentFile().mkdirs();
mVoiceFile.setWritable(true);
}
/**
* 获取日期并格式化
* 如:2017年10月20日 星期三 上午 11时20分35秒
* @return 格式化好的日期字符串
*/
private String getMyTime() {
//存储格式化后的时间
String time;
//存储上午下午
String ampTime = "";
//判断上午下午,am上午,值为 0 ; pm下午,值为 1
int apm = Calendar.getInstance().get(Calendar.AM_PM);
if (apm == 0){
ampTime = "上午";
}else{
ampTime = "下午";
}
//设置格式化格式
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 E " + ampTime +" kk时mm分ss秒");
time = format.format(new Date());
return time;
}
/**
* 处理返回结果。
* 1、图片
* 2、音频
* 3、视频
*
* @param requestCode 请求码
* @param resultCode 结果码
* @param data 返回的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Log.d(TAG, "返回成功。");
Log.d(TAG, "请求码:"+requestCode+" 结果码:"+resultCode+" data:"+data);
switch (requestCode) {
case PHOTO_RESULT_CODE: {
break;
}
case VOICE_RESULT_CODE: {
//MediaPlayer mediaPlayer = null;
//try {
// mediaPlayer.setDataSource(this,mVoiceUri);
//} catch (IOException e) {
// e.printStackTrace();
//}
saveVoiceToSD(mediaPlayer);
break;
}
case VIDEO_RESULT_CODE: {
// saveVideoTOSD();
break;
}
}
}
}
/**
* 保存音频到SD卡的指定位置
*/
private void saveVoiceToSD(MediaPlayer mediaPlayer) {
BufferedOutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(mVoiceFile));
//写操作
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
音频也是在onActivityResult中获取
调用系统音频:
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
startActivityForResult(intent, RECORD_AUDIO);
获取Uri:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case RECORD_AUDIO:
try {
Uri uri = data.getData();
String filePath = getAudioFilePathFromUri(uri);
Log.d(TAG, filePath);
} catch (Exception e) {
throw new RuntimeException(e);
}
break;
}
}
private String getAudioFilePathFromUri(Uri uri) {
Cursor cursor = getContentResolver()
.query(uri, null, null, null, null);
cursor.moveToFirst();
int index = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);
return cursor.getString(index);
}
filePath就是你录的音频文件,你可以copy到任何位置。
不用忘记添加uses-permission相关权限