# Wie erhalte ich Zugriff auf das Microfon? (Android Studio)



## eniddelemaj (5. Dez 2017)

Ich versuche eine App zu programmieren, mit der man bei Bedarf das Microfon an- und auschalten kann. Bspweise möchte ich per Knopfdruck (z.B. lauter/leise Taste) das Mikrofon bei einem Anruf, an- und ausschalten können. Dazu brauche ich ja zunächst Zugriff auf das Mikrofon.

Ich habe bisher die Klasse 
	
	
	
	





```
MediaRecorder.AudioSource
```
 gefunden, in der die Konstante 
	
	
	
	





```
MIC
```
 zu finden ist.
Weiter bin ich leider nicht gekommen, da ich keine Möglichkeit fand über die Konstante oder deren Klasse, das Mic zu kontrollieren.
Gibt es da nicht eine Klasse/Funktion die dafür gemacht ist das Mic zu kontrollieren?

Ich würde mich Hilfe sehr freuen!
Danke für Eure Antworten.


----------



## sascha-sphw (5. Dez 2017)

Hier ist doch alles, ganz wie man das von Google kennt, bis auf's Detail beschrieben.
https://developer.android.com/guide/topics/media/mediarecorder.html


----------



## eniddelemaj (6. Dez 2017)

Danke für deine Antwort!
Ich kannte die Seite. Ich habe erst gedacht, dass ich damit nur nichts anfangen kann, weil
es mir nicht darum geht, den Ton zu verarbeiten. Ich will lediglich das Mikrofon an- und ausschalten können und
das auch wenn ein Anruf läuft. Ich habe dann dennoch versucht einen Code zurecht zu basteln.

Ich habe jetzt eine App mit zwei Buttons. Der eine soll das Mic anschalten, der andere aus.
Ich habe die Klasse MediaRecorder benutzt und initialisiert:

```
MediaRecorder mRecorder;
mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.UNPROCESSED);
```
... mit Abfrage einder Zugriffsberechtigung..
... dann starte ich die Aufnahme im Clicklistener oder stoppe sie:

```
mRecorder.start()
```
oder

```
mRecorder.stop()
```
;

Ich rufe die Funktionen, die zur Verarbeitung nötig sind, nicht auf. Nach
meinem Verständnis brauche ich dies nicht. Also Funktionen wie:

```
mRecorder.setOutputFormat();
mRecorder.setOutputFile();
mRecorder.setAudioEncoder();
mRecorder.prepare();
```
...brauche ich dann nicht, weil sie der Verarbeitung dienen.

Ich erhalte beim starten in der Konsole eine Fehlermeldung:

```
I/MediaRecorderJNI: start
E/MediaRecorder: start called in an invalid state: 2
I/System.out: Fehler bei start() : java.lang.IllegalStateException
D/ViewRootImpl@ef5f00b[MainActivity]: ViewPostImeInputStage processPointer 0
D/ViewRootImpl@ef5f00b[MainActivity]: ViewPostImeInputStage processPointer 1
D/ViewRootImpl@ef5f00b[MainActivity]: ViewPostImeInputStage processPointer 0
D/ViewRootImpl@ef5f00b[MainActivity]: ViewPostImeInputStage processPointer 1
```

Die App stürzt zwar nicht ab. Aber wegen der Fehlermeldung bezweifle ich, dass
ich das Mic beeinflusse.


----------



## eniddelemaj (6. Dez 2017)

Okay ich habe es jetzt einfach so gemacht, wie es im Link stand. Also habe ich ein File
erstellt in dem das Aufgenommene gespeichert wird. (Ist für mein Ziel überflüssig) Es hat auch geklappt. Ich konnte
starten und stoppen. 
Mein Ziel ist es allerdings das Mikrofon auch während eines laufenden Anrufs zu unterbrechen.
Dies hat allerdings nicht geklappt. Hat jemand dazu eine Lösung?


----------



## sascha-sphw (7. Dez 2017)

Ahh, jetzt habe ich Dich verstanden. Ich dachte Du willst was aufnehmen. 

Schau Dir mal den AudioManager an. Im speziellen die Methode setMicrophoneMute().
https://developer.android.com/reference/android/media/AudioManager.html#setMicrophoneMute(boolean)


----------



## eniddelemaj (7. Dez 2017)

Ah das hört sich vielversprechend an!
Danke! Ich werde schreiben sobald ich Ergebnisse habe


----------



## eniddelemaj (7. Dez 2017)

Okay ich habe jetzt folgenden Code geschrieben:

```
aManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        originalMode = aManager.getMode();

...

if(v.getId() == R.id.onButton)
        {
            System.out.println("Microphone unmuted");
            aManager.setMode(originalMode);
            aManager.setMicrophoneMute(false);
        }
        else
        {
            try {
                System.out.println("Microphone muted");
                aManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
                aManager.setMicrophoneMute(true);
            }
            catch(Exception e)
            {

                System.out.println("Error muting : "+e);
            }

        }
```

Es funktioniert nur leider nicht. Wenn ich einen Anruf durchführe und in
meiner App auf den off Button gehe (setMicrophonemute(true)) passiert leider nichts.
Irgendeine Lösung?


----------



## eniddelemaj (7. Dez 2017)

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

... habe ich auch ins manifest geschrieben


----------



## sascha-sphw (7. Dez 2017)

Ja. Das scheint wohl doch nicht so trivial zu sein.
Habe folgendes dazu gefunden. Hoffe es Hilft.
https://stackoverflow.com/questions/5217437/setmicrophonemuteboolean-doesnt-work-on-some-devices


----------



## truesoul (8. Dez 2017)

Hallo.

Wenn du es für dich selber brauchen solltest dann schaue dir einfach mal Tasker an. 
Da musst du dich ein wenig damit beschäftigen aber da kannst du auf Events (Anruf) reagieren und die Aktion bestimmen (Aufnahme z. B). 

Grüße


----------

