09-10 MediaPlayer

MediaPlayer

//**activity_main.xml**
<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">

    <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"
        android:gravity="bottom">
        <SeekBar
            android:id="@+id/seekbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/textview_nowtime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"/>
            <TextView
                android:id="@+id/textview_alltime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"/>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

//**music_list.xml**
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <ImageView
        android:id="@+id/image_header"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_gravity="left"/>
    <TextView
        android:id="@+id/textview_artist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"/>
    <TextView
        android:id="@+id/textview_music"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

//**Config(靜態常量類)**
public class Config {
    public static final int MUSIC_START=0;
    public static final int MUSIC_SEEKTO=1;
}

//MusicAdapter(class文件)
public class MusicAdapter extends BaseAdapter{
    private LayoutInflater mInflater;

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

    private File[] musicFiles;
    @Override
    public int getCount() {
        return musicFiles.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 parent) {
        ViewHolder viewHolder=null;
        if(convertView==null){
            convertView=mInflater.inflate(R.layout.music_list,null);
            viewHolder=new ViewHolder();
            viewHolder.music_name= (TextView) convertView.findViewById(R.id.textview_music);
            viewHolder.music_author= (TextView) convertView.findViewById(R.id.textview_artist);
            viewHolder.imageView_header= (ImageView) convertView.findViewById(R.id.image_header);
            convertView.setTag(viewHolder);
        }else {
            viewHolder= (ViewHolder) convertView.getTag();
        }
        viewHolder.music_name.setText(musicFiles[position].getName());
        MediaMetadataRetriever mmr=new MediaMetadataRetriever();
        mmr.setDataSource(musicFiles[position].getAbsolutePath());
        //顯示歌曲圖片
        byte[] image=mmr.getEmbeddedPicture();
        if(image!=null){
            Bitmap bitmap= BitmapFactory.decodeByteArray(image,0,image.length);
            viewHolder.imageView_header.setImageBitmap(bitmap);
        }else {
            viewHolder.imageView_header.setImageResource(R.mipmap.ic_launcher);
        }
        //顯示歌曲作者
        String artist=mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
        if(artist!=null){
            viewHolder.music_author.setText(artist);
        }else {
            viewHolder.music_author.setText("<未知>");
        }
        return convertView;
    }
    class ViewHolder{
        TextView music_name;
        TextView music_author;
        ImageView imageView_header;
    }
}

//**MusicService(歌曲播放、進度條設置)**
public class MusicService extends Service {
    public static final int  All_TIME=0;
    public static final int  NOW_TIME=1;
    public static final String  ADDPOSTION="addpostion";
    private MediaPlayer player;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(final Intent intent, int flags, int startId) {
        int type=intent.getIntExtra("type",Config.MUSIC_START);
        switch (type){
            case Config.MUSIC_START://播放歌曲
                startMusic(intent);
                break;
            case Config.MUSIC_SEEKTO://進度條顯示
                if(player!=null){
                    int progress=intent.getIntExtra("progress",0);
                    player.pause();
                    player.seekTo(progress);
                    player.start();
                }
                break;
            default:
                break;
        }

        return super.onStartCommand(intent, flags, startId);
    }

    /*
    歌曲播放
     */
    private void startMusic(Intent intent) {
        String musicPath=intent.getStringExtra("musicName");
        if(player==null){
            player=new MediaPlayer();
        }
        player.reset();
        try {
            player.setDataSource(musicPath);
            player.prepare();
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                    int allTime=mp.getDuration();
                    Intent intent_all=new Intent(ADDPOSTION);
                    intent_all.putExtra("type",All_TIME);//歌曲播放的總時間
                    intent_all.putExtra("allTime",allTime);
                    sendBroadcast(intent_all);
                    MusicPlayerThread thread=new MusicPlayerThread();
                    thread.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class MusicPlayerThread extends Thread{
        @Override
        public void run() {
            while (player.isPlaying()){
                int nowTime=player.getCurrentPosition();
                Intent intent_now=new Intent(ADDPOSTION);
                intent_now.putExtra("type",NOW_TIME);//歌曲播放的進度時間
                intent_now.putExtra("nowTime",nowTime);
                sendBroadcast(intent_now);
            }
            super.run();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

//**MainActivity**
public class MainActivity extends AppCompatActivity {

    private SeekBar mSeekBar;
    private MusicAdapter mAdapter;
    private LayoutInflater mInflater;
    private MediaPlayer player;
    private File[] musicFiles;
    private ListView musicListview;
    private MyMusicReceiver myMusicReceiver;
    public static final String  ADDPOSTION="addpostion";
    private TextView textViewAlltime;
    private TextView textViewNowtime;

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

        //進度條顯示,播放時間顯示
        mSeekBar= (SeekBar) findViewById(R.id.seekbar);
        myMusicReceiver=new MyMusicReceiver();
        IntentFilter filter=new IntentFilter();
        filter.addAction(ADDPOSTION);
        registerReceiver(myMusicReceiver,filter);
        textViewAlltime= (TextView) findViewById(R.id.textview_alltime);
        textViewNowtime= (TextView) findViewById(R.id.textview_nowtime);

        //顯示歌曲列表
        musicListview= (ListView) findViewById(R.id.listview);
        File musicDir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
        musicFiles=musicDir.listFiles();
        mInflater=getLayoutInflater();
        mAdapter=new MusicAdapter(mInflater,musicFiles);
        musicListview.setAdapter(mAdapter);
        musicListview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent=new Intent(getApplicationContext(),MusicService.class);
                intent.putExtra("type",Config.MUSIC_START);
                intent.putExtra("musicName",musicFiles[position].getAbsolutePath());
                startService(intent);
            }
        });

        //進度條的顯示控制
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

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

    }

    //接收廣播
    class MyMusicReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            int type=intent.getIntExtra("type",1);
            switch (type){
                case MusicService.All_TIME://歌曲播放的總時間
                    int allTime=intent.getIntExtra("allTime",1);
                    textViewAlltime.setText(""+allTime);
                    mSeekBar.setMax(allTime);
                    break;
                case MusicService.NOW_TIME://歌曲播放的進度時間
                    int nowTime=intent.getIntExtra("nowTime",1);
                    textViewNowtime.setText(""+nowTime);
                    mSeekBar.setProgress(nowTime);
                    break;
                default:
                    break;
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myMusicReceiver);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章