2012-02-17 110 views
1

我正試圖獲得錄製的聲音的最大幅度。 我做了一個很好的聲音記錄器,但是當我使用getMaxAmplitude獲取振幅時,它總是返回0. 我看遍了整個互聯網,但無法找到一個可行的解決方案,所以我希望有人可以幫助我,因爲我卡在atm。 請記住我是一個初學者;)getMaxAmplitude返回0 - Android

這裏是我的代碼:

import java.io.IOException;  

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class vumeter extends Activity{ 
    private static final String LOG_TAG = "AudioRecordTest"; 
    protected static final String TAG = null; 
    private static String mFileName = null; 
    private RecordButton mRecordButton = null; 
    private MediaRecorder mRecorder = null; 
    private PlayButton mPlayButton = null; 
    private MediaPlayer mPlayer = null; 
    public Handler mHandler; 
    public int currentAmplitude; 
    public boolean activeThread; 

    private void onRecord(boolean start) { 
     if (start) { 
      startRecording(); 
     } else { 
      stopRecording(); 
     } 
    } 

    private void onPlay(boolean start) { 
     if (start) { 
      startPlaying(); 
     } else { 
      stopPlaying(); 
      } 
    } 

    private void startPlaying() { 
     mPlayer = new MediaPlayer(); 
     try { 
      mPlayer.setDataSource(mFileName); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     } catch (IOException e) { 
       Log.e(LOG_TAG, "prepare() failed"); 
      } 
    } 

    private void stopPlaying() { 
     mPlayer.release(); 
     mPlayer = null; 
    } 

    private void startRecording() { 
     if (mRecorder == null) { 

     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mRecorder.setOutputFile(mFileName); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     } 

     try { 
      mRecorder.prepare(); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 

     mRecorder.start(); 

    } 

    private void stopRecording() { 
     mRecorder.stop(); 
     mRecorder.release(); 
     activeThread = true; 
     mRecorder = null; 
    } 


    public void run() { 
     int i = 0; 
     while(i == 0) { 
      Message msg = mHandler.obtainMessage(); 
      Bundle b = new Bundle(); 
      try { 
       Thread.sleep(250); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if (mRecorder != null) { 
       currentAmplitude = mRecorder.getMaxAmplitude(); 
       b.putLong("currentTime", currentAmplitude); 
       Log.i("AMPLITUDE", new Integer(currentAmplitude).toString()); 
      } else { 
       b.putLong("currentTime", 0); 
      } 
      msg.setData(b); 
      mHandler.sendMessage(msg); 
     } 
    } 

    class RecordButton extends Button { 
     boolean mStartRecording = true; 

     OnClickListener clicker = new OnClickListener() { 
      public void onClick(View v) { 
       onRecord(mStartRecording); 
       if (mStartRecording) { 
        setText("Stop recording"); 
       } else { 
        setText("Start recording"); 
       } 
       mStartRecording = !mStartRecording; 
      } 
     }; 

     public RecordButton(Context ctx) { 
      super(ctx); 
      setText("Start recording"); 
      setOnClickListener(clicker); 
     } 
    } 

    class PlayButton extends Button { 
     boolean mStartPlaying = true; 

     OnClickListener clicker = new OnClickListener() { 
      public void onClick(View v) { 
       onPlay(mStartPlaying); 
       if (mStartPlaying) { 
        setText("Stop playing"); 
       } else { 
        setText("Start playing"); 
       } 
       mStartPlaying = !mStartPlaying; 
      } 
     }; 

     public PlayButton(Context ctx) { 
      super(ctx); 
      setText("Start playing"); 
      setOnClickListener(clicker); 
     } 
    } 

    public vumeter() { 
     mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     mFileName += "/audiorecordtest.3gp"; 
    } 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     LinearLayout ll = new LinearLayout(this); 
     mRecordButton = new RecordButton(this); 
     ll.addView(mRecordButton, 
      new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       0)); 
     mPlayButton = new PlayButton(this); 
     ll.addView(mPlayButton, 
      new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       0)); 
     TextView tv = new TextView(this); 
     ll.addView(tv, 
       new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT, 
        0)); 
     tv.setText(Integer.toString(currentAmplitude)); 
     setContentView(ll); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (mRecorder != null) { 
      mRecorder.release(); 
      mRecorder = null; 
     } 

     if (mPlayer != null) { 
      mPlayer.release(); 
      mPlayer = null; 
     } 
    } 
+0

如果找到它,請編寫您的解決方案。 – 2016-01-01 11:06:48

回答

0

你不會在任何地方打電話給你的run()方法。您shuld而創建線程使用這種方法:在你選擇的方法

private Thread thread = new Thread() { 
    @Override 
    public void run() {//... 
     } 
    } 
}; 

,啓動這個線程,爲examplre,的startRecording()。不要忘記插入()它。而且,你最好在無限循環中添加一個檢查標誌。