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 firstAllora 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: 4Ma 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!!!
Nessun commento:
Posta un commento