JavascriptProva

sabato 12 marzo 2016

Registrazione di suoni con Android

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!!!

Nessun commento:

Posta un commento