android mediaRecorder.setAudioSource falló

Tengo el firmware 1.6 de Android G1, estoy tratando de grabar voz desde la aplicación con el siguiente código.

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

mi manifest.xml tiene:

 

Tengo:

 09-23 14: 41: 05.531: ERROR / AndroidRuntime (1718): controlador no capturado: el hilo principal sale debido a una excepción no detectada
 09-23 14: 41: 05.551: ERROR / AndroidRuntime (1718): java.lang.RuntimeException: setAudioSource falló.
 09-23 14: 41: 05.551: ERROR / AndroidRuntime (1718): en android.media.MediaRecorder.setAudioSource (método nativo)

¿Cómo grabo mi voz correctamente?

Abra ” AndroidManifest.xml ” ->

añadir

  

Sé que esta es una pregunta muy antigua, pero en Android Marshmallow tienes que ir a “Configuración> Aplicaciones> Tu aplicación> Permisos” y habilitar el permiso del micrófono.

Si está ejecutando en Android M, necesita solicitar permisos para grabar audio en la primera ejecución. Para lograr esto, pregúntele al usuario si puede grabar audio cuando comience la aplicación:

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

IMPORTANTE: durante las últimas horas traté de averiguar cómo verificar si el MIC es captado por una aplicación diferente o no. Me di cuenta de que si 2 direcciones de la aplicación a MediaRecorder al mismo tiempo se lanzará una RuntimeException y no podrás usar el micrófono, a menos que reinicies tu dispositivo (!!) no sé si es la mejor solución, pero funcionó para mí. tal vez ahorrará algunas de ustedes algunas horas algún día …

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

Tuve este problema exacto, esto lo resolvió para mí:

En el dispositivo que utilizas para eliminar errores, ve a Configuración -> Aplicaciones -> {tu aplicación}. Luego, asegúrese de que todos los permisos de la aplicación (en este caso, Grabación de audio y Escritura de almacenamiento externo) están permitidos.

Por lo que respecta a la instalación de una aplicación que no se realiza a través de Google Play Store, no se le pide que conceda permisos y, en algunos teléfonos, la aplicación de depuración no recibirá algunos permisos.

Comprueba esto incluso si algunos permisos en el archivo de manifiesto son reconocidos (como acceso a internet) porque para mí algunos funcionaron y algunos se bloquearon automáticamente.

Espero que esto ayude.

Solicite el permiso Manifest.permission.RECORD_AUDIO dinámicamente para Marshmallow y la versión anterior.

Para la API 23+ necesita solicitar los permisos de lectura / escritura, incluso si ya están en su manifiesto.

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

Para API 23+, verifique el permiso de grabación de audio en Manifest.xml y en Java Code

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

Eso se ve correcto Asegúrese de que otras aplicaciones no estén utilizando el MIC. Tal vez le recomience el teléfono y vuelva a intentarlo.

Este código funcionó para mí

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

Mi sugerencia puede parecer estúpida, pero funcionó para mí 🙂

Intenta dar permiso como una etiqueta anidada. Creo que hay un problema de análisis xml en algún lugar con la biblioteca de paquetes de Android.

La respuesta “validateMicAvailability () arroja la excepción MicUnaccessibleException” no funciona para mí. La excepción MicUnaccessibleException no parece existir. ¿Estoy malentendiendo algo?

Como usuario de Cyanogenmod, tuve que

  1. asegúrese de que los permisos estén definidos en el manifiesto (android-studio)
  2. asegúrese de que el protector de privacidad permita que la aplicación acceda al micrófono (en el dispositivo)
  3. asegúrese de que el sistema de Android haya configurado los permisos en Settings -> Apps -> Seleccione su aplicación -> Permissions -> Verifique todos los permisos (deberían ser los solicitados por el manifiesto) (en el dispositivo)

Después de eso, la reencoding funcionó para mí.

prueba este código, te ayuda mucho y es comprensible …

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

Lo moví a otro hilo. Todo funciona.

Aquí hay un código:

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

Cambio

  

a

  

Trabajó para mi.