2015-06-18 116 views
2

我正在制作一个简单的MP3播放器。 A.mp3在sdcard上。关于mp3播放器

当我点击按钮注意到,为什么?

我不知道它有什么问题。

这里的MainActivity文件:

public class MainActivity extends Activity implements OnClickListener{ 
     private Button play; 
     private Button pause; 
     private Button stop; 
     private MediaPlayer mediaPlayer = new MediaPlayer(); 

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

     play =(Button)findViewById(R.id.play); 
     pause = (Button) findViewById(R.id.pause); 
     stop = (Button) findViewById(R.id.stop); 
     play.setOnClickListener(this); 
     pause.setOnClickListener(this); 
     stop.setOnClickListener(this); 

     initMediaPlayer(); 

    } 
    private void initMediaPlayer() 
    { 
     try { 
      File file =new File(Environment.getExternalStorageDirectory(),"A.mp3"); 
      mediaPlayer.setDataSource(file.getPath()); 
      mediaPlayer.prepareAsync(); 

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

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
     case R.id.play: 
      if (!mediaPlayer.isPlaying()) { 
       mediaPlayer.start(); 
      } 
      break; 
     case R.id.pause: 
      if (mediaPlayer.isPlaying()) { 
       mediaPlayer.pause(); 
      } 
      break; 
     case R.id.stop: 
      if (mediaPlayer.isPlaying()) { 
       mediaPlayer.reset(); 
       initMediaPlayer(); 
      } 
      break; 
     default: 
      break; 
     } 
    } 

    @Override 
    protected void onDestroy() { 

     super.onDestroy(); 

     if (mediaPlayer != null) { 
      mediaPlayer.stop(); 
      mediaPlayer.release(); 
     } 
    } 

} 

这里是Layout文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
<Button 
    android:id="@+id/play" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:text="Play" /> 
<Button 
    android:id="@+id/pause" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:text="Pause" /> 
<Button 
    android:id="@+id/stop" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:text="Stop" /> 

我发现SD卡的路径是 “/存储/ sdcard1 /”。所以我使用mediaPlayer.setDataSource(“/ storage/sdcard1/A.mp3”);但它是一样的.setDataSource没有运行

+0

你可以发布你的xml在哪里定义按钮? – TheTanic

+0

我已发布xml .. –

+0

您是否检查您的应用程序是否输入案例? – TheTanic

回答

0

回复评论中的回复,我更新了我的答案。
1 ..

private void initMediaPlayer() 
{ 
    try { 
     File file =new File(Environment.getExternalStorageDirectory(),"A.mp3"); 
     mediaPlayer.setDataSource(file.getPath()); 
     mediaPlayer.prepare(); // Replace this line. 

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

你可以尝试使用

public void prepareAsync() 

,而不是准备。由于prepare()使用可以阻止程序的同步线程。

http://developer.android.com/reference/android/media/MediaPlayer.html#prepareAsync()

继续使用异步Prepare方法,它是更有效的。

2 ..
此外,如果您设置了OnErrorListener,则会在您设置数据源时检查错误。

public void setOnErrorListener (MediaPlayer.OnErrorListener listener) 

http://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener%28android.media.MediaPlayer.OnErrorListener%29

3 ..
如果你是显示了一个错误:

Tag MediaPlayer start called in state 0;Tag MediaPlayer error(-38,0) 

这表明MediaPlayer的状态不是inialised。你可以在这里看到的状态:

http://developer.android.com/reference/android/media/MediaPlayer.html

4 ..
确保你有你的参数设置数据源以正确的格式:

setDataSource(FileDescriptor), or setDataSource(String), or setDataSource(Context, Uri), or setDataSource(FileDescriptor, long, long) transfers a MediaPlayer object in the Idle state to the Initialized state.

5 ..
然后使用OnPrepared()听众http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html

然后您可以安全地拨打mediaplayer.start()

6 ..
也看到了这个问题Media Player called in state 0, error (-38,0)

7 ..
如果不解决这个问题,让我知道。

+0

这些情况看起来不错,除非玩家处于未检查状态。而不仅仅是打击。我会尝试首先使用异步方法。 –

+0

我使用Log.d()。我发现initMediaPlayer()没有运行。为什么? –

+0

@vankexu它扔什么错误? –