android mediaRecorder.setAudioSource failed

I have android G1 firmware 1.6, I am trying to record voice from the app with the follow code.

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();  

my manifest.xml has:

  • Cannot Resolve Symbol Google API Client in Android Studio
  • Genymotion Android emulator - adb access?
  • Check internet connection in Android WebView (Cordova)
  • Android: access SQLite database via Content Provider or implement DAO?
  • Android Share Intent for a Bitmap - is it possible not to save it prior sharing?
  • Android - Cut a circle from a square Bitmap
  • <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

    I got:

    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)
    

    how do I record voice properly?

  • IndexNotReadyException - Android Studio
  • Check if a file exists before calling openFileInput
  • Take picture with drawable/paint on face using vision api
  • How to check if an activity is the last one in the activity stack for an application?
  • Drag and Drop Layout in android 2.2
  • Disable on click highlight of InfoWindows?
  • 14 Solutions collect form web for “android mediaRecorder.setAudioSource failed”

    Open “AndroidManifest.xml” ->

    add

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

    I know this is a very old question but in Android Marshmallow you have to go on “Settings > Apps > Your App > Permissions” and enble Microphone permission.

    If you are running on Android M, then you need to request permissions to record audio on first run. To accomplish this, ask the user if you can record audio when the application starts:

    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
        }
    }
    

    IMPORTANT –
    during the last few hours I tried to figure out how to check if the MIC is caught by a different application or not. I noticed that if 2 application address to MediaRecorder at the same time a RuntimeException will be tossed and you won’t be able to use the mic, unless you restart your device (!!)
    I don’t know if it’s the best solution but it worked for me.
    perhaps it will save some of you a few hours some day..

    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;
        }
    }
    

    I had this exact problem, this solved it for me:

    On the device you use for debugging go to Settings -> Apps -> {your app}.
    Then make sure all the app’s permissions (in this case Audio Recording and Writing External Storage) are permitted.

    Apprarently when installing an app not via Google Play Store you don’t get asked to grant permissions and on some phones this will result in your debugging app not getting some permissions granted.

    Check this even if some permissions in the manifest file are getting recognised (such as internet access) because for me some worked and some got automatically blocked.

    Hope this helps.

    Please request Manifest.permission.RECORD_AUDIO permission dynamically for Marshmallow and above version.

    That looks correct. Make sure other other applications aren’t already using the MIC. Perhaps give the phone a restart and try again.

    This code worked for me

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

    For API 23+ you need to request the read/write permissions even if they are already in your manifest.

    // 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
        );
    }
    

    My suggestion might look stupid, but it worked for me 🙂

    Try giving permission as a nested tag. I believe there is an xml parsing issue somewhere
    with android packaging library.

    The answer “validateMicAvailability() throws MicUnaccessibleException” doesn’t work for me. The MicUnaccessibleException exception does not appear to exist. Am I misunderstanding something?

    As a Cyanogenmod-User I had to

    1. make sure the permissions are defined in the manifest (android-studio)
    2. make sure the privacy guard allowed the app to access the microphone (on the device)
    3. make sure the android system had set the permissions under Settings –> Apps –> Select your app –> Permissions –> Check all permissions (should be the ones requested by the manifest) (on the device)

    After that recoding worked for me.

    Change

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

    to

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

    Worked for me.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.