web-dev-qa-db-ja.com

android mediaRecorder.setAudioSourceが失敗しました

Android G1 firmware 1.6、次のコードでアプリからの音声を録音しようとしています。

 MediaRecorder recorder = new MediaRecorder(); 
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
 recorder.setOutputFile(PATH_NAME); 
 recorder.prepare(); 
 recorder.start(); 

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

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

私が得た:

 09-23 14:41:05.531:ERROR/AndroidRuntime(1718):キャッチされていないハンドラー:キャッチされていない例外によりスレッドメインが終了しました
 09-23 14:41:05.551:ERROR/AndroidRuntime(1718 ):Java.lang.RuntimeException:setAudioSource failed。
 09-23 14:41:05.551:ERROR/AndroidRuntime(1718):at Android.media.MediaRecorder.setAudioSource(Native Method)

音声を適切に録音するにはどうすればよいですか?

66
user121196

開いた "AndroidManifest.xml "->

追加

<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
119
SeungUn Ham

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

40
Rafael

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
    }
}
12
BostonGeorge

私はこの正確な問題を抱えていました、これは私のためにそれを解決しました:

デバッグに使用するデバイスで、設定->アプリ-> {your app}に移動します。次に、アプリのすべてのアクセス許可(この場合は、オーディオの録音と外部ストレージの書き込み)が許可されていることを確認します。

どうやらGoogle Playストア経由ではないアプリをインストールする際、許可を与えるように求められることはなく、一部の電話ではデバッグアプリが許可を与えられないことがあります。

マニフェストファイルの一部のアクセス許可(インターネットアクセスなど)が認識されている場合でも、これをチェックしてください。

お役に立てれば。

4
Shalev Keren

重要-過去数時間に、MICが別のアプリケーションによってキャッチされているかどうかを確認する方法を見つけようとしました。 MediaRecorderへの2つのアプリケーションアドレスが同時に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;
    }
}
4
Roi

API 23以降の場合、両方のManifest.xml <uses-permission Android:name="Android.permission.RECORD_AUDIO" />およびin Java Code

if (ActivityCompat.checkSelfPermission(cnt, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(cnt, arrayOf(
                Manifest.permission.RECORD_AUDIO
        ),0)
        return
    }
3
ugali soft

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

マシュマロ以上のバージョンでは、Manifest.permission.RECORD_AUDIO許可を動的にリクエストしてください。

2
porwalankit

このコードを試してみてください。多くのことを理解できます。

public class MainActivity extends Activity {

    MediaRecorder mRecorder;
    MediaPlayer mediaPlayer;
    Button start, stop, play,stop_play;
    String FileName="";
    File outfile ;

    public static final int request_code = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        start=(Button)findViewById(R.id.btn_start_main);
        stop=(Button)findViewById(R.id.btn_stop_main);
        play=(Button)findViewById(R.id.btn_play_main);
        stop_play=(Button)findViewById(R.id.btn_playstop_main);

        if (checkPermissionFromDevice()){

            start.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FileName= Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+
                            UUID.randomUUID()+"AudioFile.3gp";

                    SetupMediaRecorder();

                    try {
                        mRecorder.prepare();
                        mRecorder.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    start.setEnabled(false);
                    stop.setEnabled(true);
                    play.setEnabled(false);
                    stop_play.setEnabled(false);

                    Toast.makeText(getApplicationContext(),"recording....",Toast.LENGTH_SHORT).show();
                }
            });
            stop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mRecorder.stop();
                    play.setEnabled(true);
                    start.setEnabled(true);
                    stop.setEnabled(false);
                    stop_play.setEnabled(false);
                    Toast.makeText(getApplicationContext(),"recording stoped....",Toast.LENGTH_SHORT).show();
                }
            });
            play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mediaPlayer=new MediaPlayer();
                    try {
                        mediaPlayer.setDataSource(FileName);
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                    start.setEnabled(false);
                    stop.setEnabled(false);
                    play.setEnabled(false);
                    stop_play.setEnabled(true);
                    Toast.makeText(getApplicationContext(),"playing..",Toast.LENGTH_SHORT).show();
                }
            });
            stop_play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mediaPlayer.stop();
                    SetupMediaRecorder();
                    start.setEnabled(true);
                    stop_play.setEnabled(false);
                    play.setEnabled(false);
                }
            });

        }
        else {

            requestPermissionFromDevice();
        }





    }

    private void SetupMediaRecorder() {
        mRecorder=new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mRecorder.setOutputFile(FileName);
    }

    private void requestPermissionFromDevice() {
        ActivityCompat.requestPermissions(this,new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.RECORD_AUDIO},
                request_code);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case request_code:
            {
                if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ){
                    Toast.makeText(getApplicationContext(),"permission granted...",Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(getApplicationContext(),"permission denied...",Toast.LENGTH_SHORT).show();
                }
            }
                break;
        }
    }

    private boolean checkPermissionFromDevice() {
        int storage_permission= ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int recorder_permssion=ContextCompat.checkSelfPermission(this,Manifest.permission.RECORD_AUDIO);
    return storage_permission == PackageManager.PERMISSION_GRANTED && recorder_permssion == PackageManager.PERMISSION_GRANTED;
    }
}
1
nagabrahmam

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

1
vanevery

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

 mRecorder = new MediaRecorder();
 mRecorder.reset();
 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
1
Ali Riahipour

Cyanogenmodユーザーとして

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

その後、再コーディングが機能しました。

1
GameScripting

別のスレッドに移動しました。すべてが機能します。

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

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();
1
R. Barbus

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

ネストされたタグとして許可を与えてみてください。 Androidパッケージライブラリ。

0