Android가 처음인데 Android Studio에서 청력계를 개발 중입니다. 단계 중 하나는 마이크가 내가 이어폰에서 보내는 사운드를 수신하고 있는지, 제대로 작동하는지 확인하는 것입니다.Android : 마이크에 소리가 들리는 지 확인하십시오.
나는 같은 활동에 모두 일을하고 소리를 전송하고, 오는 소리가 있는지 확인하고있다.
내가 2 초 주파수의 1kHz에서의 톤을 보낼 수 있었다 AudioTrack 클래스를 사용하여, 다음 단계는 마이크가 그 주파수 근처에서 무언가를 받고 있는지 확인하는 것입니다. 나는 마이크를 작동시킬 수 없기 때문에 마이크가 어떤 것을 받고 있는지 확인하기 위해 목표를 낮추고 있습니다.
나는 몇 가지 링크를 확인했지만 아무도 나를 도왔, 또는 내가 안드로이드에 익숙하지이기 때문에 그것은 내가 다른 사람의 사이에서, 필요한 것이 아닙니다 때문에 나 : Detect sound level, How to detect when a user stops talking into the microphone 및 Detect 'Whistle' sound in android
을 이미했습니다
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
을 그리고 내 CalibrationActivity.java은 다음과 같습니다 : 매니페스트에 대한 권한을 넣어
import android.content.Intent;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import java.io.IOException;
public class CalibrationActivity extends AppCompatActivity {
private MediaRecorder myRecorder;
private String outputFile = null;
private final int duration = 2; // seconds
private final int sampleRate = 4000;
private final int numSamples = duration * sampleRate;
private final double sample[] = new double[numSamples];
private final double freqOfTone = 1000; // hz
private final byte generatedSnd[] = new byte[2 * numSamples];
Handler handler = new Handler();
int getAmplitude = myRecorder.getMaxAmplitude();
public int result(){
if (getAmplitude != 0) {
return 1;
}else {
return 0;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calibration);
outputFile = Environment.getExternalStorageDirectory().
getAbsolutePath() + "/teste.3gpp";
myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(outputFile);
Intent intent;
if(result()==1){
intent = new Intent(this, FirstTestActivity.class);
}else{
intent = new Intent(this, End1Activity.class);
}
}
void start_recording() {
try {
myRecorder.prepare();
myRecorder.start();
} catch (IllegalStateException e) {
// start:it is called before prepare()
// prepare: it is called after start() or before setOutputFormat()
e.printStackTrace();
} catch (IOException e) {
// prepare() fails
e.printStackTrace();
}
}
void stop_recording(){
try {
myRecorder.stop();
myRecorder.release();
myRecorder = null;
} catch (IllegalStateException e) {
// it is called before start()
e.printStackTrace();
} catch (RuntimeException e) {
// no valid audio/video data has been received
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
// Use a new tread as this can take a while
final Thread thread = new Thread(new Runnable() {
public void run() {
genTone();
handler.post(new Runnable() {
public void run() {
playSound();
}
});
}
});
thread.start();
start_recording();
SystemClock.sleep(3000);
stop_recording();
}
void genTone() {
// fill out the array
for (int i = 0; i < numSamples; ++i) {
sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/freqOfTone));
}
// convert to 16 bit pcm sound array
// assumes the sample buffer is normalised.
int idx = 0;
for (final double dVal : sample) {
// scale to maximum amplitude
final short val = (short) ((dVal * 32767));
// in 16 bit wav PCM, first byte is the low order byte
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
}
void playSound() {
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
}
온라인으로 찾은 예제를 기반으로 작성한 코드는 here, here 및 here이므로 대부분 이해할 수없는 부분이 있습니다.
이어폰에서 소리를 보내고 이어폰을 마이크에 가까이 놓으라는 메시지가 사용자에게 전달됩니다. 그런 다음 코드는 3 초 동안 마이크 녹음을 허용 한 다음 소리의 진폭이 0과 다른지 확인한 다음 응용 프로그램이 FirstTestActivity로 이동하고 그렇지 않으면 End1Activity로 이동합니다. 하지만 일단 코드를 실행하면 갑자기 응용 프로그램이 충돌하고 이유를 모르겠습니다. 나는 몇 주 동안 그 일을 해왔고 아마도 꽤 간단 해 보이는 해결책을 찾지 못했습니다. 미리 감사드립니다.