이상한 문제가 있습니다. 방금 녹음 된 오디오 파일을 재생해야하는 MediaPlayer에 대한 작업이 있습니다. 처음에는 미디어 플레이어가 정상적으로 초기화되고 파일을 재생할 수 있습니다.Android : 파일 시스템에서 미디어 파일이 사라짐
화면을 회전하면 작업이 삭제 된 다음 새 방향으로 다시 초기화됩니다. 따라서 mediaplayer도 다시 초기화합니다.
이 작업은 몇 번이지만 mediaPlayer.setDataSource()가 갑자기 파일이 없어 졌기 때문에 어느 시점에서 NullPointerException을 발생시킵니다. 슬프게도 로그에서 다른 오류를 보지 못했습니다.
플레이어 제작 :
/**
* Creates and initializes the player with the proper file.
*/
private void createPlayer() {
synchronized (playerMutex) {
player = new MediaPlayer();
player.setLooping(false);
player.setOnPreparedListener(this);
player.setOnErrorListener(this);
player.setOnCompletionListener(this);
}
readGreeting();
}
플레이어 초기화 :
isPrepared = false;
try {
final File file = new File(audioFilename);
in = new FileInputStream(file);
synchronized (playerMutex) {
player.setDataSource(in.getFD());
}
// using a runnable instead of prepareAsync to not accidentally call pause on media player while preparing
Runnable preparer = new Runnable() {
@Override
public void run() {
try {
synchronized (playerMutex) {
if (player != null) {
player.prepare();
}
}
} catch (Exception ex) {
Log.e(TAG, "Error preparing player for file " + file.getAbsolutePath(), ex);
}
}
};
new Thread(preparer).start();
} catch (Exception ex) {
btnPlayback.setEnabled(false);
Log.e(TAG, "Error preparing player", ex);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
Log.e(TAG, "initPlayer: ", e);
}
}
}
저장 인스턴스 상태 ...
@Override
protected void onPause() {
synchronized (playerMutex) {
if (isPlaying()) {
getIntent().putExtra(EXTRA_KEY_SEEK, player.getCurrentPosition());
pause();
}
}
setAudioModeBackToNormal();
super.onPause();
}
private void pause() {
synchronized (playerMutex) {
if (isPlaying()) {
player.pause();
}
}
btnPlayback.setVisibility(View.VISIBLE);
btnPause.setVisibility(View.GONE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
final Bundle extras = getIntent().getExtras();
outState.putBundle("extras", extras);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
getIntent().putExtras(savedInstanceState.getBundle("extras"));
}
cleanu 여기
몇 가지 코드 조각입니다 p :
private void stopPlayerAndFreeResources() {
synchronized (playerMutex) {
isPrepared = false;
if (player != null) {
player.stop();
player.release();
player = null;
}
}
if (in != null) {
try {
in.close();
in = null;
} catch (IOException e) {
Log.e(TAG, "Unexpected error", e);
}
}
}
아마도 내가 잘못된 각도에서 문제를보고 있는데 플레이어와 관련이 없습니다. 아무도 사라진 파일에 문제가 있습니까?
스레드의 작업과 관련이 있습니까? File()의 마지막 스레드 인 File()이 파일에 대한 읽기 액세스를 허용하지 않았습니까? – Blundell
플레이어 초기화 스 니펫을 살펴보면 player.setDataSource (in.getFD())를 호출 한 직후에 파일 입력 스트림이 닫히고, –
ups, wron 버튼이 나타납니다. ... 내가 없다. –