音樂播放器

當退出一個界面時,音樂播放不能停止,因此需要把播放音樂的代碼寫在service中,

public class MainActivity extends Activity {
    private ListView mListView;
    private File[] musics;
    private MusicAdapter musicAdapter;
    private MyReceiver myReceiver;
    private SeekBar mSeekBar;
    private TextView mTextViewAll;
    private TextView mTextViewCurrent;
    private Button mButtonPause;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.listview);
        mButtonPause = (Button) findViewById(R.id.button_pause);

        myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.play.music");
        registerReceiver(myReceiver, filter);

        File sdcard = Environment.getExternalStorageDirectory();
        File musicDir = new File(sdcard,"/Music");
        Log.d("music",musicDir.getAbsolutePath());
        musics = musicDir.listFiles();

        musicAdapter = new MusicAdapter(getLayoutInflater(),musics);
        mListView.setAdapter(musicAdapter);

        mTextViewAll = (TextView) findViewById(R.id.textview_all);
        mTextViewCurrent = (TextView) findViewById(R.id.textview_current);
        mSeekBar = (SeekBar) findViewById(R.id.seekBar);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                String music = musics[position].getAbsolutePath();
                Intent intent = new Intent(getApplicationContext(),MusicService.class);
                intent.putExtra("type",Config.START_NEW_MUSIC);
                intent.putExtra("musicName",music);
                startService(intent);
            }
        });
        mButtonPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),MusicService.class);
                intent.putExtra("type", 3);
                startService(intent);

            }
        });
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                Intent intent = new Intent(getApplicationContext(),MusicService.class);
                intent.putExtra("type",Config.SEEKBAR_TO);
                intent.putExtra("progress",seekBar.getProgress());
                startService(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }

    class MyReceiver extends BroadcastReceiver{
        SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");
        @Override
        public void onReceive(Context context, Intent intent) {
            int type = intent.getIntExtra("type",Config.START_NEW_MUSIC);
            switch (type){
                case 0:
                    int duration = intent.getIntExtra("duration",0);
                    mSeekBar.setMax(duration);
                    String hms = formatter.format(duration);
                    mTextViewAll.setText("音樂時長:"+hms);
                    break;
                case 1:
                    int currentTime = intent.getIntExtra("duration",0);
                    mSeekBar.setProgress(currentTime);
                    String hms2 = formatter.format(currentTime);
                    mTextViewCurrent.setText("播放時間:"+hms2);
                    break;
            }
        }
    }
}

歌曲的播放放在服務中,onStartCommand是整個服務的開始,開始播放音樂;
MusicPlayThread 是一個新的線程,用於獲取播放的時間,用於顯示進度條的走動和播放時間,不斷的刷新view;
int duration 得到音樂本身的時間,用intent傳到activity。

public class MusicService extends Service {
    private MediaPlayer mediaPlayer;
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        int type = intent.getIntExtra("type",Config.SEEKBAR_TO);
        switch (type){
            case Config.START_NEW_MUSIC:
                startNewMusic(intent);
                break;
            case Config.SEEKBAR_TO:
                if (mediaPlayer!=null){
                    int progress = intent.getIntExtra("progress",0);
                    mediaPlayer.seekTo(progress);
                }
                break;
            case 3:
                if (mediaPlayer!=null){
                    mediaPlayer.pause();
                }
                break;
        }
        return super.onStartCommand(intent, flags, startId);
    }

    private void startNewMusic(Intent intent) {
        String musicPath = intent.getStringExtra("musicName");
        if (mediaPlayer == null){
            mediaPlayer = new MediaPlayer();
        }
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource(musicPath);
            mediaPlayer.prepare();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.start();
                    int duration = mediaPlayer.getDuration();//得到當前播放時間
                    Intent intent = new Intent("com.play.music");
                    intent.putExtra("type",0);
                    intent.putExtra("duration", duration);
                    sendBroadcast(intent);
                    MusicPlayThread thread = new MusicPlayThread();
                    thread.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class MusicPlayThread extends Thread{
        @Override
        public void run() {
            while (mediaPlayer.isPlaying()){
                int time = mediaPlayer.getCurrentPosition();
                Intent intent = new Intent("com.play.music");
                intent.putExtra("type",1);
                intent.putExtra("duration",time);
                sendBroadcast(intent);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            super.run();
        }
    }
}

這是適配器,用於顯示歌曲列表,其中MediaMetadataRetriever 以下的部分可以獲取mp3文件中的圖片和作者名字

public class MusicAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private File[] musics;

    public MusicAdapter(LayoutInflater layoutInflater, File[] musics) {
        this.musics = musics;
        this.mInflater = layoutInflater;
    }

    @Override
    public int getCount() {
        return musics.length;
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder vh = null;
        if (convertView == null){
            vh = new ViewHolder();
            convertView = mInflater.inflate(R.layout.item_music,null);
            vh.tvName = (TextView) convertView.findViewById(R.id.textview);
            vh.tvAuthor = (TextView) convertView.findViewById(R.id.text_author);
            vh.imageView = (ImageView) convertView.findViewById(R.id.imageview);
            convertView.setTag(vh);
        }else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.tvName.setText(musics[position].getName());
        MediaMetadataRetriever mmr = new MediaMetadataRetriever();
        mmr.setDataSource(musics[position].getAbsolutePath());
        String author = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
        if (author!=null){
            vh.tvAuthor.setText(author+"    ");
        }else{
            vh.tvAuthor.setText("<未知>    ");
        }
        byte[] image = mmr.getEmbeddedPicture();
        if (image!=null){
            Bitmap bitmap = BitmapFactory.decodeByteArray(image,0,image.length);
            vh.imageView.setImageBitmap(bitmap);
        }else {
            vh.imageView.setImageResource(R.mipmap.music);
        }
        return convertView;
    }
    class ViewHolder{
        TextView tvName;
        TextView tvAuthor;
        ImageView imageView;
    }
}
<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=".MainActivity">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content">

    </ListView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/textview_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="音樂時長:"/>
        <TextView
            android:id="@+id/textview_current"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="播放時間:"/>

        <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/seekBar"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1" />
        <Button
            android:id="@+id/button_pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:background="@drawable/btn_music"/>

    </LinearLayout>
</LinearLayout>

這是listview裏面的內容,用adapter適配到listview中,顯示歌曲的詳細信息

<ImageView
        android:id="@+id/imageview"
        android:layout_width="50dp"
        android:layout_height="50dp" />
    <TextView
        android:id="@+id/text_author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="作者"/>
    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="歌曲名"
        android:textSize="20dp"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章