Android:媒体文件从文件系统消失
我遇到了一个奇怪的问题。我有一个MediaPlayer的活动,它应该播放刚刚录制的音频文件。首先,mediaplayer初始化为ok,文件可以播放 当我旋转屏幕时,活动被销毁,然后为新方向重新初始化。因此,我也重新初始化了mediaplayer 这可以工作几次,但在某个时候mediaPlayer.setDataSource()会抛出一个NullPointerException,因为文件突然消失了。遗憾的是,我在日志中没有看到任何其他错误 以下是一些代码片段: 玩家创建:Android:媒体文件从文件系统消失,android,file,file-io,media-player,Android,File,File Io,Media Player,我遇到了一个奇怪的问题。我有一个MediaPlayer的活动,它应该播放刚刚录制的音频文件。首先,mediaplayer初始化为ok,文件可以播放 当我旋转屏幕时,活动被销毁,然后为新方向重新初始化。因此,我也重新初始化了mediaplayer 这可以工作几次,但在某个时候mediaPlayer.setDataSource()会抛出一个NullPointerException,因为文件突然消失了。遗憾的是,我在日志中没有看到任何其他错误 以下是一些代码片段: 玩家创建: /** * Creat
/**
* 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"));
}
清理:
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);
}
}
}
也许我从错误的角度看待这个问题,这与球员无关。有人有过文件消失的问题吗?我曾经让播放列表文件消失过一次。问题的原因是某些媒体播放器可以选择管理我的播放列表。在本例中,manage意味着删除我已经拥有的播放列表:(是否与您的线程的最后一个线程文件()有关)还没有放弃对文件的读取权限吗?可能是这样,但我找不到位置。如果查看播放器初始化代码段,您会发现,调用player.setDataSource(in.getFD())后,文件输入流立即关闭;ups,wron按钮…我没有我不知道文件描述符发生了什么,它应该在关闭时由播放器清理。stopPlayerAndFreeResources是如何调用的?