Android:媒体文件从文件系统消失

Android:媒体文件从文件系统消失,android,file,file-io,media-player,Android,File,File Io,Media Player,我遇到了一个奇怪的问题。我有一个MediaPlayer的活动,它应该播放刚刚录制的音频文件。首先,mediaplayer初始化为ok,文件可以播放 当我旋转屏幕时,活动被销毁,然后为新方向重新初始化。因此,我也重新初始化了mediaplayer 这可以工作几次,但在某个时候mediaPlayer.setDataSource()会抛出一个NullPointerException,因为文件突然消失了。遗憾的是,我在日志中没有看到任何其他错误 以下是一些代码片段: 玩家创建: /** * Creat

我遇到了一个奇怪的问题。我有一个MediaPlayer的活动,它应该播放刚刚录制的音频文件。首先,mediaplayer初始化为ok,文件可以播放

当我旋转屏幕时,活动被销毁,然后为新方向重新初始化。因此,我也重新初始化了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"));
}
清理:

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是如何调用的?