Android的音乐播放器 [英] Android Music Player

查看:165
本文介绍了Android的音乐播放器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我作出的音乐播放器App.I有SongsList(SongList.java)和媒体播放器控制两个不同的片段(即Mediaplayer.java,包括播放,暂停按钮)。现在,我想我的SongsList.java与Mediaplayer.java连接。我想选择从中获取Mediaplayer.java发挥SongsList.java一首歌曲。我该怎么办?请帮助!

SongList.java

 进口android.app.Fragment;
 进口android.content.ContentResolver;
 进口android.database.Cursor;
 进口android.net.Uri;
 进口android.os.Bundle;
 进口android.view.LayoutInflater;
 进口android.view.View;
 进口android.view.ViewGroup;
 进口android.widget.ListView;
 进口的java.util.ArrayList;
 进口java.util.Collections中;
 进口了java.util.Comparator; 公共类的SongList扩展片段{
 私人的ArrayList<宋>的SongList;
 私人的ListView songView;
 @覆盖
 公共查看onCreateView(LayoutInflater气筒,
                     ViewGroup中容器,包savedInstanceState){//充气的布局该片段
查看查看= inflater.inflate(
        R.layout.songs,集装箱,FALSE);
songView =(ListView控件)view.findViewById(R.id.song_list);的SongList =新的ArrayList<宋>();
getSongList();
Collections.sort(的SongList,新的比较<宋>(){
    公众诠释比较(宋一,宋二){
        返回a.getTitle()的compareTo(b.getTitle())。
    }
});
SongAdapter songAdt =新SongAdapter(getActivity()的SongList);
songView.setAdapter(songAdt);songView.setOnItemClickListener(新AdapterView.OnItemClickListener(){
        @覆盖
        公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的id){
            ///////////////////什么事要做!//////////////////
        }
    });返回视图。
}公共无效getSongList(){
//获取歌曲信息
ContentResolver的musicResolver = getActivity()getContentResolver()。
乌里musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
光标musicCursor = musicResolver.query(musicUri,NULL,NULL,NULL,NULL);
如果(musicCursor =空&放大器;!&放大器; musicCursor.moveToFirst()){
    //获取列
    INT titleColumn = musicCursor.getColumnIndex
            (android.provider.MediaStore.Audio.Media.TITLE);
    INT idColumn = musicCursor.getColumnIndex
            (android.provider.MediaStore.Audio.Media._ID);
    INT artistColumn = musicCursor.getColumnIndex
            (android.provider.MediaStore.Audio.Media.ARTIST);
    //添加歌曲名单
    做{
        长thisId = musicCursor.getLong(idColumn);
        字符串thisTitle = musicCursor.getString(titleColumn);
        字符串thisArtist = musicCursor.getString(artistColumn);
        songList.add(新曲(thisId,thisTitle,thisArtist));
    }
    而(musicCursor.moveToNext());
}
}
}

MediaPlayer.java(有些按钮尚未实现)

 进口android.app.Fragment;
进口android.graphics.drawable.Drawable;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.os.Handler;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.ImageButton;
进口android.widget.SeekBar;
进口android.widget.TextView; 进口java.util.concurrent.TimeUnit中;
 公共类媒体播放器扩展片段{ 可绘制shuffle1,back1,play1,NEXT1,​​repeat1; ImageButton的洗牌,背部,播放,接下来,重复;
 TextView的开始,结束,艺术家,歌曲;
 搜索栏songprogress;
 私人的MediaPlayer媒体播放器;
 私人双STARTTIME = 0;
 私人双finalTime = 0;
 私人处理程序将myHandler =新的处理程序();;    @覆盖
   公共查看onCreateView(LayoutInflater气筒,
                     ViewGroup中容器,包savedInstanceState){//充气的布局该片段
查看查看= inflater.inflate(
        R.layout.content_main,集装箱,FALSE);
启动=(TextView中)view.findViewById(R.id.songCurrentDurationLabel);
结束=(TextView中)view.findViewById(R.id.songTotalDurationLabel);
曲=(TextView中)view.findViewById(R.id.song_title);
艺术家=(TextView中)view.findViewById(R.id.songArtist);
洗牌=(的ImageButton)view.findViewById(R.id.shuffle);
回到=(的ImageButton)view.findViewById(R.id.back);
玩=(的ImageButton)view.findViewById(R.id.play);
接下来=(的ImageButton)view.findViewById(R.id.next);
重复=(的ImageButton)view.findViewById(R.id.repeat);
songprogress =(搜索栏)view.findViewById(R.id.songProgressBar);  媒体播放器= MediaPlayer.create(getActivity(),R.raw.song);
  mediaPlayer.setOnCompletionListener(新MediaPlayer.OnCompletionListener(){
  @覆盖
   公共无效onCompletion(MediaPlayer的MP){
   play1 =
        。getResources()getDrawable(R.drawable.play);
  play.setImageDrawable(play1);  songprogress.setProgress(0);  }
  });
   play.setOnClickListener(新View.OnClickListener(){
    @覆盖
    公共无效的onClick(视图v){        songprogress.setClickable(真);        如果(!mediaPlayer.isPlaying()){            mediaPlayer.start();
            finalTime = mediaPlayer.getDuration();
            STARTTIME = mediaPlayer.getCurrentPosition();            play1 =
                    。getResources()getDrawable(R.drawable.pause);
            play.setImageDrawable(play1);
            songprogress.setMax((INT)finalTime);            end.setText(的String.format(%d个%D,
                            TimeUnit.MILLISECONDS.toMinutes((长)finalTime)
                            TimeUnit.MILLISECONDS.toSec​​onds((长)finalTime) -
                                    TimeUnit.MINUTES.toSec​​onds(TimeUnit.MILLISECONDS.toMinutes((长)finalTime)))
            );            start.setText(的String.format(%d个%D,
                            TimeUnit.MILLISECONDS.toMinutes((长)的startTime)
                            TimeUnit.MILLISECONDS.toSec​​onds((长)的startTime) -
                                    TimeUnit.MINUTES.toSec​​onds(TimeUnit.MILLISECONDS.toMinutes((长)的startTime)))
            );            songprogress.setProgress((INT)的startTime);
            myHandler.postDelayed(UpdateSongTime,100);        }其他{
            mediaPlayer.pause();
            play1 =
                    。getResources()getDrawable(R.drawable.play);
            play.setImageDrawable(play1);
        }
    }
   });
   songprogress.setOnSeekBarChangeListener(新SeekBar.OnSeekBarChangeListener(){
    @覆盖
    公共无效onProgressChanged(搜索栏搜索栏,INT进步,布尔FROMUSER){
        如果(媒体播放器= NULL&放大器;!&安培; FROMUSER){
            mediaPlayer.seekTo(进度);
        }
    }    @覆盖
    公共无效onStartTrackingTouch(搜索栏搜索栏){    }    @覆盖
    公共无效onStopTrackingTouch(搜索栏搜索栏){    }
});返回视图。
}
私人Runnable接口UpdateSongTime =新的Runnable(){
公共无效的run(){
    STARTTIME = mediaPlayer.getCurrentPosition();
    start.setText(的String.format(%d个%D,                    TimeUnit.MILLISECONDS.toMinutes((长)的startTime)
                    TimeUnit.MILLISECONDS.toSec​​onds((长)的startTime) -
                            TimeUnit.MINUTES.toSec​​onds(TimeUnit.MILLISECONDS。
                                    toMinutes((长)的startTime)))
    );
    songprogress.setProgress((INT)的startTime);
    myHandler.postDelayed(此,100);
}
};
}

SongAdapter.java

 进口android.view.View;
 进口android.view.ViewGroup;
 进口android.widget.BaseAdapter;
 进口的java.util.ArrayList;
 进口android.content.Context;
 进口android.view.LayoutInflater;
 进口android.widget.LinearLayout;
 进口android.widget.TextView;
公共类SongAdapter延伸BaseAdapter {
 私人的ArrayList<宋>歌曲;
私人LayoutInflater songInf;
公共SongAdapter(上下文C,ArrayList的<宋> theSongs){
    歌曲= theSongs;
    songInf = LayoutInflater.from(C);
}
@覆盖
公众诠释的getCount(){
    返回songs.size();
}@覆盖
公共对象的getItem(INT位置){
    返回null;
}@覆盖
众长getItemId(INT位置){
    返回0;
}@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
    //地图歌布局
    的LinearLayout songLay =(LinearLayout中)songInf.inflate
            (R.layout.songlistitem,父母,假);
    //获取标题和艺术家的意见
    TextView的songView =(TextView中)songLay.findViewById(R.id.song_title);
    TextView的artistView =(TextView中)songLay.findViewById(R.id.song_artist);
    //获取歌曲使用位置
    宋currSong = songs.get(位置);
    //获取标题和艺术家弦
    songView.setText(currSong.getTitle());
    artistView.setText(currSong.getArtist());
    //设置位置标记
    songLay.setTag(位置);
    返回songLay;
}
}


解决方案

您可以简单地使用 Songig MusicPlayer库机器人。
Songig处理所有的音乐播放列表,让你与许多回调管理你的清单。
可以绑定多个UI在需要时改变他们songig。
比如你可以绑定2 seekbars到songig和songig将改变
在每次更新他们的进步。

I am making an Music Player App.I have two different Fragments for SongsList (SongList.java) and Mediaplayer Controls(i.e Mediaplayer.java that includes play, pause buttons). Now, i want to connect my SongsList.java with Mediaplayer.java. I want to select a song from SongsList.java which gets played in Mediaplayer.java. How do I do ? PLEASE HELP !!!

SongList.java

 import android.app.Fragment;
 import android.content.ContentResolver;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ListView;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;

 public class Songlist extends Fragment {
 private ArrayList<Song> songList;
 private ListView songView;


 @Override
 public View onCreateView(LayoutInflater inflater,
                     ViewGroup container, Bundle savedInstanceState) {

//Inflate the layout for this fragment
View view=inflater.inflate(
        R.layout.songs, container, false);
songView = (ListView)view.findViewById(R.id.song_list);

songList = new ArrayList<Song>();
getSongList();
Collections.sort(songList, new Comparator<Song>() {
    public int compare(Song a, Song b) {
        return a.getTitle().compareTo(b.getTitle());
    }
});
SongAdapter songAdt = new SongAdapter(getActivity(), songList);
songView.setAdapter(songAdt);

songView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ///////////////////WHAT TO DO HERE!//////////////////
        }
    });

return view;
}

public void getSongList() {
//retrieve song info
ContentResolver musicResolver = getActivity().getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if(musicCursor!=null && musicCursor.moveToFirst()){
    //get columns
    int titleColumn = musicCursor.getColumnIndex
            (android.provider.MediaStore.Audio.Media.TITLE);
    int idColumn = musicCursor.getColumnIndex
            (android.provider.MediaStore.Audio.Media._ID);
    int artistColumn = musicCursor.getColumnIndex
            (android.provider.MediaStore.Audio.Media.ARTIST);
    //add songs to list
    do {
        long thisId = musicCursor.getLong(idColumn);
        String thisTitle = musicCursor.getString(titleColumn);
        String thisArtist = musicCursor.getString(artistColumn);
        songList.add(new Song(thisId, thisTitle, thisArtist));
    }
    while (musicCursor.moveToNext());
}
}
}

MediaPlayer.java (Some buttons not implemented yet)

import android.app.Fragment;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.os.Bundle; 
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;

 import java.util.concurrent.TimeUnit;


 public class Mediaplayer  extends Fragment{

 Drawable shuffle1,back1,play1,next1,repeat1;

 ImageButton shuffle,back,play,next,repeat;
 TextView start,end,artist,song;
 SeekBar songprogress;
 private MediaPlayer mediaPlayer;
 private double startTime = 0;
 private double finalTime = 0;
 private Handler myHandler = new Handler();;



    @Override
   public View onCreateView(LayoutInflater inflater,
                     ViewGroup container, Bundle savedInstanceState) {

//Inflate the layout for this fragment
View view=inflater.inflate(
        R.layout.content_main, container, false);
start=(TextView)view.findViewById(R.id.songCurrentDurationLabel);
end=(TextView)view.findViewById(R.id.songTotalDurationLabel);
song=(TextView)view.findViewById(R.id.song_title);
artist=(TextView)view.findViewById(R.id.songArtist);


shuffle=(ImageButton)view.findViewById(R.id.shuffle);
back=(ImageButton)view.findViewById(R.id.back);
play=(ImageButton)view.findViewById(R.id.play);
next=(ImageButton)view.findViewById(R.id.next);
repeat=(ImageButton)view.findViewById(R.id.repeat);
songprogress = (SeekBar) view.findViewById(R.id.songProgressBar);

  mediaPlayer = MediaPlayer.create(getActivity(),R.raw.song);
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()      {
  @Override
   public void onCompletion(MediaPlayer mp) {
   play1 =
        getResources().getDrawable(R.drawable.play);
  play.setImageDrawable(play1);

  songprogress.setProgress(0);

  }
  });
   play.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        songprogress.setClickable(true);

        if(!mediaPlayer.isPlaying()) {

            mediaPlayer.start();
            finalTime = mediaPlayer.getDuration();
            startTime = mediaPlayer.getCurrentPosition();

            play1 =
                    getResources().getDrawable(R.drawable.pause);
            play.setImageDrawable(play1);


            songprogress.setMax((int) finalTime);

            end.setText(String.format("%d.%d",
                            TimeUnit.MILLISECONDS.toMinutes((long) finalTime),
                            TimeUnit.MILLISECONDS.toSeconds((long) finalTime) -
                                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime)))
            );

            start.setText(String.format("%d.%d",
                            TimeUnit.MILLISECONDS.toMinutes((long) startTime),
                            TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
                                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime)))
            );

            songprogress.setProgress((int) startTime);
            myHandler.postDelayed(UpdateSongTime, 100);



        }else{
            mediaPlayer.pause();
            play1 =
                    getResources().getDrawable(R.drawable.play);
            play.setImageDrawable(play1);
        }
    }
   });
   songprogress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if(mediaPlayer != null && fromUser){
            mediaPlayer.seekTo(progress);
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

return view;
}
private Runnable UpdateSongTime = new Runnable() {
public void run() {
    startTime = mediaPlayer.getCurrentPosition();
    start.setText(String.format("%d.%d",

                    TimeUnit.MILLISECONDS.toMinutes((long) startTime),
                    TimeUnit.MILLISECONDS.toSeconds((long) startTime) -
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.
                                    toMinutes((long) startTime)))
    );
    songprogress.setProgress((int)startTime);
    myHandler.postDelayed(this, 100);
}
};
}

SongAdapter.java

 import android.view.View; 
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import java.util.ArrayList;
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.widget.LinearLayout;
 import android.widget.TextView;


public class SongAdapter extends BaseAdapter {
 private ArrayList<Song> songs;
private LayoutInflater songInf;
public SongAdapter(Context c, ArrayList<Song> theSongs){
    songs=theSongs;
    songInf=LayoutInflater.from(c);
}
@Override
public int getCount() {
    return songs.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //map to song layout
    LinearLayout songLay = (LinearLayout)songInf.inflate
            (R.layout.songlistitem, parent, false);
    //get title and artist views
    TextView songView = (TextView)songLay.findViewById(R.id.song_title);
    TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
    //get song using position
    Song currSong = songs.get(position);
    //get title and artist strings
    songView.setText(currSong.getTitle());
    artistView.setText(currSong.getArtist());
    //set position as tag
    songLay.setTag(position);
    return songLay;
}
}

解决方案

You can simply use Songig MusicPlayer library for android. Songig handle all your music playlist and let you to manage your list with many callbacks. you can bind many ui to songig for change them when needed. for example you can bind 2 seekbars to songig and songig will change progress of them in every update.

这篇关于Android的音乐播放器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆