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

发布于 2024-11-29 07:07:18 字数 3313 浏览 0 评论 0原文

我遇到了一个奇怪的问题。我有一个 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);
        }
    }
}

也许我从错误的角度看待问题,它与播放器无关。有人遇到过文件消失的问题吗?

I am stuck with a weird problem. I have an activity with a MediaPlayer that should play a just recorded audio file. At first the mediaplayer is initialized ok and the file can be played.

When I rotate the screen, the activity is destroyed and then reinitialized for the new orientation. Therefore, I re-initialize the mediaplayer too.

this works a couple of times, but at some point mediaPlayer.setDataSource() throws a NullPointerException because the file is suddenly gone. Sadly, I haven't seen any other error in the logs.

Here are some Code snippets:

player creation:

/**
 * 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();
}

player initialization:

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

saving instance state...

@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"));
}

cleanup:

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

Maybe I'm looking at the problem from the wrong angle and it has nothing to do with player. Has anybody ever had issues with disappearing files?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

撕心裂肺的伤痛 2024-12-06 07:07:19

我有一次播放列表文件消失了。问题的原因是某些媒体播放器可以选择管理我的播放列表。在这种情况下,管理意味着删除我已有的播放列表:(

I had playlist files disappear once. The cause of the problem turned out to be certain media players that had an option to manage my playlists. In this case manage meant deleting the playlists I already had :(

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文