2012-06-20 23 views
8

मैं रिकॉर्ड बटन को पकड़ने तक और ध्वनि को अपने प्रोजेक्ट में कच्चे फ़ोल्डर में सहेजने तक आवाज रिकॉर्ड करना चाहता हूं। मैंने नीचे दिए गए कोड का इस्तेमाल किया। Altough कोई त्रुटि नहीं दिखाई देता है, मैं कोई आउटपुट नहीं मिल सका। क्या समस्या हो सकती है ? क्या तुम्हारे पास कोई सुझाव है? धन्यवाद,जब तक कोई बटन पकड़ने तक मैं एंड्रॉइड में ध्वनि रिकॉर्ड कैसे कर सकता हूं?

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; 
} 

उत्तर

24

यहाँ अपने जवाब है ...

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; 
     } 
    } 
} 

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); 
} 

एक्सएमएल

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

अपने मैनिफ़ेस्ट फ़ाइल करने के लिए इन अनुमति जोड़े है

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

आपकी मदद के लिए धन्यवाद – selenk

+3

स्रोत से लिंक करना और प्रतिलिपि बनाने के बजाय कोड के प्रासंगिक हिस्सों की व्याख्या करना बेहतर होगा: https://github.com/krvarma/krvarma-android-samples/tree/master/AudioRecorder। 1 –

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

रन-टाइम में आप नहीं कच्चे फ़ोल्डर में सामग्री बचा सकता है।

आपके पास बाहरी स्टोरेज (यदि कोई है) में या इसे बचाने के लिए 2 विकल्प हैं यानी FileDir यानी /डेटा/डेटा/पैकेज निर्देशिका में।

+0

क्या आप दूसरा विकल्प समझा सकते हैं? – selenk

1

आप इस कोड से मदद ले सकते

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

मैं इस पर नया हूं, इसलिए मेरे लिए मेरी त्रुटियों को ढूंढना मुश्किल है। हालांकि, मुझे लगता है कि मैं फ़ाइल नहीं बना सकता। इस बार जब मैं रिकॉर्ड बटन दबाता हूं तो यह कहता है कि एप्लिकेशन अप्रत्याशित रूप से बंद हो गया है। – selenk