web-dev-qa-db-fra.com

android mediaRecorder.setAudioSource a échoué

J'ai le firmware Android G1 1.6, j'essaie d'enregistrer de la voix à partir de l'application avec le code suivant.

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

mon manifeste.xml a:

 <utilise-permission Android: name = "Android.permission.RECORD_AUDIO" />

J'ai eu:

 09-23 14: 41: 05.531: ERREUR/AndroidRuntime (1718): Gestionnaire non capturé: sortie principale du fil en raison d'une exception non interceptée 
 09-23 14: 41: 05,551: ERREUR/AndroidRuntime (1718): Java. lang.RuntimeException: setAudioSource a échoué le ........ 09-23 14: 41: 05.551: ERREUR/AndroidRuntime (1718): sur Android.media.MediaRecorder.setAudioSource (Méthode native) 

comment enregistrer la voix correctement?

59
user121196

Ouvrez "AndroidManifest.xml" -> 

ajouter  

<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
117
SeungUn Ham

Je sais que la question est très ancienne, mais sous Android Marshmallow, vous devez accéder à "Paramètres> Applications> Votre application> Autorisations" et activer l'autorisation Microphone.

37
Rafael

Si vous utilisez Android M, vous devez demander des autorisations pour enregistrer le son lors de la première exécution. Pour ce faire, demandez à l'utilisateur si vous pouvez enregistrer de l'audio au démarrage de l'application:

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

J'ai eu ce problème exact, cela l'a résolu pour moi:

Sur le périphérique que vous utilisez pour le débogage, accédez à Paramètres -> Applications -> {votre application} . Assurez-vous ensuite que toutes les autorisations de l'application (dans ce cas, l'enregistrement audio et l'écriture de stockage externe) sont autorisées.

Lorsque vous installez une application sans passer par le Google Play Store, vous n'êtes pas invité à accorder des autorisations. Sur certains téléphones, cela signifie que votre application de débogage ne reçoit pas certaines autorisations.

Vérifiez cela même si certaines autorisations du fichier manifeste sont reconnues (telles que l'accès Internet), car pour moi certaines ont fonctionné et d'autres ont été automatiquement bloquées.

J'espère que cela t'aides.

4
Shalev Keren

IMPORTANT - Au cours des dernières heures, j’ai essayé de comprendre comment vérifier si le MIC était capturé par une application différente ou non. J'ai remarqué que si 2 adresses d'application sur MediaRecorder simultanément, une exception RuntimeException sera lancée et vous ne pourrez plus utiliser le micro, à moins de redémarrer votre appareil (!!) La meilleure solution, mais cela a fonctionné pour moi ... peut-être que cela vous fera économiser quelques heures un jour ...

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

Veuillez demander la permission Manifest.permission.RECORD_AUDIO de manière dynamique pour Marshmallow et les versions supérieures.

2
porwalankit

Pour l'API 23+, vérifiez l'autorisation d'enregistrement audio dans Manifest.xml <uses-permission Android:name="Android.permission.RECORD_AUDIO" /> et dans Java Code 

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

Pour l'API 23+, vous devez demander les autorisations de lecture/écriture, même si elles figurent déjà dans votre manifeste. 

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

Cela semble correct. Assurez-vous que d'autres applications n'utilisent pas déjà le MIC. Peut-être redémarrer le téléphone et réessayer.

1
vanevery

Ce code a fonctionné pour moi

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

essayez ce code il vous aide beaucoup et son compréhensible .....

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
nagabrahmam

Ma suggestion peut paraître stupide, mais elle a fonctionné pour moi :)

Essayez de donner la permission en tant que balise imbriquée. Je crois qu’il existe un problème d’analyse XML quelque part .__ avec la bibliothèque de packages Android. 

0
uncaught_exceptions

En tant qu’utilisateur de CyanogenMod, j’ai dû

  1. assurez-vous que les autorisations sont définies dans le manifeste (Android-studio)
  2. assurez-vous que le garde de la confidentialité a autorisé l'application à accéder au microphone (sur l'appareil)
  3. assurez-vous que le système Android a défini les autorisations sous Settings -> Apps -> Sélectionnez votre application -> Permissions -> Vérifiez toutes les autorisations (celles-ci doivent être celles demandées par le manifeste)

Après cela, le recodage a fonctionné pour moi.

0
GameScripting

Je l'ai déplacé vers un autre thread. Tout fonctionne. 

Voici un code:

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
R. Barbus