62 votes

L'objet AudioRecord n'est pas en cours d'initialisation

Dans le code ci-dessous mon audioRecord objet n'est pas en cours d'initialisation. J'ai essayé de le déplacer à l' onCreate méthode et en a fait un mondial. J'ai connecté l'état et qui retourne une valeur de 1 ce qui signifie prêt à l'emploi. Le débogueur dit qu' startRecording est appelée sur un objet non initialisé. Il est aussi en disant qu'il ne pouvait pas obtenir de la source audio.

Pourquoi j'obtiens ces erreurs?

    package com.tecmark;

    import java.io.BufferedOutputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import android.app.Activity;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;

    public class recorder extends Activity  {

        private Thread thread;
        private boolean isRecording;
        private AudioRecord recorder;
        private FileOutputStream os;
        private BufferedOutputStream bos;
        private DataOutputStream dos;
        private TextView text;
        private int audioSource = MediaRecorder.AudioSource.MIC;
        private int sampleRate = 22050;
        private int channel = AudioFormat.CHANNEL_CONFIGURATION_MONO;
        private int encoding = AudioFormat.ENCODING_PCM_16BIT;
        private int result = 0;
        private int bufferSize;
        private byte[] buffer;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            Log.v("onCreate", "layout set, about to init audiorec obj");
            text = (TextView)findViewById(R.id.TextView01);

             bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,encoding);
             buffer = new byte[bufferSize];

            recorder = new AudioRecord(audioSource, sampleRate,channel,encoding,
                    AudioRecord.getMinBufferSize(sampleRate, channel,encoding));
            Log.i("recorder obj state",""+recorder.getRecordingState());
        }

        public void onClickPlay(View v){

        }


        public void record(){
            Log.i("inside record method", "******");
        File path = Environment.getExternalStorageDirectory();
            Log.v("file path", ""+path.getAbsolutePath());

            File file = new File(path, "test.wav");

            if(file.exists()){
            file.delete();
            }

            path.mkdirs();
            Log.v("file path", ""+file.getAbsolutePath());

            try {
             os = new FileOutputStream(file);
             bos = new BufferedOutputStream(os);            
                 dos = new DataOutputStream(bos);        
            } catch (Exception e1) {
             e1.printStackTrace();
            }

            int bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,encoding);
            byte[] buffer = new byte[bufferSize];
            recorder.startRecording();
            isRecording = true; 
            try{  
                while (isRecording){
            result = recorder.read(buffer, 0, bufferSize);
            for(int a=0; a<result;a++){
                 dos.write(buffer[a]);

                 if(!isRecording){
                   recorder.stop();          
                   break;
                 }

            }

             }
             dos.flush();
             dos.close();
        }catch(Exception e){
             e.printStackTrace();
        }

    }// end of record method

    public void onClickStop(View v){
        Log.v("onClickStop", "stop clicked");
        isRecording=false;
    }   
    public void onClickReverse(View v){
        Log.v("onClickReverse", "reverse clicked");
    } 
    public void onClickRecord(View v){
        Log.v("onClickRecourd", "record clicked, thread gona start");
        text.setText("recording");
        thread = new Thread(new Runnable() {
            public void run() {
                isRecording = true;
                record();
            }
        });

        thread.start();
        isRecording = false;
    }   
}//end of class

01-30 15:23:16.724: ERREUR/AudioRecord(12817): ne Peut pas obtenez de l'entrée audio de la source d'enregistrement 1 01-30 15:23:16.729: ERREUR/AudioRecord-JNI(12817): Erreur la création de AudioRecord exemple: initialisation de l'échec de la vérification. 01-30 15:23:16.729: ERREUR/AudioRecord-Java(12817): [ android.médias.AudioRecord ] le code d'Erreur -20 lors de l'initialisation natif AudioRecord objet. 01-30 15:23:16.729: INFO/enregistreur obj état(12817): 1 01-30 15:23:16.729: ALERTER/dalvikvm(12817): threadid=13: thread sortir avec uncaught exception (groupe=0x4001b180) 01-30 15:23:16.729: ERREUR/AndroidRuntime(12817): Uncaught gestionnaire: thread thread-7 de la fermeture en raison à l'exception non interceptée 01-30 15:23:16.739: ERREUR/AndroidRuntime(12817): java.lang.IllegalStateException: startRecording() appelée sur une non initialisée AudioRecord. 01-30 15:23:16.739: ERREUR/AndroidRuntime(12817): à android.médias.AudioRecord.startRecording(AudioRecord.java:495) 01-30 15:23:16.739: ERREUR/AndroidRuntime(12817): à com.tecmark.enregistreur.enregistrement(enregistreur.java:114) 01-30 15:23:16.739: ERREUR/AndroidRuntime(12817): à com.tecmark.enregistreur de$1.exécuter(enregistreur.java:175) 01-30 15:23:16.739: ERREUR/AndroidRuntime(12817): à java.lang.Fil de discussion.exécution(Thread.java:1096)

96voto

Dustin Points 4694

Le truc avec AudioRecord est que chaque appareil peut avoir différents paramètres d’initialisation. Vous devrez donc créer une méthode qui réponde à toutes les combinaisons possibles de débits binaires, codage, etc.

 private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
public AudioRecord findAudioRecord() {
    for (int rate : mSampleRates) {
        for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) {
            for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) {
                try {
                    Log.d(C.TAG, "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: "
                            + channelConfig);
                    int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);

                    if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                        // check if we can instantiate and have a success
                        AudioRecord recorder = new AudioRecord(AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize);

                        if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                            return recorder;
                    }
                } catch (Exception e) {
                    Log.e(C.TAG, rate + "Exception, keep trying.",e);
                }
            }
        }
    }
    return null;
}

AudioRecord recorder = findAudioRecord();
recorder.release();
 

91voto

user833970 Points 777

J'ai eu le même problème, il a été résolu en mettant

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

dans le manifeste

10voto

Ivan Points 881

Selon les javadocs, tous les appareils sont compatibles avec ce format (pour l’enregistrement):

44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT.

Passez à CHANNEL_OUT_MONO pour la lecture.

4voto

Sirtarius Points 85

Un problème avec l’initialisation de quelques objets AudioRecord pourrait être corrigé en utilisant audioRecord.release(); avant la création de l’objet suivant ... Plus ici: Android AudioRecord - Ne sera pas initialisé la deuxième fois

2voto

Que Points 21

Juste eu le même problème. La solution consistait à redémarrer l'appareil. Lors de la lecture du code, je n'ai pas publié l'objet AudioRecord, qui bloquait évidemment le périphérique audio. Pour vérifier si le périphérique audio fonctionnait ou non, j'ai téléchargé Audalyzer à partir de Google Play.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X