2016-07-30 9 views
-1

Wenn ich versuche zu arbeiten ist es auf textviev "0.0" Wert angezeigt. ich Codes von dieser Website meist ich Berechtigungen <uses-permission android:name="android.permission.RECORD_AUDIO" /> Ich gebe die Erlaubnis zur Einrichtung-Anwendungen-mic es zurückgegebene Wert „0,0“ wie wirklich funktioniert getAmplitude(); kann jemand erklärengetAmplitude funktioniert nicht

static final private double EMA_FILTER = 0.6; 
TextView text; 
Button buton; 
Handler handler; 
boolean state = false; 
@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_karpuz_sec); 
    text = (TextView) findViewById(R.id.text); 
    buton = (Button) findViewById(R.id.button); 
    handler = new Handler(); 
    buton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(!state){ 
       try { 
        start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      else 
       stop(); 
     } 
    }); 
} 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     while (!state){ 
      text.setText(Double.toString(getAmplitudeEMA()));; 
      handler.postDelayed(this,100); 
     } 
    } 
}; 

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

public void start() throws IOException { 
    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; 
     state = true; 
     Toast.makeText(getApplicationContext(),"Ses Ölçümü Başladı",Toast.LENGTH_SHORT).show(); 
     buton.setText("DURDUR"); 
     text.setText(Double.toString(getAmplitudeEMA())); 

    } 
} 

public void stop() { 
    if (mRecorder != null) { 
     mRecorder.stop(); 
     mRecorder.release(); 
     mRecorder = null; 
     state = false; 
     Toast.makeText(getApplicationContext(),"Ses Ölçümü Durdu",Toast.LENGTH_SHORT).show(); 
     buton.setText("BAŞLAT"); 
    } 
} 

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; 
} 

}

+0

Ich habe versucht, Ihren Beitrag zu beheben, aber es ist immer noch unverständlich. Versuchen Sie [dies] (http://meta.stackoverflow.com/questions/291362/advice-for-non-native-english-speakers/291370#291370), es kann helfen. – peterh

Antwort

0

Von MediaRecorder documentation, getMaxAmplitude() zeigt:

Gibt die maximale absolute Amplitude, die seit dem letzten Aufruf dieser Methode abgetastet wurde. Rufen Sie dies erst nach der setAudioSource() auf.

Returns: die maximale seit dem letzten Aufruf gemessene absolute Amplitude oder 0, wenn zum ersten Mal genannt

diesem Grund sollten Sie 0 das erste Mal, wenn Sie in Ihrem onCreate() nennen es.

Antrag auf regelmäßig, wenn Sie wollen, wie das ist, was die Anwesenheit Ihres Runnable schon sagt, hier ist ein Beispiel Ihre getAmplitudeEMA() alle 500ms Planung:

private Timer mTimer = new Timer(); 

..... 

mTimer.scheduleAtFixedRate(new TimerTask() { 

    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       text.setText(Double.toString(getAmplitudeEMA())); 
      } 
     }); 
    } 

}, 0, 500); 

Und in stop()/onPause():

mTimer.cancel(); 
mTimer.purge(); 
+0

Es funktioniert jetzt Danke –