bazeniancodeAvatar border
TS
bazeniancode
Record Audio dengan efek amplitude meter/ desible meter

Maaf kalo repost..
Tidak ada maksud menggurui, ini sekedar share saja berdasar pretelan2 fitur dalam project yg sedang ane kerjakan.

Untuk membuat aplikasi Record Audio, sebenarnya di Android sendiri sudah ada intent bawaan yang siap pakai dan sangat keren pula tampilan UInya. Kita hanya perlu menangkap resultan datanya pada event onActivityResult().

Namun kelemahan dari intent adalah, susah menentukan output file formatnya(CMIIW mungkin krn ane aj yg belum mastah).

Tapi sebenarnya kita juga dapat membuat sendiri intent RecordAudio sendiri termasuk efek amplitude meternya.

langsung saja ke tkp berikut layout xmlnya
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android/:p/addingBottom="@dimen/activity_vertical_margin"
android/:p/addingLeft="@dimen/activity_horizontal_margin"
android/:p/addingRight="@dimen/activity_horizontal_margin"
android/:p/addingTop="@dimen/activity_vertical_margin"
tools:context=".RecordAudioActivity" >

<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="185dp"
android:textSize="12sp"
android:text="Start" />

<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/btnStart"
android:layout_alignParentBottom="true"
android:layout_marginBottom="185dp"
android:textSize="12sp"
android:enabled="false"
android:text="Stop" />

<RelativeLayout
android:layout_width="22dp"
android:layout_height="120dp"
android/:p/adding="2dp"
android:layout_above="@+id/btnStop"
android:layout_centerHorizontal="true"
android:background="#000000"
android:layout_marginBottom="18dp">
<RelativeLayout
android:id="@+id/relativeMeter"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:background="#19FF34"
android:layout_alignParentBottom="true" >
</RelativeLayout>
</RelativeLayout>

</RelativeLayout>


dari Mari perhatikan bagian yg ini. Layout ini sy beri id = relativeMeter
Code:
<RelativeLayout
android:id="@+id/relativeMeter"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:background="#19FF34"
android:layout_alignParentBottom="true" >
</RelativeLayout>

layout ini yg akan dijadikan amplitude meter..
yup go coding
Code:
package com.hangga.amplitudometer;

import java.io.IOException;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Timer;
import java.util.TimerTask;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class RecordAudioActivity extends Activity {

RelativeLayout relativeMeter;

MediaRecorder recorder;
Timer timer;

TextView risultato;
Button btnStart;
Button btnStop;

String filePath = null;

int yAmplitudo;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

relativeMeter = (RelativeLayout) findViewById(R.id.relativeMeter);

btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);

recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//recorder.setOutputFile("/dev/null");
filePath = "/sdcard/"+getRandomString()+".m4a";
recorder.setOutputFile(filePath);

try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

btnStart.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
recorder.start();
timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 300);
btnStart.setEnabled(false);
btnStop.setEnabled(true);
}
});

btnStop.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
goStop();
}
});

}

private void goStop(){
recorder.stop();
recorder.release();
timer.cancel();
timer.purge();
btnStart.setEnabled(true);
btnStop.setEnabled(false);
Toast.makeText(getApplicationContext(), "Saved : "+filePath, Toast.LENGTH_SHORT).show();
finish();
}

private class RecorderTask extends TimerTask{
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder){
this.recorder = recorder;
}
public void run(){
runOnUiThread(new Runnable() {
@Override
public void run() {
yAmplitudo = recorder.getMaxAmplitude()/ 100;
RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) relativeMeter.getLayoutParams();
param.height = yAmplitudo;
relativeMeter.setLayoutParams(param);
}
});
}
}

public String getRandomString() {
SecureRandom random = new SecureRandom();
String randomString = new BigInteger(130, random).toString(32);
return(randomString);
}
}


mari perhatikan bagian ini
Code:
private class RecorderTask extends TimerTask{
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder){
this.recorder = recorder;
}
public void run(){
runOnUiThread(new Runnable() {
@Override
public void run() {
yAmplitudo = recorder.getMaxAmplitude()/ 100;
RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) relativeMeter.getLayoutParams();
param.height = yAmplitudo;
relativeMeter.setLayoutParams(param);
}
});
}
}

ane memanfaatkan TimerTask untuk mendapatkan nilai amplitudo kemudian merubah width layout relativeMeter sesuai dg nilai amplitudonya melakukan secara kontinyu. Sehingga membuat efek amplitude meter. Memang ane akui ini adalah cara bodoh. Tp berhasil.

Source code dapat agan download di sinisini
Diubah oleh bazeniancode 05-06-2013 06:20
0
952
0
GuestAvatar border
Guest
Tulis komentar menarik atau mention replykgpt untuk ngobrol seru
GuestAvatar border
Guest
Tulis komentar menarik atau mention replykgpt untuk ngobrol seru
Komunitas Pilihan