簡體   English   中英

Android AudioRecord初始化每次都失敗

[英]Android AudioRecord initialization fails every time

我的問題很容易解釋 - 我試圖創建一個AudioRecord對象,但它無法初始化(即在構造函數之后,getState返回0,表示失敗)。 我在運行OS 2.2.1的MotoDroid 1上從Eclipse運行它。 我的AndroidManifest.xml是AFAIK,使用了正確的權限,RECORD_AUDIO(我不知道如何確認):

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <activity android:name=".SphinxMic"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

我執行以下操作來創建AudioRecord:

bufferSize = AudioRecord.getMinBufferSize(8000, CHANNEL_IN_MONO, ENCODING_PCM_8BIT);
audioRecorder = new AudioRecord(AudioSource.MIC, 8000, CHANNEL_IN_MONO, ENCODING_PCM_8BIT, 50*bufferSize);
if (audioRecorder.getState() != AudioRecord.STATE_INITIALIZED)
  throw new Exception("AudioRecord init failed");

audioRecorder.getState()返回0(即STATE_UNINITIALIZED)

我還沒有找到任何使用這個API的完整示例,我非常喜歡Android初學者,所以解決方案可能很簡單。 我該怎么做才能找出失敗的原因?

有些人提出了類似的問題,但他們肯定遇到了與我不同的問題,因為他們批准的修復措施對我沒有幫助。 最值得注意的是這個 但批准的解決方案令人困惑,無論如何都不適用於我。 我還嘗試了各種比特率(8000,16000,11025,44100),單聲道和立體聲以及8和16比特。 成功初始化后沒有組合回來。

我花了幾個小時來解決這個問題,並發現了移動

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

在應用程序塊之外實際解決了它!

...
    </application>

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

另一個問題:

我在清單中啟用了RECORD_AUDIO權限,但對於API級別23,我還必須在運行時請求權限。

試試16bit。 這對我有用:

try {
        // Create a new AudioRecord object to record the audio.
        bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration,audioEncoding);

        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
                                                  frequency, channelConfiguration, 
                                                  audioEncoding, bufferSize);
    } catch (Throwable t) {
        Log.e("AudioRecord","Recording Failed");
    }

我設置了以下變量:

int frequency = 8000;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

如果有人需要手動為API 23+請求磁盤權限,這里是我使用過的一種方法。 只需在相關位中交換permission.RECORD_AUDIO 方法邏輯依賴於外部的一些位(例如strings.xmlActivityCompatSnackbar ),但認為它可能對某人有幫助。

/**
 * Requests the Storage permissions.
 * If the permission has been denied previously,
 * a SnackBar will prompt the user to grant the
 * permission, otherwise it is requested directly.
 */
private void requestStoragePermissions() {

    // Newer versions Android 18+
    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2) {
        /**
         * Permissions required to read and write storage.
         */
        final String[] PERMISSIONS_STORAGE = {
                permission.READ_EXTERNAL_STORAGE,
                permission.WRITE_EXTERNAL_STORAGE,
        };

        final boolean readResult =
                ActivityCompat.shouldShowRequestPermissionRationale(
                        this, permission.READ_EXTERNAL_STORAGE);
        final boolean writeResult =
                ActivityCompat.shouldShowRequestPermissionRationale(
                        this, permission.WRITE_EXTERNAL_STORAGE);

        if (readResult || writeResult) {

            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example, if the request has been denied previously.
            Log.i(TAG,
                    "Displaying disk permission rationale to provide additional context.");

            // Display a SnackBar with an explanation and a button to trigger the request.
            Snackbar.make(mainView, R.string.permission_storage_rationale,
                    Snackbar.LENGTH_INDEFINITE)
                    .setAction(R.string.ok, new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ActivityCompat
                                    .requestPermissions(MainActivity.this,
                                            PERMISSIONS_STORAGE,
                                            REQUEST_STORAGE);
                        }
                    })
                    .show();
        } else {
            // Storage permissions have not been granted. Request them directly.
            ActivityCompat.requestPermissions(
                    this, PERMISSIONS_STORAGE, REQUEST_STORAGE);
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM