2013-06-11 2 views
2

Android 프로그램에 새로운 기능이있어서 지금 내 앱에 문제가 있습니다. MediaPlayer 응용 프로그램을 기능으로 코딩하려고합니다. 의도를 사용하여 저장소에서 파일을 선택한 다음 해당 파일 재생을 시작합니다. "mMediaPlayer = MediaPlayer.create (이, URI);"나는 "MediaPlayer.create (문맥, URI)"방법을 사용하지만 현재 내가 오류MediaPlayer로 재생할 음악 파일을 선택하십시오.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //openFile(); 
    Button openFile = (Button) this.findViewById(R.id.ButtonOpen); 
    openFile.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent chooseFile; 
      Intent intent; 
      chooseFile = new Intent(Intent.ACTION_GET_CONTENT); 
      chooseFile.setType("file/*"); 
      intent = Intent.createChooser(chooseFile, "Choose a file"); 
      startActivityForResult(intent, ACTIVITY_CHOOSE_FILE); 

      Uri uri = intent.getData(); 
      initViews(uri); 
     } 
    }); 

} 

private void initViews(Uri uri) { 
    mButtonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); 
    mButtonPlayStop.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      buttonClick(); 
     } 
    }); 

    mMediaPlayer = MediaPlayer.create(this, uri); 
} 


private void starPlayProgressUpdater() { 
    mSeekBar.setProgress(mMediaPlayer.getCurrentPosition()); 

    if (mMediaPlayer.isPlaying()) { 
     Runnable notification = new Runnable() { 

      @Override 
      public void run() { 
       starPlayProgressUpdater(); 
      } 
     }; 
     mHandler.postDelayed(notification, 1000); 
    } else { 
     mMediaPlayer.pause(); 
     mButtonPlayStop.setText(getString(R.string.play_str)); 
     mSeekBar.setProgress(0); 
    } 
} 

private void buttonClick() { 
    if (mButtonPlayStop.getText() == getString(R.string.play_str)) { 
     mButtonPlayStop.setText(getString(R.string.pause_str)); 
     try { 
      mMediaPlayer.start(); 
      starPlayProgressUpdater();    
     } catch (IllegalStateException e) { 
      mMediaPlayer.pause(); 
     } 
    } else { 
     mButtonPlayStop.setText(getString(R.string.play_str)); 
     mMediaPlayer.pause(); 
    } 
} 

을 가지고 그리고 그것은에서 NullPointerException이 발생합니다. 그것은 uri에 문제가 있습니다. 길드 길을 길드 할 수 있겠습니까?


감사합니다. Ilango j, 이제 코드를 수정하여 음악 파일을 선택하고 재생할 수있었습니다. 하지만 내 expecteation는 일부 파일 만/재생을 클릭 한 후 재생 (진행 표시 줄) 일시 정지 버튼입니다하지만 난 당신이 조언을 전해 주 시겠어요 내 buttonClick

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mContext = (Context) getApplicationContext(); 

    Button openFile = (Button) this.findViewById(R.id.ButtonOpen); 
    openFile.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) {  
      initView(); 
     } 
    }); 

} 

private void initView() { 
    mButtonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); 
    mButtonPlayStop.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      buttonClick(); 
     } 
    }); 

    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(intent, 10); 

} 
    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == RESULT_OK && requestCode == 10) { 
     Uri uri = data.getData(); 

     mMediaPlayer = MediaPlayer.create(mContext, uri); 

     mSeekBar = (SeekBar) findViewById(R.id.SeekBar01); 
     mSeekBar.setMax(mMediaPlayer.getDuration()); 
     mSeekBar.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       seekChange(v); 
       return false; 
      } 
     });   
    } 
} 

private void starPlayProgressUpdater() { 
    mSeekBar.setProgress(mMediaPlayer.getCurrentPosition()); 

    if (mMediaPlayer.isPlaying()) { 
     Runnable notification = new Runnable() { 

      @Override 
      public void run() { 
       starPlayProgressUpdater(); 
      } 
     }; 
     mHandler.postDelayed(notification, 1000); 
    } else { 
     mMediaPlayer.pause(); 
     mButtonPlayStop.setText(getString(R.string.play_str)); 
     mSeekBar.setProgress(0); 
    } 
} 

private void seekChange(View v) { 
    if (mMediaPlayer.isPlaying()) { 
     SeekBar sb = (SeekBar) v; 
     mMediaPlayer.seekTo(sb.getProgress()); 
    } 
} 

private void buttonClick() { 
    if (mButtonPlayStop.getText().equals(getString(R.string.play_str))) { 
     mButtonPlayStop.setText(getString(R.string.pause_str)); 
     try { 
      mMediaPlayer.start(); 
      starPlayProgressUpdater();    
     } catch (IllegalStateException e) { 
      mMediaPlayer.pause(); 
     } 
    } else { 
     mButtonPlayStop.setText(getString(R.string.play_str)); 
     mMediaPlayer.pause(); 
    } 
} 

새로운 NullPointerException이있어? MediaPlayer가의 창조의 소스 코드를 보면

답변

0

, 그것은 다음과 같습니다

public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) { 

     try { 
      MediaPlayer mp = new MediaPlayer(); 
      mp.setDataSource(context, uri); 
      if (holder != null) { 
       mp.setDisplay(holder); 
      } 
      mp.prepare(); 
      return mp; 
     } catch (IOException ex) { 
      Log.d(TAG, "create failed:", ex); 
      // fall through 
     } catch (IllegalArgumentException ex) { 
      Log.d(TAG, "create failed:", ex); 
      // fall through 
     } catch (SecurityException ex) { 
      Log.d(TAG, "create failed:", ex); 
      // fall through 
     } 

     return null; 
    } 

그래서 경우에 오류는 매개 변수에 전달하는 URI가 있으므로, 틀리거나 잘못이라고 할 수있다 create 메소드는 null을 리턴합니다. mediaPlayer 객체를 만들 때 URI가 올바른지 확인하십시오.

if (mButtonPlayStop.getText() == getString(R.string.play_str)) 

는 문자열의 내용을 비교 ==를 사용하지 마십시오 :

또한 나는이 줄을 보았다. 대신 .equals()를 사용

if (mButtonPlayStop.getText().equals(getString(R.string.play_str))) 
+0

감사합니다, 나는 그것을 – Liverpudlian

7

먼저 시작 활동을 SD 카드에서 미디어 파일을 그림 수 있습니다. 그런 다음에 onActivityResult

 @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

      if(resultCode == RESULT_OK && requestCode == 10){ 
       Uri uriSound=data.getData(); 
       play(this, uriSound); 
      } 
     } 

에 다음 코드를 추가하고 선택한 오디오 파일을 미디어 플레이어를 생성하고 재생하려면 아래의 메소드를 호출 다음 코드

Button openFile = (Button) this.findViewById(R.id.ButtonOpen); 
    openFile.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(intent, 10); 
     } 
    }); 

를 교체합니다. 내가 가진 같은 사람이이 질문에 어려움이있는 경우

private void play(Context context, Uri uri) { 

     try { 
      MediaPlayer mp = new MediaPlayer(); 
      mp.setDataSource(context, uri);   
      mp.start(); 
      } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (SecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
    } 
+0

있어 귀하의 가이드 주셔서 감사합니다, 나는 내 코드를 귀하의 의견을 기반으로 개정. 하지만 내 기대는 "저장 장치에서 음악 파일을 선택한 다음 재생 버튼을 사용하여 디코딩 시작/일시 중지"를하는 것입니다. 이제 내 buttonClick에 새로운 오류가 발생했습니다. – Liverpudlian

+0

typo here ... ...이어야합니다. if (resultCode == RESULT_OK – romerun

+0

여러 파일을 선택하려면 다중 선택기 대화 상자가 있습니까? – Neo

0

, 나는 위의 답변에 약간의 수정을했고,이 코드가 작동합니다 : 귀하의 코멘트에 대한

private final int SELECT_PICTURE = 1; 

public void pickMusic() { 
    Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(i,SELECT_MUSIC); 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode == SELECT_MUSIC){ 
      Uri selectedMusicUri = data.getData(); 
      if (selectedMusicUri != null){ 
       String pathFromUri = getRealPathFromURI(this, selectedMusicUri); 
       MediaPlayer mp = new MediaPlayer(); 
       try { 
        mp.setDataSource(this, Uri.parse(pathFromUri)); 
        mp.prepare(); 
        mp.start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 


private String getRealPathFromURI(Context context, Uri contentUri) { 
    String[] projection = { MediaStore.Audio.Media.DATA }; 
    CursorLoader loader = new CursorLoader(context, contentUri, projection, null, null, null); 
    Cursor cursor = loader.loadInBackground(); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
}