# MediaRecorder setAudioSource() --> "App angehalten"



## tommey (4. Nov 2012)

Hallo, ich versuche mich gerad daran, Daten über den Klinkenanschluss meines Galaxy S2
einzulesen. Leider sind das meine ersten Gehversuche mit Android.
Dazu habe ich mir die API android.media angesehen.

So richtig weiß ich noch nicht, wie ich den Microfoneingang des Klinkenanschlusses ansprechen kann.
Hab mich deshalb mal an der MediaRecord Klasse versucht und einfach das simple Hello World Bsp
von der AndriodSDK Website insofern abgeändert, dass ich einfach ein Objekt vom Typ MediaRecord
erstelle und als Quelle das Mikrofon wähle.

Nun hab ich gemerkt, dass das auswählen der Quelle die App auf dem Handy zum Absturz bringt. Lass ich die Zeile weg, funktioniert es einwandfrei.


```
package com.example.myfirstapp;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.TextView;

public class DisplayMessageActivity extends Activity {
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);

	    // Get the message from the intent
	    Intent intent = getIntent();
	    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
	    


	    MediaRecorder temperaturMesser = new MediaRecorder();
    //DIE FOLGENDE ZEILE MAG ER NICHT
            temperaturMesser.setAudioSource(MediaRecorder.AudioSource.MIC);
	    

	    // Create the text view
	    TextView textView = new TextView(this);
	    textView.setTextSize(40);
	    textView.setText(String.valueOf(message));

	    // Set the text view as the activity layout
	    setContentView(textView);
	}
}
```

Hat jemand eine Idee, warum das nicht geht?

Hat jemand eine andere Idee den Klinken Mikrofoneingang anzusteuern?


----------



## schlingel (5. Nov 2012)

Wie sieht denn die Exception aus?


----------



## tommey (5. Nov 2012)

Das hat sich erstmal erledigt. Durch die Zeile


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

läuft das Ganze.

Das nächste Problem ist aber, dass ich versuche mir die Max Amplitude auszugeben, es aber
bei 0.0 bleibt. ich hab 500mV angeschlossen. Sie liegen direkt an einem Klinkenstecker am Mikrofon Pin nach Wikipedia 4pol. Klinkenstecker an.


```
public class SoundMeter {
        static final private double EMA_FILTER = 0.6;

        private MediaRecorder mRecorder = null;
        private double mEMA = 0.0;

        public void start() {
                if (mRecorder == null) {
                        mRecorder = new MediaRecorder();
                        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    mRecorder.setOutputFile("/dev/null"); 
                    mRecorder.prepare();
                    mRecorder.start();
                    mEMA = 0.0;
                }
        }
        
        public void stop() {
                if (mRecorder != null) {
                        mRecorder.stop();       
                        mRecorder.release();
                        mRecorder = null;
                }
        }
        
        public double getAmplitude() {
                if (mRecorder != null)
                        return  (mRecorder.getMaxAmplitude()/2700.0);
                else
                        return 0;

        }

        public double getAmplitudeEMA() {
                double amp = getAmplitude();
                mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
                return mEMA;
        }
}
```

So sieht meine Anwendung dann dazu aus:


```
public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);

	     //Soundmeter starten 
	    SoundMeter soundMeter = new SoundMeter();
	    soundMeter.start();
	    

	    // Create the text view
	    TextView textView = new TextView(this);
	    textView.setTextSize(40);
	    textView.setText(String.valueOf(String.valueOf(soundMeter.getAmplitude())));
	    setContentView(textView);

        //Soundmeter stoppen
	    soundMeter.stop();


	}
```


----------



## tommey (5. Nov 2012)

ZUM PROBLEM: getMaxAmplitude() gibt nur 0 zurück

OK, also ich hab jetzt erstmal sichergestellt, dass am Mikroeingang ein Signal vom Frequenzgenerator anliegt und nicht geclippt wird.

Mit einer app aus dem Market hab ich das auch aufgenommen.

Jetzt hab ich noch gefunden, dass die Methode getMaxAmplitude() als Rückgabewert die Differenz zwischen dem aktuellen Aufruf und dem davor hat. Ich teste das jetzt noch mal und melde mich wieder.
Für Anmerkungen bin ich trotzdem dankbar


----------

