项目有录音功能,本来是录制的arm格式的文件,需求让改成MP3格式,折腾半天发现android本身做不到这一点,只能借助ndk来完成,下面是ndk的配置级MP3格式文件的录制

一、ndk介绍及下载:http://wear.techbrood.com/tools/sdk/ndk/index.html

二、接下来是android studio配置ndk

1、project structure里面配置NDK路径


2.src下的build.gradle里defaultConfig下添加

ndk {            moduleName"mp3lame"            ldLibs "log", "z", "m"            abiFilters "armeabi", "armeabi-v7a"        }
3. gradle.properties最后添加

android.useDeprecatedNdk=true

4.从https://github.com/talzeus/AndroidMp3Recorder中demo下载下来,jni文件夹拷贝到main下,audiorecoder文件夹拷贝到项目里,

libmp3lame下的.c和.h文件名及文件里面的一些地方要改成自己的包名



libs下的文件都拷贝到自己项目的libs下

5.build make project

此时build>intermediates>ndk>debug下lib和obj下应该都有相应的.so文件了

三、调用MP3recoder录制MP3格式的录音

点击按钮开始录音

mRecordBtn.setOnTouchListener(new VoiceTouchListen());
录音结果及录音完成回调

final Mp3Recorder recorder = new Mp3Recorder();    class VoiceTouchListen implements View.OnTouchListener {        @Override        public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:                    if (!FileUtils.checkSDcard()) {                        Toast.makeText(context, "发送语音需要sd卡支持!", Toast.LENGTH_SHORT).show();                        return false;                    }                    v.setPressed(true);                    handler.postDelayed(runnable, 1000);                    // 开始录音                    try {                        recorder.startRecording();                    } catch(IOException e) {                        Log.d("MainActivity", "Start error");                    }                    return true;                case MotionEvent.ACTION_MOVE: {                    return true;                }                case MotionEvent.ACTION_UP:                    v.setPressed(false);                    try {//                        if (event.getY() < 0) {// 放弃录音//                            recordManager.cancelRecording();//                            L.d("放弃发送语音");//                        } else {                        handler.removeCallbacks(runnable);                        try {                            recorder.stopRecording();                        } catch(IOException e) {                            Log.d("MainActivity", "Stop error");                        }                        //int recordTime = recordManager.stopRecording();                        if (recLen > 1) {                        filePath = recorder.getRecordFilePath();                            //filePath = recordManager.getRecordFilePath(IConst.Cache.RECORD, SDApp.getUserId());                            mPlayBtn.setImageResource(R.drawable.shop_log_record_play);                        } else {// 录音时间过短,则提示录音过短的提示                            Toast.makeText(context, "录音时间过短!", Toast.LENGTH_SHORT).show();                            filePath = null;                        }//                        }                    } catch (Exception e) {                        e.printStackTrace();                    }                    return true;                default:                    return false;            }        }    }
public static interface OnRecordFinishListener {        public void onRecordFinish(String filePath);    }

   

 handler记录长度   

private int recLen = 0;    Handler handler = new Handler();    Runnable runnable = new Runnable() {        @Override        public void run() {            recLen++;            mState.setText("长度 : " + recLen + "秒");            handler.postDelayed(this, 1000);        }    };

试听录音和停止试听

 if (playManager.isPlaying()) {            playManager.stopPlayback();        } else {            playManager.playRecording(filePath, true);        }
在OnRecordFinishListener回调中上传文件

public AddRecordDialog(Context context, OnRecordFinishListener listener) {        this.context = context;        this.listener = listener;    }
AddRecordDialog dialog = new AddRecordDialog(context, new AddRecordDialog.OnRecordFinishListener() {                    @Override                    public void onRecordFinish(String filePath) {                                          //上传文件                    }                });                dialog.show();


   

 最后,查看录音   

private void playLogVoice(View view, ShopLog log) {        ImageView img = (ImageView) view.findViewById(R.id.voiceImg);        final AnimationDrawable anim = (AnimationDrawable) img.getDrawable();        //如果在播放其他音频 则关闭        String dir = IConst.Cache.RECORD + Md5Encryption.getMD5(getUserId());        String fileName = null;        fileName = log.getFile_path().substring(log.getFile_path().lastIndexOf("/")+1);        if(playManager==null){            playManager = PlayManager.getInstance(context);        }        if(TextUtils.isEmpty(dir + File.separator + fileName)){            return;        }        if (playManager.isPlaying() && !playManager.isPlaying(dir + File.separator + fileName)) {            playManager.stopPlayback();            L.d("停止播放其他");        }        //监听播放  更新动画        playManager.setOnPlayChangeListener(new IOnPlayChangeListener() {            @Override            public void onPlayStart() {                L.d("start");                anim.start();            }            @Override            public void onPlayStop() {                L.d("stop");                anim.stop();            }        });        if (new File(dir).exists() && new File(dir + File.separator + fileName).exists()) {            L.d("0000000000--0");            if (playManager.isPlaying()) {                L.d("0000000000--1");                playManager.stopPlayback();            } else {                playManager.playRecording(dir + File.separator + fileName, true);            }        } else {            L.d("11111111111--0");            if(log.getFile_path()==null){return;}            L.d("log.getFilePath()--"+log.getFile_path());            L.d("log.getFileName()--"+fileName);
Request request = new Request.Builder().url(path).build();        RequestTask requestTask = new RequestTask<>(request, savePath, fileName, 
new RequestCallBack() {                @Override                public void onSuccess(ResponseInfo responseInfo) {                    L.d(responseInfo.result.getAbsolutePath());                    playManager.playRecording(responseInfo.result.getAbsolutePath(), true);                }                @Override                public void onFinish() {                }                @Override                public void onFailure(HttpException error) {                    showToast(error.errorMsg);                }            }

); requestTask.execute();
   
   
   备注:如果MP3Recorder类中没有调用本地方法需加上(android调用本地方法)   

static {System.loadLibrary("mp3lame");}


   


更多相关文章

  1. Android(安卓)数据存储---SharedPreference
  2. Android开发―随笔杂记(2010年的)
  3. android 性能检测资料合集
  4. 很好的一些开源项目
  5. Android(安卓)串口的踩坑之路
  6. Android(安卓)源码导入Eclipse技巧(Ubuntu)
  7. windows系统上安装与使用Android(安卓)NDK
  8. Android(安卓)如何建立AIDL
  9. Android(安卓)使用Post方式提交数据

随机推荐

  1. android实现开机自动播放音乐实例(Broadca
  2. Android(安卓)Permission denied 错误 (
  3. android有用的知识
  4. Android(安卓)Parcelable 源码解析
  5. android通过webservice验证用户
  6. Android(安卓)横竖屏切换 activity变化详
  7. android中动画效果编程详解
  8. Android(安卓)怎样获得手机信息(二)
  9. Android--自定义带提示文本的EditText组
  10. Android动画效果translate、scale、alpha