android mediaRecorder.setAudioSource 실패
Android G1 펌웨어 1.6이 있으며 다음 코드를 사용하여 앱에서 음성을 녹음하려고합니다.
MediaRecorder 레코더 = 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 : 오류 / AndroidRuntime (1718) : java.lang.RuntimeException : setAudioSource가 실패했습니다. 09-23 14 : 41 : 05.551 : ERROR / AndroidRuntime (1718) : at android.media.MediaRecorder.setAudioSource (Native Method)
음성을 제대로 녹음하려면 어떻게해야합니까?
" AndroidManifest.xml
" 열기 ->
더하다
<uses-permission android:name="android.permission.RECORD_AUDIO" />
이것은 매우 오래된 질문이라는 것을 알고 있지만 Android Marshmallow에서는 "설정> 앱> 앱> 권한"으로 이동하여 마이크 권한을 활성화해야합니다.
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
}
}
중요-지난 몇 시간 동안 MIC가 다른 응용 프로그램에 의해 잡혔는 지 확인하는 방법을 알아 보려고했습니다. 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;
}
}
나는이 정확한 문제가 있었고 이것이 나를 위해 해결되었습니다.
디버깅에 사용하는 기기에서 설정-> 앱-> {내 앱}으로 이동합니다. 그런 다음 모든 앱의 권한 (이 경우 오디오 녹음 및 외부 저장소 쓰기)이 허용되는지 확인합니다.
Apprarently Google Play Store를 통하지 않고 앱을 설치할 때 권한을 부여하라는 메시지가 표시되지 않으며 일부 휴대폰에서는 디버깅 앱에 일부 권한이 부여되지 않습니다.
나를 위해 일부가 작동하고 일부가 자동으로 차단 되었기 때문에 매니페스트 파일의 일부 권한 (예 : 인터넷 액세스)이 인식되는 경우에도 이것을 확인하십시오.
도움이 되었기를 바랍니다.
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
);
}
API 23+의 경우 Manifest.xml <uses-permission android:name="android.permission.RECORD_AUDIO" />
및 Java 코드 에서 오디오 녹음 권한을 확인하십시오.
if (ActivityCompat.checkSelfPermission(cnt, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(cnt, arrayOf(
Manifest.permission.RECORD_AUDIO
),0)
return
}
Manifest.permission.RECORD_AUDIO
Marshmallow 이상 버전에 대해 동적으로 권한을 요청하십시오 .
맞습니다. 다른 응용 프로그램이 이미 MIC를 사용하고 있지 않은지 확인하십시오. 전화를 다시 시작하고 다시 시도하십시오.
이 코드는 나를 위해 일했습니다.
mRecorder = new MediaRecorder();
mRecorder.reset();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Cyanogenmod-User로서 저는
- 권한이 매니페스트 (android-studio)에 정의되어 있는지 확인
- 프라이버시 가드가 앱이 장치에서 마이크에 액세스하도록 허용했는지 확인
- Android 시스템이
Settings
->Apps
-> 앱 선택->Permissions
-> 모든 권한 (매니페스트에서 요청한 권한이어야 함) (기기에서) 에서 권한을 설정했는지 확인합니다.
그 후 레코딩이 나를 위해 일했습니다.
이 코드를 사용하면 많은 도움이되고 이해할 수 있습니다. .....
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;
}
}
다른 스레드로 옮겼습니다. 모든 것이 작동합니다.
다음은 코드입니다.
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();
내 제안은 어리석은 것처럼 보일 수 있지만 그것은 나를 위해 일했습니다 :)
중첩 된 태그로 권한을 부여하십시오. 안드로이드 패키징 라이브러리 어딘가에 xml 파싱 문제가 있다고 생각합니다.
Make sure the android system had set the permissions on the device, should be the ones requested by the manifest:
- under Settings --> Apps --> Select your app --> Permissions --> Check all permissions in on
Change
<uses-permission android:name="android.permission.RECORD_AUDIO" />
to
<uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission>
Worked for me.
참고URL : https://stackoverflow.com/questions/3782786/android-mediarecorder-setaudiosource-failed
'IT박스' 카테고리의 다른 글
emacs가 나를 위해 큰 HTML 덩어리를 다시 들여 쓸 수 있습니까? (0) | 2020.11.13 |
---|---|
두 개 이상의 필드에서 가장 큰 값 (0) | 2020.11.13 |
C # 클래스 라이브러리를 디자인 할 때 인터페이스에 대한 상속을 언제 선택해야합니까? (0) | 2020.11.13 |
테이블의 기본 키를 얻는 방법은 무엇입니까? (0) | 2020.11.13 |
MySQL의 열에있는 일부 값에 선행 0 추가 (0) | 2020.11.13 |