example - android settings activity
android mediaRecorder.setAudioSource falló (15)
Tengo el firmware 1.6 de Android G1, estoy intentando grabar la 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:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
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?
Cambio
<uses-permission android:name="android.permission.RECORD_AUDIO" />
a
<uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>
Trabajó para mi.
Como usuario de CyanogenMod tuve que
- asegúrese de que los permisos estén definidos en el manifiesto (android-studio)
- asegúrese de que la protección de privacidad permitió que la aplicación acceda al micrófono (en el dispositivo)
- asegúrese de que el sistema Android haya establecido los permisos en
Settings
->Apps
-> Seleccione su aplicación ->Permissions
-> Revise todos los permisos (deben ser los solicitados por el manifiesto) (en el dispositivo)
Después de eso la recodificación funcionó para mí.
Eso se ve bien. Asegúrese de que otras aplicaciones no estén utilizando el MIC. Tal vez reinicie el teléfono y vuelva a intentarlo.
Este código me funcionó
mRecorder = new MediaRecorder();
mRecorder.reset();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
IMPORTANTE: durante las últimas horas traté de averiguar cómo comprobar si el MIC se detecta con una aplicación diferente o no. Noté que si se lanzaba 2 direcciones de aplicación a MediaRecorder al mismo tiempo se lanzaba una RuntimeException y no se podría usar el micrófono, a menos que reinicies tu dispositivo (!!) No sé si es la mejor solución pero funciono para mi Tal vez le ahorrará a algunos 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;
}
}
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();
Mi sugerencia podría parecer estúpida, pero funcionó para mí :)
Trate de 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.
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
);
}
Para API 23+, verifique el permiso de grabación de audio en Manifest.xml <uses-permission android:name="android.permission.RECORD_AUDIO" />
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
}
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 de micrófono.
Si está ejecutando en Android M, entonces necesita solicitar permisos para grabar audio en la primera ejecución. Para lograr esto, pregunte al usuario si puede grabar audio cuando se inicie 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
}
}
Solicite el permiso Manifest.permission.RECORD_AUDIO
dinámicamente para Marshmallow y versiones superiores.
Tuve este problema exacto, esto me lo resolvió:
En el dispositivo que utiliza para la depuración, vaya a Configuración -> 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 en almacenamiento externo) estén permitidos.
Al instalar una aplicación que no es a través de Google Play Store, no se le pedirá que otorgue permisos y en algunos teléfonos esto hará que su aplicación de depuración no obtenga algunos permisos otorgados.
Verifique esto incluso si se reconocen algunos permisos en el archivo de manifiesto (como el acceso a Internet) porque para mí algunos funcionaron y otros se bloquearon automáticamente.
Espero que esto ayude.
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;
}
}
Abra " AndroidManifest.xml
" ->
añadir
<uses-permission android:name="android.permission.RECORD_AUDIO" />