Método para comprobar si ha micro en el teléfono/tablet

1,340 views
Skip to first unread message

Javier Hdez

unread,
Jun 12, 2012, 7:58:32 AM6/12/12
to android...@googlegroups.com
Hola,

¿Hay algún método para comprobar si el teléfono o tablet tiene micro?

En AudioManager lo único que he visto es uno para el mute pero no para saber si tiene un micrófono.

public boolean isMicrophoneMute ()

Since: API Level 1

Checks whether the microphone mute is on or off.

Returns
  • true if microphone is muted, false if it's not
Saludos

Saul Diaz

unread,
Jun 12, 2012, 8:11:08 AM6/12/12
to android...@googlegroups.com
Supongo que cuando configures 


MediaRecorder recorder = new MediaRecorder();
 recorder
.setAudioSource(MediaRecorder.AudioSource.MIC);

es probable que te devuelva una excepción si no existe; pero no se si hay algo que activamente te diga si hay o no. Es posible (aunque no sea realista) que se de por supuesto que siempre va a existir un sistema de voz y sonido? :/

Atentamente
Saúl Díaz González

Fernando F. Gallego

unread,
Jun 12, 2012, 8:29:04 AM6/12/12
to android...@googlegroups.com
Puedes probar esto:

getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE);

Si no funciona pruebalo poniendo en el AndroidManifest <uses-feature android:name="android.hardware.microphone" android:required="false" />

Saludos.

Javier Hdez

unread,
Jun 12, 2012, 8:40:16 AM6/12/12
to android...@googlegroups.com
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

Siempre lo he tenido así y aunque la tablet no tenga micro (físico), "graba" lo que cuando se reproduce no se escucha nada, pero nunca ha lanzado una excepción.

                        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Gracias,

Saludos.

Javier Hdez

unread,
Jun 12, 2012, 8:44:08 AM6/12/12
to android...@googlegroups.com
Voy a probar, suena bien

Saludos

Javier Hdez

unread,
Jun 12, 2012, 11:00:06 AM6/12/12
to android...@googlegroups.com
Pues parece que no funciona, sino es que está el código mal:

Código:

public class CheckMicActivity extends Activity {
    private Button boton;
    private TextView txvEstadoMute;
    
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        boton = (Button)findViewById(R.id.botonCheck);
        txvEstadoMute = (TextView)findViewById(R.id.txvEstado);
        
        boton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// Comprueba si el terminal dispone de Micrófono
boolean elMIC = getPackageManager().hasSystemFeature(getPackageManager().FEATURE_MICROPHONE);
if(elMIC == true){
txvEstadoMute.setText("Este dispositivo SI dispone de Micrófono");
} else {
txvEstadoMute.setText("Este dispositivo NO dispone de Micrófono");
}
}
});
    }
}


Layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".CheckMicActivity"
    tools:ignore="HardcodedText" >

    <Button
        android:id="@+id/botonCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="fill"
        android:text="@string/comprobar_micr_fono" />

    <TextView
        android:id="@+id/txvLabelEstado"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Disponibilidad" />

    <TextView
        android:id="@+id/txvEstado"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

</LinearLayout>

Manifest:

<?xml version="1.0" encoding="utf-8"?>
    package="com.ejemplos"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15"/>
    <uses-feature android:name="android.hardware.microphone" android:required="false" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".CheckMicActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Así en el emulador y en una Tablet sin Micrófono, me dice:

Este dispositivo SI dispone de Micrófono


Saludos!

Fernando F. Gallego

unread,
Jun 12, 2012, 11:59:21 AM6/12/12
to android...@googlegroups.com
Si pones en tu avd que no dispones de grabación de audio, cambia algo?

Imágenes integradas 1
image.png

Javier Hdez

unread,
Jun 12, 2012, 12:27:00 PM6/12/12
to android...@googlegroups.com
Ya probé y dice que SI tiene micro.

En la tablet, que no tiene micrófono, también dice que SI tiene.

Saul Diaz

unread,
Jun 12, 2012, 12:39:03 PM6/12/12
to android...@googlegroups.com
Qué modelo es la tablet?

Atentamente
Saúl Díaz González

Esteban Alcalde

unread,
Jun 12, 2012, 12:47:12 PM6/12/12
to android...@googlegroups.com

Javier Hdez Deniz

unread,
Jun 12, 2012, 12:48:56 PM6/12/12
to android...@googlegroups.com
La Galileo de BQreaders

Javier Hdez Deniz

unread,
Jun 12, 2012, 12:51:10 PM6/12/12
to android...@googlegroups.com
Sí bueno estoy haciendo pruebas con esto:

                               PackageManager pm = getPackageManager();
List<ResolveInfo> actividades = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if(actividades.size() != 0 ){
txvEstadoMute.setText("Este dispositivo SI dispone de Micrófono");
} else {
txvEstadoMute.setText("Este dispositivo NO dispone de Micrófono");
}


Y parece que funciona, ahora dice que NO tiene micro, pero estoy reiniciando el emulador con el soporte a yes, a ver si cambia.

Esteban Alcalde

unread,
Jun 12, 2012, 12:54:41 PM6/12/12
to android...@googlegroups.com
Supongo que tiene su lógica ( un poco rebuscada jeje ).

Un saludo

Fernando F. Gallego

unread,
Jun 12, 2012, 1:06:32 PM6/12/12
to android...@googlegroups.com
No os da la sensación aveces que android está sin acabar?

Javier Hdez

unread,
Jun 12, 2012, 1:07:54 PM6/12/12
to android...@googlegroups.com
Pues no cambia, ahora siempre me dice que NO. 

De todas formas esto no creo que me sirva porque eso comprueba también que haya instalado un engine para el speech ¿o no es así? y yo solo quiero saber si tiene micro (para grabar) no para convertir voz a texto.

Lo que necesito es algo como en linux, "lspci -knn | grep -i audio"

Lo podría poner así en java con un exec pero es que no se si existirá un atributo para el micro, porque con el 'audio' solo aparecen las tarjetas, igual que con 'vga' 'network' etc.. pe

De todas formas le echaré un vistazo al link que me pasas de stackoverlow a ver si hay algo que no esté en la doc de android.

Gracias y saludos.

Esteban Alcalde

unread,
Jun 12, 2012, 1:16:43 PM6/12/12
to android...@googlegroups.com

Parece que es de lo que se quejan en el post que te he pasado, dicen que parece un api  inacabado. Capturar la excepción no parece muy elegante

Javier Hdez

unread,
Jun 12, 2012, 2:02:14 PM6/12/12
to android...@googlegroups.com
¿y alguien sabrá como se detecta si un pc o laptop tiene micro? (con herramientas gnu)

Javier Hdez

unread,
Jun 12, 2012, 2:53:31 PM6/12/12
to android...@googlegroups.com
Acabo de probar el mismo código en un S Galaxy II (que tiene micro) y dice que SI tiene.

Parece que funciona, pero no sé si utilizarlo en la aplicación para comprobar si tiene micro porque no me convence mucho, no sé si luego daría más problemas que el que hay.

Javier Hdez

unread,
Jun 13, 2012, 4:53:26 PM6/13/12
to android...@googlegroups.com
Hola,

Al final he implementado lo del speech para comprobar si hay micro o no, es que no he encontrado otra fórmula. Ya les comentaré si funcionó o no cuando haga más pruebas con otros terminales.

Gracias por las ayudas.

Saludos


PD:  No sé si alguien ha experimentado algún problema a la hora de grabar con terminales que tengan ICS, es que el código que utilizo hasta ahora siempre ha funcionado desde la 4 hasta la 15 pero me dicen que en una tablet con ICS 14 no graba, y han verificado con grabadoras del Play y si graba, y he preguntado por si lanza algún ANR o algo pero dicen que nada, el código es éste:

                        recorder = new MediaRecorder();
recorder.setOnErrorListener(errorListener);
recorder.setOnInfoListener(infoListener);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setMaxDuration(120000);
recorder.setOutputFile(getFilename());

(me parece extraño, no sé si alguien sabrá dónde está el error, o sí el error es de esa tablet no sé ya)

Javier Hdez

unread,
Jun 13, 2012, 4:54:08 PM6/13/12
to android...@googlegroups.com
¿Podrá tener algo que ver con el Encoder?

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
Reply all
Reply to author
Forward
0 new messages