2010-09-23 36 views
57

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

 
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:

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

que tengo:

 
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) 

¿Cómo grabo la voz correctamente?

+4

Es hora de cambiar la respuesta aceptada ... – Noumenon

Respuesta

1

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

0

Mi sugerencia podría parecer estúpido, pero funcionó para mí :)

trate de darle el 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.

+0

cuál es su punto de dar etiqueta anidada, puede ser que usted está hablando acerca de la , en el manifiesto – IronBlossom

4

IMPORTANTE - durante las últimas horas he tratado de encontrar la manera de comprobar si el MIC es capturado 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á algunos de ustedes unas horas algunos días ..

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

abierto "AndroidManifest.xml" ->

añadir

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

Geeze, Ojalá hubiera uniformidad en los nombres de los permisos. 'android.permission.RECORD_AUDIO' es genial, si también hay' android.permission.RECORD_VIDEO', pero no, hay 'android.permission.CAMERA' que conduce obviamente a' android.permission.MICROPHONE' que por supuesto no existe. Maldiciones – nmr

+1

También vea la carcasa. En Android Studio, ingresó automáticamente el nombre en mayúscula de la constante "ANDROID_PERMISSION.RECORD_AUDIO", ¡pero eso no funciona! –

+2

Si olvidó esto, es posible que también haya olvidado '' para almacenar el archivo de audio. – Noumenon

-10

Cambio

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

a

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

Funcionó para mí.

+6

Los que evalúan lo mismo. El primero es de cierre automático – jprofitt

+0

@xpq ¿Qué diablos estás haciendo aquí, este es el mismo –

0

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

+0

En el futuro, estas preguntas son más adecuadas para los comentarios. Por el momento: tener alguna representación para poder comentar en el futuro. –

1

Este código trabajado para mí

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

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

En el dispositivo se utiliza para la depuración ir a Ajustes -> Aplicaciones -> {su 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.

Actualmente, al instalar una aplicación que no es a través de Google Play Store, no se le pide que conceda permisos y en algunos teléfonos esto hará que su aplicación de depuración no obtenga algunos permisos otorgados.

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

Espero que esto ayude.

33

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 micrófono.

+8

Información sobre cómo solicitar permisos individuales en tiempo de ejecución: http://developer.android.com/training/permissions/requesting.html –

7

Si está ejecutando en Android M, necesita solicitar permisos para grabar audio en la primera ejecución. Para lograr esto, preguntar al usuario si se puede grabar audio cuando se inicia 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 
    } 
} 
+1

Cambiar ** READ ** constante a * * ESCRIBA **. – Amir

+0

Esto funcionó conmigo. Gracias. Apreciado. – user1510006

2

por favor solicite permiso Manifest.permission.RECORD_AUDIO dinámica de malvavisco y por encima de la versión.

2

Para 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 
    ); 
} 
0

Como CyanogenMod-usuario tuviera que

  1. asegurarse de que los permisos se definen en el manifiesto (android-estudio)
  2. hacen que el protector de privacidad que la aplicación acceda al micrófono (en el dispositivo)
  3. asegúrate de que el sistema android haya establecido los permisos en Settings -> -> Selecciona tu aplicación ->Permissions -> Marca todos los permisos (deben ser los solicitados por el manifiesto) (en el dispositivo)

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

2

Para API 23+, comprobar el permiso de grabación de audio, tanto en Manifest.xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> y en Java Código

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

probar este código le 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; 
    } 
} 
0

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