2012-06-20 2 views
8

Je veux enregistrer la voix aussi longtemps que le bouton d'enregistrement et enregistrer cette voix dans le dossier brut de mon projet. J'ai utilisé le code ci-dessous. Bien qu'il n'y ait pas d'erreur, je n'ai pas pu obtenir de résultat. Quel peut être le problème ? Avez-vous des suggestions? Merci,Comment puis-je enregistrer la voix dans Android tant que vous maintenez un bouton enfoncé?

public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 


    Runnable mAction = new Runnable() { 
     public void run() { 
      System.out.println("Performing action..."); 

      int frequency=11025; 
      int channelConfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO; 
      int audioEncoding= AudioFormat.ENCODING_PCM_16BIT; 
      File file=new File(Environment.getExternalStorageDirectory(),"raw.pcm"); 

      try{ 
       file.createNewFile(); 
      }catch(IOException e){} 

      try{ 
       OutputStream os=new FileOutputStream(file); 
       BufferedOutputStream bos=new BufferedOutputStream(os); 
       DataOutputStream dos=new DataOutputStream(bos); 

       int bufferSize=AudioRecord.getMinBufferSize(frequency, channelConfiguration, 
         audioEncoding); 

       short[] buffer=new short[bufferSize]; 
       audioRecorder=new AudioRecord(MediaRecorder.AudioSource.MIC, 
         frequency, channelConfiguration, audioEncoding, bufferSize); 

       audioRecorder.startRecording(); 

       isRecording=true; 

       while(isRecording){ 

        int         bufferReadResult=audioRecorder.read(buffer, 0,bufferSize); 

        for(int i=0;i<bufferReadResult;i++){ 

         dos.writeShort(buffer[i]); 

        } 

       } 

       audioRecorder.stop(); 
       dos.close(); 

      }catch(Throwable t){} 

     } 
    }; 

    switch(event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     if (myHandler != null) return true; 
     myHandler = new Handler(); 
     myHandler.postDelayed(mAction, 500); 
     break; 
    case MotionEvent.ACTION_UP: 

     if (myHandler == null) return true; 


     isRecording=false; 

     myHandler.removeCallbacks(mAction); 
     myHandler = null; 
     break; 
    } 

    return false; 
} 

Répondre

24

voici votre réponse ...

import java.io.File; 
import java.io.IOException; 
import android.app.Activity; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 

public class AudioOnTouchActivity extends Activity { 
    Button b1; 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 
    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { MediaRecorder.OutputFormat.MPEG_4,    MediaRecorder.OutputFormat.THREE_GPP }; 
    private String file_exts[] = { AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP }; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     b1=(Button)findViewById(R.id.button1); 
     b1.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 
       switch(event.getAction()){ 
       case MotionEvent.ACTION_DOWN: 
        AppLog.logString("Start Recording"); 
        startRecording(); 
        break; 
       case MotionEvent.ACTION_UP: 
        AppLog.logString("stop Recording"); 
        stopRecording(); 
        break; 
       } 
       return false; 
      } 
     }); 
    } 

    private String getFilename(){ 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath,AUDIO_RECORDER_FOLDER); 

     if(!file.exists()){ 
      file.mkdirs(); 
     } 

     return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording(){ 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(output_formats[currentFormat]); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(getFilename()); 
     recorder.setOnErrorListener(errorListener); 
     recorder.setOnInfoListener(infoListener); 

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

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() { 
      @Override 
      public void onError(MediaRecorder mr, int what, int extra) { 
       AppLog.logString("Error: " + what + ", " + extra); 
     } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() { 
     @Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
       AppLog.logString("Warning: " + what + ", " + extra); 
     } 
    }; 

    private void stopRecording(){ 
     if(null != recorder){ 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 

      recorder = null; 
     } 
    } 
} 

fichier AppLog.java est

import android.util.Log; 

public class AppLog { 
private static final String APP_TAG = "AudioRecorder"; 

public static int logString(String message){ 
    return Log.i(APP_TAG,message); 
} 

le xml est

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_gravity="center" 
     android:layout_marginTop="10dp"/> 

</LinearLayout> 

Ajouter ces autorisations à votre fichier manifeste

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
     <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 
+1

Merci pour votre aide – selenk

+3

Aurait été préférable de lier à la source et expliquer les parties pertinentes du code au lieu de copier coller: https://github.com/krvarma/krvarma-android-samples/tree/master/AudioRecorder. 1 –

1
save that voice into the raw folder in my project. 

Au moment de l'exécution vous ne pouvez pas sauvegarder le contenu dans le dossier Raw.

Vous avez 2 options pour l'enregistrer dans un stockage externe (le cas échéant) ou dans getFileDir, par exemple dans le répertoire /data/data/package.

+0

Pourriez-vous expliquer la deuxième option? – selenk

1

vous pouvez prendre l'aide CODE DE CE

AudioRecorderActivity.java

public class AudioRecorderActivity extends Activity { 
    private static final String AUDIO_RECORDER_FILE_EXT_3GP = ".3gp"; 
    private static final String AUDIO_RECORDER_FILE_EXT_MP4 = ".mp4"; 
    private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder"; 
    private MediaRecorder recorder = null; 
    private int currentFormat = 0; 
    private int output_formats[] = { 
     MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.OutputFormat.THREE_GPP 
    }; 
    private String file_exts[] = { 
     AUDIO_RECORDER_FILE_EXT_MP4, AUDIO_RECORDER_FILE_EXT_3GP 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setButtonHandlers(); 
     enableButtons(false); 
     setFormatButtonCaption(); 
    } 

    private void setButtonHandlers() { 
     ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick); 
     ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick); 
     ((Button) findViewById(R.id.btnFormat)).setOnClickListener(btnClick); 
    } 

    private void enableButton(int id, boolean isEnable) { 
     ((Button) findViewById(id)).setEnabled(isEnable); 
    } 

    private void enableButtons(boolean isRecording) { 
     enableButton(R.id.btnStart, !isRecording); 
     enableButton(R.id.btnFormat, !isRecording); 
     enableButton(R.id.btnStop, isRecording); 
    } 

    private void setFormatButtonCaption() { 
     ((Button) findViewById(R.id.btnFormat)).setText(getString(R.string.audio_format) + " (" + file_exts[currentFormat] + ")"); 
    } 

    private String getFilename() { 
     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath, AUDIO_RECORDER_FOLDER); 

     if (!file.exists()) { 
      file.mkdirs(); 
     } 

     return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); 
    } 

    private void startRecording() { 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(output_formats[currentFormat]); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(getFilename()); 
     recorder.setOnErrorListener(errorListener); 
     recorder.setOnInfoListener(infoListener); 

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

    private void stopRecording() { 
     if (null != recorder) { 
      recorder.stop(); 
      recorder.reset(); 
      recorder.release(); 

      recorder = null; 
     } 
    } 

    private void displayFormatDialog() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     String formats[] = { 
      "MPEG 4", "3GPP" 
     }; 

     builder.setTitle(getString(R.string.choose_format_title)).setSingleChoiceItems(formats, currentFormat, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       currentFormat = which; 
       setFormatButtonCaption(); 

       dialog.dismiss(); 
      } 
     }).show(); 
    } 

    private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {@Override 
     public void onError(MediaRecorder mr, int what, int extra) { 
      AppLog.logString("Error: " + what + ", " + extra); 
     } 
    }; 

    private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {@Override 
     public void onInfo(MediaRecorder mr, int what, int extra) { 
      AppLog.logString("Warning: " + what + ", " + extra); 
     } 
    }; 

    private View.OnClickListener btnClick = new View.OnClickListener() {@Override 
     public void onClick(View v) { 
      switch (v.getId()) { 
      case R.id.btnStart: 
       { 
        AppLog.logString("Start Recording"); 

        enableButtons(true); 
        startRecording(); 

        break; 
       } 
      case R.id.btnStop: 
       { 
        AppLog.logString("Start Recording"); 

        enableButtons(false); 
        stopRecording(); 

        break; 
       } 
      case R.id.btnFormat: 
       { 
        displayFormatDialog(); 

        break; 
       } 
      } 
     } 
    }; 
} 

AppLog.java

import android.util.Log; 

public class AppLog { 
    private static final String APP_TAG = "AudioRecorder"; 

    public static int logString(String message) { 
     return Log.i(APP_TAG, message); 
    } 
}  

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="20dip" > 

    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitCenter" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 
     <Button 
      android:id="@+id/btnStart" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="@string/start_recording" /> 
     <Button 
      android:id="@+id/btnStop" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="@string/stop_recording" /> 
     <Button 
      android:id="@+id/btnFormat" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1.0" 
      android:text="Format (mp4)" /> 
    </LinearLayout> 

</LinearLayout> 
+0

Je suis nouveau à ce sujet, donc c'est difficile pour moi de trouver mes erreurs. Cependant, je suppose que je ne peux pas créer le fichier. cette fois quand je presse le bouton d'enregistrement, il dit que l'application s'est arrêtée de manière inattendue. – selenk

Questions connexes