2010-09-23 6 views
57

Ho Android G1 firmware 1.6, sto provando a registrare la voce dall'app con il codice seguente.android mediaRecorder.setAudioSource fallito

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

mia manifest.xml ha:

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

ho ottenuto:

 
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) 

Come è possibile registrare la voce in modo corretto?

+4

Tempo di cambiare la risposta accettata ... – Noumenon

risposta

1

Sembra corretto. Assicurati che altre altre applicazioni non stiano già utilizzando il MIC. Forse dare al telefono un riavvio e riprovare.

0

Il mio suggerimento potrebbe sembrare stupido, ma ha funzionato per me :)

provare a dare il permesso come un tag nidificato. Credo che ci sia un problema di analisi XML da qualche parte con la libreria di packaging Android.

+0

che cosa è il vostro punto di dare tag nidificato, può essere che si sta parlando della , sul Manifesto – IronBlossom

4

IMPORTANTE - durante le ultime ore ho cercato di capire come controllare se il MIC è catturato da una diversa applicazione o meno. Ho notato che se 2 indirizzi dell'applicazione a MediaRecorder contemporaneamente viene lanciata una RuntimeException e non sarai in grado di usare il microfono, a meno che non riavvii il tuo dispositivo (!!) Non so se sia la soluzione migliore Ma ha funzionato per me. Forse sarà risparmiare un po 'di voi un paio d'ore, un giorno ..

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

Open "AndroidManifest.xml" ->

aggiungere

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

Geeze, Vorrei che ci fosse un po 'di uniformità nei nomi dei permessi. 'android.permission.RECORD_AUDIO' è grandioso, se c'è anche' android.permission.RECORD_VIDEO', ma non c'è, c'è 'android.permission.CAMERA' che porta ovviamente a' android.permission.MICROPHONE' che ovviamente non esistere. Maledizioni. – nmr

+1

Anche guardare l'involucro. In Android Studio ha inserito automaticamente il nome in maiuscolo della costante "ANDROID_PERMISSION.RECORD_AUDIO", ma non funziona! –

+2

Se hai dimenticato questo, potresti aver dimenticato anche "' per memorizzare il file audio – Noumenon

-10

Change

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

a

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

Ha funzionato per me.

+6

Quelli valutano la stessa cosa: il primo è a chiusura automatica – jprofitt

+0

@xpq Che diavolo stai facendo qui, questo è lo stesso –

0

La risposta "validateMicAvailability() genera MicUnaccessibleException" non funziona per me. L'eccezione MicUnaccessibleException non sembra esistere. Sto fraintendendo qualcosa?

+0

In futuro, tali domande sono più adatte ai commenti. –

1

Questo codice ha funzionato per me

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

Ho avuto questo problema esatto, questo ha risolto per me:

Sul dispositivo si utilizza per il debug vai a Impostazioni -> Applicazioni -> {la vostra applicazione }. Quindi assicurati che tutte le autorizzazioni dell'app (in questo caso Registrazione audio e Scrittura esterna) siano consentite.

Inizialmente, quando si installa un'app non tramite Google Play Store, non viene richiesto di concedere autorizzazioni e su alcuni telefoni ciò comporterà il mancato rilascio delle autorizzazioni da parte all'app di debug.

Controllare questo anche se alcune autorizzazioni nel file manifest vengono riconosciute (come l'accesso a Internet) perché per me alcune funzionavano e alcune venivano automaticamente bloccate.

Spero che questo aiuti.

33

So che questa è una domanda molto vecchia, ma in Android Marshmallow devi andare su "Impostazioni> Applicazioni> La tua app> Autorizzazioni" e abilitare il microfono abilitato.

+8

Informazioni su come richiedere le autorizzazioni individuali in fase di esecuzione: http://developer.android.com/training/permissions/requesting.html –

7

Se si utilizza Android M, è necessario richiedere le autorizzazioni per registrare l'audio al primo avvio. Per fare questo, chiedere all'utente se è possibile registrare l'audio quando si avvia l'applicazione:

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

Cambia ** LEGGI ** costante a * * WRITE **. – Amir

+0

Questo ha funzionato con me. Grazie. Apprezzato. – user1510006

2

Si prega di richiedere il permesso Manifest.permission.RECORD_AUDIO dinamicamente per Marshmallow e sopra la versione.

2

Per API 23+ è necessario richiedere i permessi di lettura/scrittura anche se sono già presenti nel file 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 
    ); 
} 
0

Come CyanogenMod-User ho dovuto

  1. assicurarsi che i permessi sono definiti nel manifesto (Android-studio)
  2. assicurarsi che la privacy guard permesso all'applicazione di accedere al microfono (sul dispositivo)
  3. assicurati che il sistema Android abbia impostato le autorizzazioni sotto Settings ->Apps -> Seleziona la tua app ->Permissions -> Verifica tutte le autorizzazioni (dovrebbero essere quelle richieste dal manifest) (sul dispositivo)

Dopo che la ricodifica ha funzionato per me.

2

Per API 23+, controllare il permesso registrare audio in entrambe manifest.XML <uses-permission android:name="android.permission.RECORD_AUDIO" /> e in Java Codice

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

provare questo codice che ti aiuta molto e la sua comprensibile .....

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

L'ho spostato su un'altra discussione. Tutto funziona.

Ecco un codice:

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