1

以下のコードを使用してデバイスの有効なサンプル レートを取得していますがaudioRecorder.getState()、My Samsung Galaxy Tab 1 OS バージョン 2.3.6 では常に 0 を送信しますが、Samsung Galaxy S2 では問題ありません。

いつも手にするGalaxy Tabの手段desiredRate = -1;

public static void getValidSampleRates() {
        int desiredRate = 0;
        for (int rate : new int[] {44100, 8000, 11025, 16000, 22050}) {  // add the rates you wish to check against
            int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
            if (bufferSize > 0) {
                // buffer size is valid, Sample rate supported
                AudioRecord audioRecorder = new AudioRecord(AudioSource.MIC, rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 21168);

                if (audioRecorder.getState() != AudioRecord.STATE_INITIALIZED)
                    desiredRate = -1;
                else
                    desiredRate = rate;
            }
        }
    }

Androidマニフェストファイルに以下の権限を追加しました

 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <application

助けてください

4

1 に答える 1

1

ここには 2 つの問題があります。

  1. にハードコードされた値を使用していますbufferSizeInBytesドキュメントによると、より小さい値を使用するgetMinBufferSizeと初期化に失敗します。bufferSizeコンストラクタで値を使用しないのはなぜですか? channelConfigまた、を呼び出すときも と同じ値を使用しますgetMinBufferSize

  2. この質問の回答と同様に、誰かが AudioRecord リソースを解放していない可能性があります。以下のコード ブロックに示すように、if ステートメントにいくつかの変更を加えることができます。これが true の場合、コードは 44100 のビットレートを初期化しようとして失敗し、リソースを正しく解放してから 8000 のビットレートを正常に初期化します。それでも 44100 のビットレートが必要な場合は、次を使用しますnew int[] {44100, 44100, 8000, 11025, 16000, 22050}

以下のコード ブロックには、コードに対する両方の変更が含まれています。試してみて、何が得られるか教えてください。

public static void getValidSampleRates() {
    int desiredRate = 0;
    for (int rate : new int[] {44100, 8000, 11025, 16000, 22050}) {
        int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        if (bufferSize > 0) {
            // buffer size is valid, Sample rate supported
            AudioRecord audioRecorder = new AudioRecord(AudioSource.MIC, rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

            if (audioRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
                desiredRate = -1;
                audioRecorder.release();
            } else {
                desiredRate = rate;
                break;
            }
        }
    }
}
于 2013-08-27T02:55:21.087 に答える