2011-08-11 3 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()의 마지막 스레드 인 File()이 파일에 대한 읽기 액세스를 허용하지 않았습니까? – Blundell

+0

플레이어 초기화 스 니펫을 살펴보면 player.setDataSource (in.getFD())를 호출 한 직후에 파일 입력 스트림이 닫히고, –

+0

ups, wron 버튼이 나타납니다. ... 내가 없다. –

답변

1

재생 목록 파일이 한 번 사라졌습니다. 문제의 원인은 내 재생 목록을 관리 할 수있는 특정 미디어 플레이어로 판명났습니다. 이 경우에는 내가 이미 가지고있는 재생 목록을 삭제하는 것을 의미합니다. (

관련 문제