2016-06-18 3 views
0

私はAndroidが初めてで、Androidスタジオで聴力計を開発しています。ステップの1つは、マイクがイヤホンから送信しているサウンドを受信して​​いるかどうかを確認し、正しく動作しているかどうかを確認することです。私は音を送信し、同じアクティビティの両方をやって、入ってくるすべての音があるかどうかをチェックしていますAndroid:マイクが音を受信して​​いることを確認してください

私は、AudioTrackクラスを使用して、2秒間周波数の周波数1kHzのトーンを送信することができました次のステップは、マイクがその周波数付近で何かを受信して​​いるかどうかを確認することです。私はマイクの仕事をすることさえできなかったので、マイクが何かを受け取っているかどうかを確認するだけで目標を下げています。

私は私を助けた複数のリンクとどれをチェックしましたか、私はアンドロイドに慣れていないですので、またはそれは私が必要なものではなかったので、他の人の間で: Detect sound levelHow to detect when a user stops talking into the microphoneDetect '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(); 
    } 

    } 

私はオンラインで見つかった例に基づいて、ほとんどhereherehereから書いているので、実際にはわからないコードがいくつかあります。

ここでのアイデアは、イヤホンからサウンドを送信することです。ユーザーは、イヤホンをマイクの近くに置くように通知されます。次に、マイクの録音を3秒間実行し、音の振幅が0と異なるかどうかを確認してください。アプリケーションがFirstTestActivityに、そうでなければEnd1Activityに移動します。しかし、いったんコードを実行しようとすると、突然アプリケーションがクラッシュし、なぜかわからない。私は数週間それについて取り組んできましたが、私はおそらくかなり簡単な解決策を見つけることができませんでした。事前に感謝します。

答えて

0

件名の知識が不足しているため、代わりにライブラリを使用するほうが便利ですhere

関連する問題