2015-12-04 110 views
1

任何人都可以幫助我解決這個問題。下面是我的代碼,它可以正常運行,但我想從sd卡的文件夾(如/sdcard/Music/song.mp3)播放音樂。Android:如何從SD卡播放音頻文件

public class MainActivity extends Activity implements View.OnClickListener,SeekBar.OnSeekBarChangeListener { 

    private MediaPlayer mediaPlayer; 
    public TextView songName, duration,tvTotalTime; 
    private double timeElapsed = 0, finalTime = 0; 
    private int forwardTime = 2000, backwardTime = 2000; 
    private Handler durationHandler = new Handler(); 
    private SeekBar seekbar; 
    private ImageButton imgPlay,imgPause; 

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

     getid(); 
     initializeViews(); 
     setListner(); 
    } 

    private void setListner() { 
     imgPlay.setOnClickListener(this); 
     imgPause.setOnClickListener(this); 
     seekbar.setOnSeekBarChangeListener(this); 
    } 

    private void getid() { 

     songName = (TextView) findViewById(R.id.songName); 
     tvTotalTime =(TextView)findViewById(R.id.tvTotalTime); 
     mediaPlayer = MediaPlayer.create(this, R.raw.dheere); 
     duration = (TextView) findViewById(R.id.duration); 
     seekbar = (SeekBar) findViewById(R.id.seekBar); 
     imgPlay =(ImageButton)findViewById(R.id.imgPlay); 
     imgPause =(ImageButton)findViewById(R.id.imgPause); 
    } 

    public void initializeViews(){ 

     finalTime = mediaPlayer.getDuration(); 
     songName.setText("Sample_Song.mp3"); 
     seekbar.setMax((int) finalTime); 
     seekbar.setClickable(true); 

     } 



    //handler to change seekBarTime 
     private Runnable updateSeekBarTime = new Runnable() { 
     public void run() { 
      //get current position 
      timeElapsed = mediaPlayer.getCurrentPosition(); 
      //set seekbar progress 
      seekbar.setProgress((int) timeElapsed); 


      tvTotalTime.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime))); 

      //set time remaing 
      double timeRemaining = finalTime - timeElapsed; 
      duration.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining), TimeUnit.MILLISECONDS.toSeconds((long) timeRemaining) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining)))); 

      //repeat yourself that again in 100 miliseconds 
      durationHandler.postDelayed(this, 100); 
     } 
    }; 


    @Override 
     public void onClick(View v) { 

     try { 
      switch (v.getId()) 
      { 
       case R.id.imgPlay: 

        mediaPlayer.start(); 
        timeElapsed = mediaPlayer.getCurrentPosition(); 
        seekbar.setProgress((int) timeElapsed); 
        durationHandler.postDelayed(updateSeekBarTime, 100); 

        break; 

       case R.id.imgPause: 

        mediaPlayer.pause(); 

        break; 

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

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

     if (fromUser) { 
      mediaPlayer.seekTo(progress); 
     } 

    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
} 

回答

1

只需設置路徑MediaPlayer對象,並開始發揮它...

MediaPlayer mp = new MediaPlayer(); 
mp.setDataSource("/mnt/sdcard/yourdirectory/youraudiofile.wav"); 
mp.prepare(); 
mp.start(); 

,你可以更新一個線程或的AsyncTask運行,直到音頻剪輯繼續發揮搜索條在你的線程,你將不得不更新您的搜索欄

int mCurrentPosition = mp.getCurrentPosition()/1000; 
mSeekBar.setProgress(mCurrentPosition); 

,並確保你有解決搜索欄的最大值

mSeekBar.setMax(mp.getDuration()); 
0

它的工作原理是這樣的:

mpintro = MediaPlayer.create(this, Uri.parse(Environment.getExternalStorageDirectory().getPath()+ "/Music/intro.mp3")); 
mpintro.setLooping(true); 
mpintro.start(); 
+0

嗨Krunal, 我加你的方法,我的代碼播放MP3文件,但它顯示像這樣在開關等情況下,上述方法的代碼錯誤: - 案例R.id.imgPlay: 錯誤如下所示: MediaPlayer.setLooping(boolean)'對一個空對象引用。 –

+0

它沒有正常工作作爲字符串文件路徑... –

+0

嗨sakib,我檢查它,並做一個演示,我沒有發現任何問題。 –