2016-07-30 5 views
-1

Когда я пытаюсь работать, это шоу на textviev значение «0.0». я получаю коды с этого веб-сайта в основном я получаю разрешение на <uses-permission android:name="android.permission.RECORD_AUDIO" /> разрешения поддавки Реланиум устанавливающих-приложений-микрофонных он возвращается значение «0,0» , как на самом деле работает getAmplitude(); может кто-нибудь объяснитьgetAmplitude не работает

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

Я попытался исправить ваше сообщение, но это все еще непонятно. Попробуйте [this] (http://meta.stackoverflow.com/questions/291362/advice-for-non-native-english-speakers/291370#291370), это может помочь. – peterh

ответ

0

От MediaRecorder documentation, getMaxAmplitude() изображает:

Возвращает максимальную абсолютную амплитуду, которая сэмпл с момента последнего вызова этого метода. Вызовите это только после setAudioSource().

Возвращает: максимальная абсолютная амплитуда измеряется с момента последнего вызова, или 0 при вызове в первый раз

Вот почему вы получите 0 в первый раз, вы называете его в onCreate().

Запрос на регулярной основе, если вы хотите, как это то, что предполагает наличие вашей Runnable, вот пример планирования ваших getAmplitudeEMA() каждые 500мс:

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

И в stop()/onPause():

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

İt теперь работает –