首页 文章

android mediaRecorder.setAudioSource失败了

提问于
浏览
59

我有android G1固件1.6,我试图用以下代码从应用程序录制语音 .

MediaRecorder recorder = new MediaRecorder();
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 recorder.setOutputFile(PATH_NAME);
 recorder.prepare();
 recorder.start();

我的manifest.xml有:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

我有:

09-23 14:41:05.531: ERROR/AndroidRuntime(1718): Uncaught handler: thread main exiting due to uncaught exception
09-23 14:41:05.551: ERROR/AndroidRuntime(1718): java.lang.RuntimeException: setAudioSource failed.
09-23 14:41:05.551: ERROR/AndroidRuntime(1718):     at android.media.MediaRecorder.setAudioSource(Native Method)

我该如何正确录制声音?

16 回答

  • 4

    打开“ AndroidManifest.xml ” - >

    add

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  • -2

    我知道这是一个非常古老的问题但是在Android Marshmallow中你必须继续“设置>应用程序>你的应用程序>权限”并获得麦克风权限 .

  • 0

    如果您在Android M上运行,则需要在首次运行时请求记录音频的权限 . 要完成此操作,请询问用户是否可以在应用程序启动时录制音频:

    private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 29;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (mContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO},
                    MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
        } else {
            Log.d("Home", "Already granted access");
            initializeView(v);
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d("Home", "Permission Granted");
                    initializeView(v);
                } else {
                    Log.d("Home", "Permission Failed");
                    Toast.makeText(getActivity().getBaseContext(), "You must allow permission record audio to your mobile device.", Toast.LENGTH_SHORT).show();
                    getActivity().finish();
                }
            }
            // Add additional cases for other permissions you may have asked for
        }
    }
    
  • 2

    重要 - 在过去的几个小时里,我试图弄清楚如何检查MIC是否被其他应用程序捕获 . 我注意到,如果2个应用程序地址同时向MediaRecorder抛出RuntimeException并且你将无法使用麦克风,除非你重启你的设备(!!)我不知道它是否是最好的解决方案但是它对我有用 . 也许它会让你们有些人在某一天节省一些时间..

    private void validateMicAvailability() throws MicUnaccessibleException {
        AudioRecord recorder =
            new AudioRecord(AudioSource.MIC, 44100,
                    AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_DEFAULT, 44100);
        try{
            if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
                throw new MicUnaccessibleException("Mic didn't successfully initialized");
            }
    
            recorder.startRecording();
            if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
                recorder.stop();
                throw new MicUnaccessibleException("Mic is in use and can't be accessed");
            }
            recorder.stop();
        } finally{
            recorder.release();
            recorder = null;
        }
    }
    
  • -12

    我有这个确切的问题,这解决了我:

    在用于调试的设备上,转到设置 - >应用程序 - > {您的应用程序} . 然后确保允许所有应用程序的权限(在本例中为音频录制和写入外部存储) .

    很明显,在不通过Google Play商店安装应用时,系统不会要求您授予权限,在某些手机上,这会导致您的调试应用无法获得某些权限 .

    即使清单文件中的某些权限被识别(例如互联网访问),也要检查这一点,因为对我来说有些工作有些,而有些则被自动阻止 .

    希望这可以帮助 .

  • 117

    请为Marshmallow及以上版本动态请求 Manifest.permission.RECORD_AUDIO 权限 .

  • 1

    对于API 23,您需要请求读/写权限,即使它们已经在您的清单中 .

    // Check for permissions
    int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
    
    // If we don't have permissions, ask user for permissions
    if (permission != PackageManager.PERMISSION_GRANTED) {
        String[] PERMISSIONS_STORAGE = {
            android.Manifest.permission.READ_EXTERNAL_STORAGE,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE
        }; 
        int REQUEST_EXTERNAL_STORAGE = 1;
    
        ActivityCompat.requestPermissions(
            getActivity(),
            PERMISSIONS_STORAGE,
            REQUEST_EXTERNAL_STORAGE
        );
    }
    
  • 10

    对于API 23,请检查Manifest.xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> 和Java代码中的音频记录权限

    if (ActivityCompat.checkSelfPermission(cnt, Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(cnt, arrayOf(
                    Manifest.permission.RECORD_AUDIO
            ),0)
            return
        }
    
  • 37

    这看起来很正确 . 确保其他应用程序尚未使用MIC . 也许让手机重启并再试一次 .

  • 1

    这段代码对我有用

    mRecorder = new MediaRecorder();
     mRecorder.reset();
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    
  • 2

    我的建议可能看起来很愚蠢,但它对我有用:)

    尝试将权限作为嵌套标记 . 我相信在android包装库的某处有一个xml解析问题 .

  • 2

    作为Cyanogenmod用户,我不得不这样做

    • 确保权限在清单中定义(android-studio)

    • 确保隐私保护允许应用访问麦克风(在设备上)

    • 确保android系统已设置权限 Settings - > Apps - >选择你的应用程序 - > Permissions - >检查所有权限(应该是清单请求的权限)(在设备上)

    之后,重新编码对我有用 .

  • 4

    尝试这个代码它可以帮助你很多,它可以理解.....

    public class MainActivity extends Activity {
    
        MediaRecorder mRecorder;
        MediaPlayer mediaPlayer;
        Button start, stop, play,stop_play;
        String FileName="";
        File outfile ;
    
        public static final int request_code = 1000;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            start=(Button)findViewById(R.id.btn_start_main);
            stop=(Button)findViewById(R.id.btn_stop_main);
            play=(Button)findViewById(R.id.btn_play_main);
            stop_play=(Button)findViewById(R.id.btn_playstop_main);
    
            if (checkPermissionFromDevice()){
    
                start.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        FileName= Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+
                                UUID.randomUUID()+"AudioFile.3gp";
    
                        SetupMediaRecorder();
    
                        try {
                            mRecorder.prepare();
                            mRecorder.start();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        start.setEnabled(false);
                        stop.setEnabled(true);
                        play.setEnabled(false);
                        stop_play.setEnabled(false);
    
                        Toast.makeText(getApplicationContext(),"recording....",Toast.LENGTH_SHORT).show();
                    }
                });
                stop.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mRecorder.stop();
                        play.setEnabled(true);
                        start.setEnabled(true);
                        stop.setEnabled(false);
                        stop_play.setEnabled(false);
                        Toast.makeText(getApplicationContext(),"recording stoped....",Toast.LENGTH_SHORT).show();
                    }
                });
                play.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mediaPlayer=new MediaPlayer();
                        try {
                            mediaPlayer.setDataSource(FileName);
                            mediaPlayer.prepare();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        mediaPlayer.start();
                        start.setEnabled(false);
                        stop.setEnabled(false);
                        play.setEnabled(false);
                        stop_play.setEnabled(true);
                        Toast.makeText(getApplicationContext(),"playing..",Toast.LENGTH_SHORT).show();
                    }
                });
                stop_play.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mediaPlayer.stop();
                        SetupMediaRecorder();
                        start.setEnabled(true);
                        stop_play.setEnabled(false);
                        play.setEnabled(false);
                    }
                });
    
            }
            else {
    
                requestPermissionFromDevice();
            }
    
    
    
    
    
        }
    
        private void SetupMediaRecorder() {
            mRecorder=new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mRecorder.setOutputFile(FileName);
        }
    
        private void requestPermissionFromDevice() {
            ActivityCompat.requestPermissions(this,new String[]{
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.RECORD_AUDIO},
                    request_code);
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode){
                case request_code:
                {
                    if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ){
                        Toast.makeText(getApplicationContext(),"permission granted...",Toast.LENGTH_SHORT).show();
                    }
                    else {
                        Toast.makeText(getApplicationContext(),"permission denied...",Toast.LENGTH_SHORT).show();
                    }
                }
                    break;
            }
        }
    
        private boolean checkPermissionFromDevice() {
            int storage_permission= ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
            int recorder_permssion=ContextCompat.checkSelfPermission(this,Manifest.permission.RECORD_AUDIO);
        return storage_permission == PackageManager.PERMISSION_GRANTED && recorder_permssion == PackageManager.PERMISSION_GRANTED;
        }
    }
    
  • 0

    我把它移到另一个线程 . 一切正常 .

    这是一个代码:

    new Thread(() -> {
        mediaRecorder.reset();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setOutputFile("/audiorecordtest.3gp");
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            try {
                mediaRecorder.prepare();
                mediaRecorder.start();
                //do something here
                mediaRecorder.stop();
            } catch (IOException e) {
                e.printStackTrace();
                Log.d("Audio","unable to prepare");
            }
    
    }).start();
    
  • 0

    确保android系统已在设备上设置了权限,应该是清单请求的权限:

    • 在设置 - >应用程序 - >选择您的应用程序 - >权限 - >检查所有权限
  • 0

    更改

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

    <uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>
    

    为我工作 .

相关问题