Recorder.
Quale è l'oggetto che dobbiamo istanziare per registrare la voce?
Ecco, dichiaro una variabile di tipo MediaRecorder e una di tipo MediaPlayer, con le relative "importazioni" richieste da Eclipse.
public class MainActivity extends Activity{
private MediaPlayer mPlayer;
private MediaRecorder mRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Quindi devo istanziare le variabili.
Come si fa?
Ecco, predispongo un Button che istanzia l'oggetto:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecorder =new MediaRecorder();
}
});
Ma adesso bisogna
settare alcune cose di questo neonato MediaRecorder...
Lo faccio pedissequamente, senza pensarci troppo: capirò in seguito.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecorder =new MediaRecorder();
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"mioFile.3gp");
try{
mRecorder.prepare();
catch(Exception e){
Log.d("prepare","failed");
}
}
}
});
E quindi inizia:
public class MainActivity extends Activity{
private MediaPlayer mPlayer;
private MediaRecorder mRecorder;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mRecorder =new MediaRecorder();
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"mioFile.3gp");
try{
mRecorder.prepare();
}catch(Exception e){
Log.d("errore", "Prepare failed!");
}
mRecorder.start();
}
});
}
}
Ho avuto un po' di problemi.
Per prima cosa, leggo che nel
Manifest vanno impostati dei permessi, di cui non mi ero accorto prima (anche se ci avevo pensato per poi scordarmene...):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.laboratorio"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-sdk
android:minSdkVersion="18"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
...quindi sembra che abbia messo in sequenza sbagliata alcuni settaggi (la cui natura mi è ancora ignota): inizialmente, con questa sequenza...
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"mioFile.3gp");
...ho avuto un messaggio di errore:
03-12 14:56:52.930: E/MediaRecorder(16135): try to set the audio encoder without setting the audio source first
Allora ho cambiato:
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"mioFile.3gp");
e ho ottenuto:
03-12 15:13:32.585: E/MediaRecorder(18394): setAudioEncoder called in an invalid state(2)
Cambio ancora:
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"mioFile.3gp");
Ed è sempre lui:
03-12 15:17:28.156: E/MediaRecorder(18958): start called in an invalid state: 4
Ma ecco che sull'impagabile StackOverflow leggo
"check if you have output file path set and if it really exists.", e penso che forse il path del file di destinazione non è scritto bene in quanto ci manga uno slash!
Ci metto lo slash:
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/mioFile.3gp");
...
E finalmente funziona!!!