2010-12-19 15 views
12

私の問題は説明が簡単です - AudioRecordオブジェクトを作成しようとしていますが、初期化に失敗しています(つまり、コンストラクタの後にgetStateが0を返して失敗を示します)。私はMotoDroid 1 OS 2.2.1でEclipseから実行しています。私のAndroidManifest.xmlは(私はこれを確認する方法がわからない)、右許可、RECORD_AUDIOを使用して、私の知る限り、次のとおりです。毎回Android AudioRecordの初期化に失敗する

<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の初心者です。それがなぜ失敗するのか調べるために私は何ができますか?

似たような質問をしてくれる人は少なくありませんが、彼らが認めている修正が私を助けてくれなかったため、私とは異なる問題を抱えていたに違いありません。最も顕著なのはthisです。しかし、承認された解決策は困惑していて、とにかく私のためにはうまくいきませんでした。私はまた、モノラルとステレオの両方のビットレート(8000,16000,11025、44100)と8と16ビットのいろいろなビットレートを試しました。正常に初期化されたので、何も組み合わせが戻ってこない。

+1

logcatとは何ですか? また、アプリケーションの外にuses-permissionを移動してみてください。それはマニフェストに座るべきです。 – techiServices

+1

何らかの理由で、LogCatは数回の実行後にログ情報の大部分を表示しなくなりましたが、それは他の問題です。 私はあなたの使用許可のコメントに答えるためにフラグを立てていました...(それが機能していたので) – Dave

答えて

36

私はこの問題を解決するいくつかの時間を費やし、そして外

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

を動かすことが判明しましたアプリケーションブロックは実際にそれを解決しました!

... 
    </application> 

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

ユーザ権限ノードを外側に移動すると、それが解決されます。 ありがとうございました! –

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; 
+1

私はこれを今日取り組んでおり、audioRecord.release()を呼び出すと大きな違いがあることがわかりました。最後に。あなたがこれを行うまで、オブジェクトは解放されないようです。なんらかの理由で、たとえaudioRecord.release()がコードの最後に呼び出されたとしても、実際には最初に試してみると試してみることにします。私は実験していますが、理解できませんが、大きな時間を初期化します。 – chaimp

+0

アプリケーションAudalyzerをダウンロードして実行しようとすると、フリーズしてしまった場合、AudioRecordリソースが繋がっている可能性があります。電話を再起動するとその問題が修正されます。 – chaimp

5

別の可能性のある問題:

私は私のマニフェストで有効RECORD_AUDIO権限を持っていましたが、APIレベル23のために、私はまた、実行時に許可を要求しなければなりませんでした。

+0

実行時にどのように権限を要求しましたか? – Fer

0

誰かがAPI 23+のディスクアクセス権を手動で要求する必要がある場合は、ここで私が使用した方法の1つがあります。ちょうど関連するビットの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); 
     } 

    } 
} 
関連する問題