私は奇妙な問題に悩まされています。私はちょうど録音されたオーディオファイルを再生する必要がある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()はファイルまたは何かへの読み取りアクセスを放棄していませんか? – Blundell
プレーヤーの初期化スニペットを見ると、player.setDataSource(in.getFD())の呼び出し直後にファイル入力ストリームが閉じられていることがわかります; –
ups、wron button ...私はありません –