[Android]调用系统录音机录音并保存到本地

__椎名真白 2018-04-06 07:59:46
我这么启动的。。
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();
}
}
}
}

不知道怎么根据uri设置音频对象了,这个音频对象用哪一个啊?保存到SD的时候用哪一个方法?要是视频的话根据uri设置视频对象,用哪一个对象?要是文本呢?就知道图片用bitmap了。。。惭愧。。。
查了很多资料都是自定义的播放器,我只是想用系统的,翻了半天API文档也没找到该怎么设置。。
只能又来求助攻了。。

...全文
1059 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
键盘舞者113 2018-04-07
  • 打赏
  • 举报
回复
音频也是在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相关权限

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧