14

私の問題は簡単に説明できます。AudioRecordオブジェクトを作成しようとしていますが、初期化に失敗します(つまり、コンストラクターの後、getStateは0を返し、失敗を示します)。私はこれをEclipseからOS2.2.1を実行しているMotoDroid1で実行しています。私の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の初心者なので、解決策は単純なものかもしれません。なぜ失敗するのかを知るために何ができますか?

何人かの人々が同様の質問をしましたが、彼らが承認した修正が私を助けていないので、彼らは私とは異なる問題を抱えていたに違いありません。最も注目すべきはこれです。しかし、承認された解決策は当惑していて、とにかく私にはうまくいきませんでした。また、モノラルとステレオの両方、および8ビットと16ビットのさまざまなビットレート(8000、16000、11025、44100)を試しました。初期化に成功したため、組み合わせは返されません。

4

4 に答える 4

42

私はこの問題を解決するために数時間を費やしました、そしてそれが動くことを知りました

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

アプリケーションブロックの外で実際に解決しました!

...
    </application>

    <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
</manifest>
于 2011-08-25T09:46:05.320 に答える
7

別の考えられる問題:

マニフェストでアクセス許可を有効にRECORD_AUDIOしましたが、APIレベル23の場合、実行時にアクセス許可も要求する必要がありました。

于 2016-07-02T20:01:28.677 に答える
1

16ビットを試してください。これは私のために働くものです:

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;
于 2010-12-19T20:02:47.023 に答える
0

API 23以降のディスク権限を手動で要求する必要がある場合に備えて、これが私が使用した1つの方法です。permission.RECORD_AUDIO関連するビットを交換するだけです。メソッドロジックは、外部のいくつかのビット(たとえば、、)に依存しますが、strings.xmlとにかくActivityCompat誰かSnackbarを助けるかもしれないと考えました。

/**
 * 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);
        }

    }
}
于 2017-07-27T20:02:18.607 に答える