2011-08-11 9 views
2

私は奇妙な問題に悩まされています。私はちょうど録音されたオーディオファイルを再生する必要がある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); 
     } 
    } 
} 

多分私は間違った角度から問題を見ていて、それはプレーヤーとは関係ありません。誰もが消えていくファイルに問題があったのですか?

+1

あなたのスレッドと何か関係があるのですか?最後のスレッドFile()はファイルまたは何かへの読み取りアクセスを放棄していませんか? – Blundell

+0

プレーヤーの初期化スニペットを見ると、player.setDataSource(in.getFD())の呼び出し直後にファイル入力ストリームが閉じられていることがわかります; –

+0

ups、wron button ...私はありません –

答えて

1

プレイリストファイルが一度消えました。問題の原因は、プレイリストを管理するオプションがある特定のメディアプレイヤーであることが判明しました。この場合は、私が既に持っていたプレイリストを削除することを意味していました:(