Я делаю приложение для измерения скорости ветра на основе шума входа микрофона. Запись шума и калькулятоина в децибеллы работает нормально. Я хочу отобразить значение newAmplitude в TextView с именем amptv . Отображается только 0, потому что newAmplitude равно 0 при onCreate.
Как я могу изменить текст TextView на значение newAmplitude после того, как я нажму кнопку остановки записи ??
Поскольку onclicklistener находится в своем собственном классе, я не могу сделать это только с помощью amptv.setText (newAmplitude);
Это последнее, что я пробовал, также пробовал некоторые другие вещи, но они тоже не сработали.
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;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
currentAmplitude = mRecorder.getMaxAmplitude();
Log.i(TAG, "handleMessage : MaxAmplitude : " + currentAmplitude);
newAmplitude = 20 * Math.log(currentAmplitude);
Log.i(TAG, "nieuwe amplitude : " + newAmplitude);
}
};
private Timer timer = new Timer();
private TimerTask timerTask = null;
private int currentAmplitude;
private double newAmplitude = 5.0;
public TextView amptv;
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 synchronized 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();
timer.schedule(timerTask = new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
}, 250, 250);
}
private synchronized void stopRecording() {
if (timerTask != null) {
timerTask.cancel();
timerTask = null;
}
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText("Stop measuring");
} else {
setText("Start measuring");
amptv.setText(newAmplitde);
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText("Start measuring");
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 amptv = new TextView(this);
ll.addView(amptv, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));
amptv.setText(Double.toString(newAmplitude));
setContentView(ll);
}
@Override
public void onPause() {
super.onPause();
if (mRecorder != null) {
mRecorder.release();
mRecorder = null;
}
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_options_menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.help:
startActivity(new Intent(this, InfoMeter.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
надеюсь, кто-нибудь может мне помочь, я новичок в Java, и я действительно застрял в.
Это моя вторая попытка, все равно выдается ошибка, когда я нажимаю кнопку остановки записи.
class RecordButton extends Button {
boolean mStartRecording = true;
OnClickListener clicker = new OnClickListener() {
public void onClick(View v) {
onRecord(mStartRecording);
if (mStartRecording) {
setText("Stop measuring");
} else {
setText("Start measuring");
vumeter.this.amptv.setText(Double.toString(vumeter.this.newAmplitude));
}
mStartRecording = !mStartRecording;
}
};
public RecordButton(Context ctx) {
super(ctx);
setText("Start measuring");
setOnClickListener(clicker);
}
}