2017-02-26 142 views
1

我正在尝试构建具有音乐播放功能的应用程序。 当应用程序启动时,它会显示歌曲列表,当您点击它时,歌曲标题会显示,但歌曲不会播放。请如何解决这个问题。这是我的music.java文件Android音乐播放器未播放所选歌曲

public class Music extends ListActivity { 

private static final int UPDATE_FREQUENCY = 500; 
private static final int STEP_VALUE = 4000; 

private MediaCursorAdapter mediaAdapter = null; 
private TextView selelctedFile = null; 
private SeekBar seekbar = null; 
private MediaPlayer player = null; 
private ImageButton playButton = null; 
private ImageButton prevButton = null; 
private ImageButton nextButton = null; 
private ImageButton floatButton = null; 
private ImageButton floatButton2 = null; 

private boolean isStarted = true; 
private String currentFile = ""; 
private boolean isMoveingSeekBar = false; 

private final Handler handler = new Handler(); 

private final Runnable updatePositionRunnable = new Runnable() { 
    public void run() { 
     updatePosition(); 
    } 
}; 


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


    LinearLayout ms = (LinearLayout) findViewById(R.id.music_search); 
    ms.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent Ms = new Intent(Music.this, Google.class); 
      startActivity(Ms); 
     } 
    }); 

    LinearLayout mr = (LinearLayout) findViewById(R.id.music_read); 
    mr.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent Mr = new Intent(Music.this, Pdf.class); 
      startActivity(Mr); 
     } 
    }); 


    selelctedFile = (TextView) findViewById(R.id.selectedfile); 
    seekbar = (SeekBar) findViewById(R.id.seekbar); 
    playButton = (ImageButton) findViewById(R.id.play); 
    prevButton = (ImageButton) findViewById(R.id.prev); 
    nextButton = (ImageButton) findViewById(R.id.next); 

    player = new MediaPlayer(); 

    player.setOnCompletionListener(onCompletion); 
    player.setOnErrorListener(onError); 
    seekbar.setOnSeekBarChangeListener(seekBarChanged); 

    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); 

    if (null != cursor) { 
     cursor.moveToFirst(); 

     mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor); 

     setListAdapter(mediaAdapter); 

     playButton.setOnClickListener(onButtonClick); 
     nextButton.setOnClickListener(onButtonClick); 
     prevButton.setOnClickListener(onButtonClick); 
    } 

} 

@Override 
protected void onListItemClick(ListView list, View view, int position, long id) { 
    super.onListItemClick(list, view, position, id); 

    currentFile = (String) view.getTag(); 

    startPlay(currentFile); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    handler.removeCallbacks(updatePositionRunnable); 
    player.stop(); 
    player.reset(); 
    player.release(); 

    player = null; 
} 

private void startPlay(String file) { 
    Log.i("Selected: ", file); 

    selelctedFile.setText(file); 
    seekbar.setProgress(0); 

    player.stop(); 
    player.reset(); 

    try { 
     player.setDataSource(file); 
     player.prepare(); 
     player.start(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    seekbar.setMax(player.getDuration()); 
    playButton.setImageResource(android.R.drawable.ic_media_pause); 

    updatePosition(); 

    isStarted = true; 
} 

private void stopPlay() { 
    player.stop(); 
    player.reset(); 
    playButton.setImageResource(android.R.drawable.ic_media_play); 
    handler.removeCallbacks(updatePositionRunnable); 
    seekbar.setProgress(0); 

    isStarted = false; 
} 

private void updatePosition() { 
    handler.removeCallbacks(updatePositionRunnable); 

    seekbar.setProgress(player.getCurrentPosition()); 

    handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY); 
} 



private class MediaCursorAdapter extends SimpleCursorAdapter { 

    public MediaCursorAdapter(Context context, int layout, Cursor c) { 
     super(context, layout, c, 
       new String[]{MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION}, 
       new int[]{R.id.displayname, R.id.title, R.id.duration}); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     TextView title = (TextView) view.findViewById(R.id.title); 
     TextView name = (TextView) view.findViewById(R.id.displayname); 
     TextView duration = (TextView) view.findViewById(R.id.duration); 

     name.setText(cursor.getString(
       cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME))); 

     title.setText(cursor.getString(
       cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))); 

     long durationInMs = Long.parseLong(cursor.getString(
       cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION))); 

     double durationInMin = ((double) durationInMs/1000.0)/60.0; 

     durationInMin = new BigDecimal(Double.toString(durationInMin)).setScale(2, BigDecimal.ROUND_UP).doubleValue(); 

     duration.setText("" + durationInMin); 

     view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA))); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.listitem, parent, false); 

     bindView(v, context, cursor); 

     return v; 
    } 
} 

private View.OnClickListener onButtonClick = new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.play: { 
       if (player.isPlaying()) { 
        handler.removeCallbacks(updatePositionRunnable); 
        player.pause(); 
        playButton.setImageResource(android.R.drawable.ic_media_play); 
       } else { 
        if (isStarted) { 
         player.start(); 
         playButton.setImageResource(android.R.drawable.ic_media_pause); 

         updatePosition(); 
        } else { 
         startPlay(currentFile); 
        } 
       } 

       break; 
      } 
      case R.id.next: { 
       int seekto = player.getCurrentPosition() + STEP_VALUE; 

       if (seekto > player.getDuration()) 
        seekto = player.getDuration(); 

       player.pause(); 
       player.seekTo(seekto); 
       player.start(); 

       break; 
      } 
      case R.id.prev: { 
       int seekto = player.getCurrentPosition() - STEP_VALUE; 

       if (seekto < 0) 
        seekto = 0; 

       player.pause(); 
       player.seekTo(seekto); 
       player.start(); 

       break; 
      } 
     } 
    } 
}; 

private MediaPlayer.OnCompletionListener onCompletion = new MediaPlayer.OnCompletionListener() { 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     stopPlay(); 
    } 
}; 

private MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() { 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 

     return false; 
    } 
}; 

private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     isMoveingSeekBar = false; 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     isMoveingSeekBar = true; 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if (isMoveingSeekBar) { 
      player.seekTo(progress); 

      Log.i("OnSeekBarChangeListener", "onProgressChanged"); 
     } 
    } 
    }; 
}` 

和我activity_music文件

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="com.android.beez.study13.Music"> 



<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff"> 


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#0a0b0e" 
     android:orientation="vertical" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     tools:context=".Music"> 

     <ListView 
      android:id="@android:id/list" 
      android:background="#f0fffdfd" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textColor="@android:color/black" 
      android:layout_weight="1.0" /> 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:backgroundTint="#f7262624" 
      android:background="@android:drawable/screen_background_light" 
      android:orientation="vertical" 
      android:padding="10dip"> 

      <TextView 
       android:id="@+id/selectedfile" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:ellipsize="middle" 
       android:gravity="center_horizontal" 
       android:singleLine="true" 
       android:text="No file selected" 
       android:textColor="@android:color/black" /> 

      <SeekBar 
       android:id="@+id/seekbar" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:max="100" 
       android:paddingBottom="10dip" /> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:background="@android:drawable/screen_background_light" 
       android:gravity="center" 
       android:backgroundTint="#ca030b03" 
       android:orientation="horizontal"> 

       <ImageButton 
        android:id="@+id/prev" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="#000" 
        android:src="@android:drawable/ic_media_previous" /> 

       <ImageButton 
        android:id="@+id/play" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@android:drawable/ic_media_play" /> 

       <ImageButton 
        android:id="@+id/next" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="#000" 
        android:src="@android:drawable/ic_media_next" /> 

      </LinearLayout> 

     </LinearLayout> 

     </LinearLayout> 


     </LinearLayout> 

    </LinearLayout>` 

和我listitem.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<TextView 
    android:id="@+id/displayname" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:singleLine="true" 
    android:textSize="18dip" 
    android:textStyle="bold" /> 

    <LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1.0" 
     android:ellipsize="end" 
     android:singleLine="true" 
     android:textSize="15dip" /> 

    <TextView 
     android:id="@+id/duration" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ellipsize="end" 
     android:gravity="right" 
     android:singleLine="true" 
     android:textSize="15dip" /> 
    </LinearLayout> 


</LinearLayout>` 
+0

什么是错误日志? – Kaushal28

回答

3

假设故障在你的媒体播放器,使用prepareAsync()而不是仅仅prepare()。你也可以尝试在你的媒体播放器设置onPrepareListener如下:

mediaPlayer.setOnPreparedListener(new OnPreparedListener(){ 

    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mediaPlayer.start(); 
    } 
}); 

要知道你为什么要设置这个监听器,请this link

Here you can find the difference between prepare() and prepareAsync()

希望这有助于:)

1

使用像我有它下面提及的媒体播放器需要媒体播放器的某个时候加载音乐内容进行播放。

让我知道是否有问题。

private MediaPlayer mMediaPlayer = mMediaPlayer = new MediaPlayer(); 
    mMediaPlayer.setOnPreparedListener(mPreparedListener); 
    mMediaPlayer.setDataSource(file); 
    mMediaPlayer.prepareAsync(); 

    private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 

      mMediaPlayer.start(); 

     } 
    };