android mediaRecorder.setAudioSource失败

我有Android G1固件1.6,我试图从应用程序中logging下面的代码的声音。

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

我的manifest.xml有:

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

我有:

 09-23 14:41:05.531:错误/ AndroidRuntime(1718):未捕获的处理程序:由于未捕获的exception,线程主要退出
 09-23 14:41:05.551:错误/ AndroidRuntime(1718):java.lang.RuntimeException:setAudioSource失败。
 09-23 14:41:05.551:错误/ AndroidRuntime(1718):在android.media.MediaRecorder.setAudioSource(本地方法)

如何正确录制语音?

我发现这个: http : //code.google.com/p/android/issues/detail? id= 4075

打开“ AndroidManifest.xml ” – >

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

我知道这是一个非常古老的问题,但在Android的棉花糖,你必须继续“设置>应用程序>您的应用程序>权限”,并可以使用麦克风权限。

如果您在Android M上运行,那么您需要先申请权限才能在第一次运行时录制audio。 要做到这一点,请询问用户是否可以在应用程序启动时录制audio:

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

重要 – 在过去的几个小时里,我试图弄清楚如何检查MIC是否被不同的应用程序所捕获。 我注意到,如果2个应用程序的地址MediaRecorder在同一时间RuntimeException将被抛出,你将无法使用麦克风,除非你重新启动你的设备(!!)我不知道这是否是最好的解决scheme,但它为我工作。 也许它会在一些时间里保存你们中的一些人。

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

我有这个确切的问题,这为我解决了这个问题:

在您用于debugging的设备上,进入设置 – >应用程序 – > {您的应用程序}。 然后确保所有的应用程序的权限(在这种情况下,audio录制和写入外部存储)是允许的。

在不通过Google Play Store安装应用程序的情况下,您不会被要求授予权限,而在某些电话上,这会导致您的debugging应用程序无法获得某些权限。

即使清单文件中的一些权限得到识别(如互联网访问),也请检查,因为对我来说有些工作,有些被自动阻止。

希望这可以帮助。

请为Marshmallow及以上版本请求Manifest.permission.RECORD_AUDIO权限。

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

这看起来正确。 确保其他应用程序尚未使用MIC。 也许给手机重新启动,然后再试一次。

此代码为我工作

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

我的build议可能看起来很愚蠢,但它为我工作:)

尝试将权限作为嵌套标记。 我相信有一个XMLparsing问题的Android包装库的地方。

答案“validateMicAvailability()抛出MicUnaccessibleException”不适用于我。 MicUnaccessibleExceptionexception似乎不存在。 我误解了什么?

作为一个Cyanogenmod用户,我不得不

  1. 确保权限在清单中定义(android-studio)
  2. 确保隐私保护允许应用程序访问麦克风(在设备上)
  3. 确保Android系统已经在Settings – > Apps – >select您的应用程序 – > Permissions – >检查所有权限(应该是由清单请求的)(在设备上)

之后,logging为我工作。

对于API 23+,请在Manifest.xml <uses-permission android:name="android.permission.RECORD_AUDIO" />和Java代码中检查audiologging权限

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

更改

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

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

为我工作。