2016-07-06 3 views
0

Я пытаюсь записать с микрофона, и я построил код, попробовав некоторые фрагменты кода, где ничего не происходит: Вот код, может кто-то сказать мне, как получить эта работа. Я новичок в кодировании android.Попытка записать с микрофона на Android-телефон

package com.example.helloworld; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import java.io.IOException; 
import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.media.AudioFormat; 
import android.media.AudioRecord; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import android.util.Log; 
import java.io.*; 
import android.os.Environment; 

public class MainActivity extends Activity { 
    public static final int SAMPLING_RATE = 44100; 
    public static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC; 
    public static final int CHANNEL_IN_CONFIG = AudioFormat.CHANNEL_IN_MONO; 
    public static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
    public static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLING_RATE, CHANNEL_IN_CONFIG, AUDIO_FORMAT); 
    public static final String AUDIO_RECORDING_FILE_NAME = "recording.raw"; 
    private static final String LOGTAG = "MyActivity"; 
    private volatile boolean mStop = true; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     TextView text = new TextView(this); 
     text.setText("Hello World, Ranjan"); 
     setContentView(text); 
    } 

    /*public void run() 
    { 

     TextView text = new TextView(this); 
     text.setText(" hello smart mute"); 

    }*/ 
    //@Override 
    public void run() { 
     android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
     Log.v(LOGTAG, "Starting recording…"); 

     byte audioData[] = new byte[BUFFER_SIZE]; 
     AudioRecord recorder = new AudioRecord(AUDIO_SOURCE, 
        SAMPLING_RATE, CHANNEL_IN_CONFIG, 
        AUDIO_FORMAT, BUFFER_SIZE); 
     recorder.startRecording(); 

     String filePath = Environment.getExternalStorageDirectory().getPath() 
        + "/" + AUDIO_RECORDING_FILE_NAME; 
     BufferedOutputStream os = null; 
     try { 
      os = new BufferedOutputStream(new FileOutputStream(filePath)); 
     } catch (FileNotFoundException e) { 
      Log.e(LOGTAG, "File not found for recording ", e); 
     } 

     while (!mStop) { 
      int status = recorder.read(audioData, 0, audioData.length); 

      if (status == AudioRecord.ERROR_INVALID_OPERATION || 
       status == AudioRecord.ERROR_BAD_VALUE) { 
       Log.e(LOGTAG, "Error reading audio data!"); 
       return; 
      } 

      try { 
       os.write(audioData, 0, audioData.length); 
      } catch (IOException e) { 
       Log.e(LOGTAG, "Error saving recording ", e); 
       return; 
      } 
     } 

     try { 
      os.close(); 

      recorder.stop(); 
      recorder.release(); 

      Log.v(LOGTAG, "Recording done…"); 
      mStop = false; 

     } catch (IOException e) { 
      Log.e(LOGTAG, "Error when releasing", e); 
     } 
    } 
} 
+0

«ничего не происходит» является общим. в чем проблема, с которой вы столкнулись? Не удалось сохранить файл? Не удалось прочитать файл? Или найти сохраненный файл? – Stallion

+0

Файл не создается. Я хочу обрабатывать аудиоданные, поступающие с микрофона в реальном времени. После того, как я получу 1000 выборок аудиоданных от микрофона, я хочу обработать его с помощью своего алгоритма. Теперь я также хочу получить аудиоданные со второго микрофона, который есть у моего телефона. Как мне это сделать? –

+0

Также я видел, что функция запуска переопределена, в моем случае я прокомментировал символ переопределения непосредственно перед запуском. Я тоже новичок в java. Должен ли я создать экземпляр runnable, а затем добавить в него функцию запуска? –

ответ

0

Добавьте их в свой файл манифеста

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

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

Попробуйте следующий код, он помогает нам записывать, останавливать и играть аудио

public class MainActivity extends Activity { 
Button play,stop,record; 
private MediaRecorder myAudioRecorder; 
private String outputFile = null; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    play=(Button)findViewById(R.id.button3); 
    stop=(Button)findViewById(R.id.button2); 
    record=(Button)findViewById(R.id.button); 

    stop.setEnabled(false); 
    play.setEnabled(false); 
    outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";; 

    myAudioRecorder=new MediaRecorder(); 
    myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
    myAudioRecorder.setOutputFile(outputFile); 

    record.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try { 
      myAudioRecorder.prepare(); 
      myAudioRecorder.start(); 
     } 

     catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     record.setEnabled(false); 
     stop.setEnabled(true); 

     Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show(); 
    } 
    }); 

    stop.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     myAudioRecorder.stop(); 
     myAudioRecorder.release(); 
     myAudioRecorder = null; 

     stop.setEnabled(false); 
     play.setEnabled(true); 

     Toast.makeText(getApplicationContext(), "Audio recorded successfully",Toast.LENGTH_LONG).show(); 
    } 
    }); 

    play.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) throws IllegalArgumentException,SecurityException,IllegalStateException { 
     MediaPlayer m = new MediaPlayer(); 

     try { 
      m.setDataSource(outputFile); 
     } 

     catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      m.prepare(); 
     } 

     catch (IOException e) { 
      e.printStackTrace(); 
     } 

     m.start(); 
     Toast.makeText(getApplicationContext(), "Playing audio", Toast.LENGTH_LONG).show(); 
    } 
    }); 
} 
+0

Я хочу получить сырые данные из микрофонов на моем телефоне. Как получить данные с моего второго микрофона. Мой телефон имеет два микрофона. –

+0

Второй микрофон используется для шумоподавления. Телефон использует его для прослушивания внешней среды (не включая ваш голос), чтобы он мог отфильтровать это из звуков, которые он слышит, используя основной микрофон. – raasesh

+0

[Микрофонная ссылка ....] (http://stackoverflow.com/questions/15418267/how-to-access-the-second-mic-android-such-as-galaxy-3) посетите приведенную выше ссылку для получения дополнительной информации. уточнение. – raasesh