69

Android G1ファームウェア1.6を使用しています。次のコードでアプリから音声を録音しようとしています。

MediaRecorder レコーダー = 新しい MediaRecorder();
 Recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 Recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
 レコーダー.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 レコーダー.setOutputFile(PATH_NAME);
 レコーダー.準備();
 レコーダー.開始();  

私のmanifest.xmlには次のものがあります:

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

私は得た:

09-23 14:41:05.531: エラー/AndroidRuntime(1718): キャッチされていないハンドラー: キャッチされていない例外が原因でスレッド メインが終了しました
09-23 14:41:05.551: エラー/AndroidRuntime(1718): java.lang.RuntimeException: setAudioSource が失敗しました。
09-23 14:41:05.551: エラー/AndroidRuntime(1718): android.media.MediaRecorder.setAudioSource(ネイティブ メソッド) で

音声を正しく録音するにはどうすればよいですか?

4

17 に答える 17

126

" " を開くAndroidManifest.xml->

追加

<uses-permission android:name="android.permission.RECORD_AUDIO" />
于 2012-12-28T06:19:43.493 に答える
41

これは非常に古い質問ですが、Android Marshmallow では、[設定] > [アプリ] > [アプリ] > [アクセス許可] に移動して、マイクのアクセス許可を有効にする必要があります。

于 2015-11-18T00:10:27.737 に答える
13

Android M で実行している場合は、初回実行時に音声を録音する権限をリクエストする必要があります。これを行うには、アプリケーションの起動時にオーディオを録音できるかどうかをユーザーに尋ねます。

private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 29;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (mContext.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO},
                MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
    } else {
        Log.d("Home", "Already granted access");
        initializeView(v);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d("Home", "Permission Granted");
                initializeView(v);
            } else {
                Log.d("Home", "Permission Failed");
                Toast.makeText(getActivity().getBaseContext(), "You must allow permission record audio to your mobile device.", Toast.LENGTH_SHORT).show();
                getActivity().finish();
            }
        }
        // Add additional cases for other permissions you may have asked for
    }
}
于 2015-11-29T03:04:35.457 に答える
4

API 23 以降では、マニフェストに既にある場合でも、読み取り/書き込みアクセス許可を要求する必要があります。

// Check for permissions
int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

// If we don't have permissions, ask user for permissions
if (permission != PackageManager.PERMISSION_GRANTED) {
    String[] PERMISSIONS_STORAGE = {
        android.Manifest.permission.READ_EXTERNAL_STORAGE,
        android.Manifest.permission.WRITE_EXTERNAL_STORAGE
    }; 
    int REQUEST_EXTERNAL_STORAGE = 1;

    ActivityCompat.requestPermissions(
        getActivity(),
        PERMISSIONS_STORAGE,
        REQUEST_EXTERNAL_STORAGE
    );
}
于 2016-08-15T11:22:21.797 に答える
4

重要 - ここ数時間、MIC が別のアプリケーションによってキャッチされているかどうかを確認する方法を見つけようとしました。2 つのアプリケーションが同時に MediaRecorder にアドレスすると、RuntimeException がスローされ、デバイスを再起動しない限りマイクを使用できなくなることに気付きました (!!)。それが最善の解決策かどうかはわかりませんが、それは私のために働いた。おそらく、それはあなたの何人かの何人かをいつか数時間節約するでしょう..

private void validateMicAvailability() throws MicUnaccessibleException {
    AudioRecord recorder =
        new AudioRecord(AudioSource.MIC, 44100,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_DEFAULT, 44100);
    try{
        if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED ){
            throw new MicUnaccessibleException("Mic didn't successfully initialized");
        }

        recorder.startRecording();
        if(recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING){
            recorder.stop();
            throw new MicUnaccessibleException("Mic is in use and can't be accessed");
        }
        recorder.stop();
    } finally{
        recorder.release();
        recorder = null;
    }
}
于 2012-05-20T15:49:56.880 に答える
1

このコードは私のために働いた

 mRecorder = new MediaRecorder();
 mRecorder.reset();
 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
于 2014-04-21T05:58:17.353 に答える
1

それは正しいようです。他のアプリケーションがまだ MIC を使用していないことを確認してください。おそらく、電話を再起動して、もう一度やり直してください。

于 2010-09-24T14:12:22.420 に答える
1

別スレに移しました。すべてが機能します。

コードは次のとおりです。

new Thread(() -> {
    mediaRecorder.reset();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mediaRecorder.setOutputFile("/audiorecordtest.3gp");
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        try {
            mediaRecorder.prepare();
            mediaRecorder.start();
            //do something here
            mediaRecorder.stop();
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("Audio","unable to prepare");
        }

}).start();
于 2018-03-06T16:11:10.653 に答える
1

Cyanogenmodユーザーとして、私はしなければなりませんでした

  1. マニフェストで権限が定義されていることを確認してください(android-studio)
  2. プライバシー ガードがアプリに (デバイス上の) マイクへのアクセスを許可していることを確認してください。
  3. Android システムがSettings--> Apps--> アプリを選択 --> Permissions--> すべてのアクセス許可を確認します (マニフェストによって要求されたものである必要があります) (デバイス上)。

その後、再コーディングがうまくいきました。

于 2016-10-01T14:21:02.653 に答える
0

私の提案はばかげているように見えるかもしれませんが、それは私にとってはうまくいきました:)

ネストされたタグとして許可を与えてみてください。Android パッケージ ライブラリのどこかに xml 解析の問題があると思います。

于 2011-01-17T05:27:40.807 に答える
-16

変化する

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

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

私のために働いた。

于 2013-03-23T02:26:22.427 に答える