原理

实现功能

  • 点击音乐列表中的音乐播放
  • 暂停播放开始播放(包括暂停以后拖动进度条到其他位置再播放)
  • 拖动音乐进度条,音乐从拖动结束位置播放
  • 上一首下一首音乐

流程图

 

原理  

  利用了mediaplayer,广播,服务,listView完成了整体任务。
  在主函数中获得音乐地址,通过listView中的item点击事件打开服务,将音乐路径和名称传到服务中。然后在服务中打开音乐,将音乐的播放时间和音乐名称通过广播传到主线程中,开启服务中的线程将音乐的实时时间(耗时操作)传到主线程中。
  在主线程中注册广播,新建广播接收器的实例。广播接收器通过发送广播时type类型来区别音乐的播放时间和音乐的实时时间,并依此设置textview和seekbar。
  跳转功能通过在服务中MediaPlayer的seekTo来实现。
  暂停播放设置点击事件,通过一个flag,使暂停和播放通过点击交替执行。设置点击具体功能也是在服务中进行,点一下MediaPlayer暂停pause(),再点一下start()。
  音乐的上一首下一首,在主线程中控制,在服务中执行打开音乐的代码块。主线程中通过定义一个全局变量将listView中的position获取。在设置上下首音乐的点击事件中打开播放音乐的服务,并且通过position来设置播放音乐。

功能具体实现

主线程中注册广播,建立广播接收器实例。获得音乐,打开音乐适配器。

获得音乐

//        获得所有的歌曲final File music = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);musics = music.listFiles();

打开音乐适配器

//          添加到listView中final LayoutInflater inflater = getLayoutInflater();MusicAdapter musicAdapter = new MusicAdapter(inflater, musics);mListView.setAdapter(musicAdapter);

音乐适配器中获取歌曲的名字,作者,图片

  public View getView(int position, View convertView, ViewGroup parent) {ViewHolder vh=null;if(convertView==null){vh=new ViewHolder();convertView=mInflater.inflate(R.layout.listview_item,null);vh.musicName = (TextView) convertView.findViewById(R.id.textview_music_name);vh.musicAuther = (TextView) convertView.findViewById(R.id.tv_music_auther);vh.img= (ImageView) convertView.findViewById(R.id.img);convertView.setTag(vh);}vh= (ViewHolder) convertView.getTag();
//        设置音乐名称vh.musicName.setText(musics[position].getName());//      获取作家MediaMetadataRetriever mmr=new MediaMetadataRetriever();mmr.setDataSource(musics[position].getAbsolutePath());String auther=mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
//        判断作者是否为空if(auther!=null){vh.musicAuther.setText(auther);}else {vh.musicAuther.setText("<未知>");}//        获得图片byte[] image=mmr.getEmbeddedPicture();if(image!=null){Bitmap bitmap= BitmapFactory.decodeByteArray(image,0,image.length);vh.img.setImageBitmap(bitmap);}else{vh.img.setImageResource(R.mipmap.ic_launcher);}return convertView;}class ViewHolder{TextView musicName;TextView musicAuther;ImageView img;}

动态注册广播

//          注册广播myBroad = new MyBroadCastService();IntentFilter filter = new IntentFilter();filter.addAction(MUSIC_TIME);registerReceiver(myBroad, filter);

  注销广播

//    动态注册注销广播@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(myBroad);}

新建广播实例

    //    在活动中接受广播以便设置UI参数class MyBroadCastService extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {int type = intent.getIntExtra("type", 0);switch (type) {case 0:int time = intent.getIntExtra("time", 0);mSeekBar.setMax(time);Date date1=new Date(time);SimpleDateFormat format1=new SimpleDateFormat("mm:ss");String s1=format1.format(date1);mTextViewAllTime.setText(s1);break;case 1:int time1 = intent.getIntExtra("time", 0);mSeekBar.setProgress(time1);Date date=new Date(time1);SimpleDateFormat format=new SimpleDateFormat("mm:ss");String s=format.format(date);mTextViewCurrentTime.setText(s);break;}}}

打开音乐

主线程中设置点击事件

//        打开服务,在服务中打开音乐mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent(getApplicationContext(), MyService.class);
//                将点击位置的音乐路径传到服务中intent.putExtra("musicPath", musics[position].getAbsolutePath());intent.putExtra("musicName", musics[position].getName());intent.putExtra("type",Config.MUSIC_CLICK_START);startService(intent);
//                用于设置下一首上一首音乐mPosition =position;}});

服务中实现打开音乐

 private void startMusic(Intent intent) {String musicPath = intent.getStringExtra("musicPath");musicName= intent.getStringExtra("musicName");
//        防止多个歌曲重复if (mediaPlayer == null) {mediaPlayer = new MediaPlayer();}mediaPlayer.reset();try {mediaPlayer.setDataSource(musicPath);mediaPlayer.prepare();mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();int allTime = mediaPlayer.getDuration();
//                   发送广播将时间参数送过去Intent intent1 = new Intent(MainActivity.MUSIC_TIME);intent1.putExtra("type", 0);intent1.putExtra("time", allTime);intent1.putExtra("name",musicName);sendBroadcast(intent1);
//                    服务中不能进行耗时操作,启动一个线程来传递音乐进度条(耗时操作)MySeekBar seekBar = new MySeekBar();seekBar.start();}});} catch (IOException e) {e.printStackTrace();}}

服务其中打开的线程

  class MySeekBar extends Thread {@Overridepublic void run() {
//            super.run();while (mediaPlayer.isPlaying()) {int now = mediaPlayer.getCurrentPosition();Intent intent1 = new Intent(MainActivity.MUSIC_TIME);intent1.putExtra("type", 1);intent1.putExtra("time", now);sendBroadcast(intent1);try {
//                    休眠一秒Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}

实现音乐随进度条播放

主线程中设置点击事件

//        设置音乐随着seekbar的跳转mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {Intent intent=new Intent(getApplicationContext(),MyService.class);intent.putExtra("type", Config.MUSIC_SEEK);intent.putExtra("progress",seekBar.getProgress());startService(intent);}});

服务中实现音乐随进度条播放

  private void seekToProgress(Intent intent) {int progress = intent.getIntExtra("progress", 0);
//                歌曲跳转到progress的位置后保持原来状态mediaPlayer.seekTo(progress);}

实现音乐暂停

主线程中设置点击事件

 mBtnPauseMusic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Intent intent=new Intent(getApplicationContext(),MyService.class);intent.putExtra("flag", flag);intent.putExtra("type", Config.MUSIC_BUTTON_PAUSE);startService(intent);flag=!flag;}});

服务中实现音乐暂停

 private void pauseMusic(Intent intent) {boolean flag = intent.getBooleanExtra("flag", true);if (!flag) {
//                    此时线程关闭了mediaPlayer.pause();} else {
//                  跳转到暂停后滑动到的位置int keepOn = mediaPlayer.getCurrentPosition();mediaPlayer.seekTo(keepOn);mediaPlayer.start();
//                    再次打开线程MySeekBar seekBar = new MySeekBar();seekBar.start();}}

实现下一首音乐

主线程中设置点击事件

//      设置下一首音乐mBtnNextMusic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                不是最后一首音乐时mPosition才+1if(mPosition!=musics.length-1){mPosition++;}Intent intent = new Intent(getApplicationContext(), MyService.class);
//                将点击位置的音乐路径传到服务中intent.putExtra("musicPath", musics[mPosition].getAbsolutePath());intent.putExtra("musicName", musics[mPosition].getName());intent.putExtra("type", Config.MUSIC_NEXT);startService(intent);}});

服务中实现下一首音乐

  在服务中调用打开音乐方法startMusic(intent)

实现上一首音乐

主线程中设置点击事件

//        设置上一首音乐mBtnBeforeMusic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                      不是第一首音乐时mPosition才-1if(mPosition!=0){mPosition--;}Intent intent = new Intent(getApplicationContext(), MyService.class);
//                将点击位置的音乐路径传到服务中intent.putExtra("musicPath", musics[mPosition].getAbsolutePath());intent.putExtra("musicName", musics[mPosition].getName());intent.putExtra("type", Config.MUSIC_PREVIOUS);startService(intent);}});

服务中实现上一首音乐

  在服务中调用打开音乐方法startMusic(intent)

全部代码

布局

<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:gravity="center"android:orientation="vertical"tools:context=".MainActivity"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="0dp"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:cacheColorHint="#00000000"android:background="#ffffff"android:divider="@null"android:layout_weight="1"></ListView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/background"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"><TextViewandroid:id="@+id/textview_current_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dp"android:text="00:00" /><TextViewandroid:id="@+id/textview_all_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_margin="5dp"android:text="00:00" /></RelativeLayout><SeekBarandroid:id="@+id/seekbar"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp"android:gravity="center"><CheckBoxandroid:id="@+id/btn_brfore_music"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/previous_music"android:button="@null" /><CheckBoxandroid:id="@+id/btn_pause_music"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:background="@drawable/start_pause_press"android:button="@null" /><CheckBoxandroid:id="@+id/btn_next_music"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/next_music"android:button="@null" /></LinearLayout></LinearLayout>
</LinearLayout>

ListViewitem布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="match_parent"
android:gravity="center_vertical"android:layout_height="match_parent"><ImageViewandroid:id="@+id/img"android:layout_width="70dp"android:layout_height="70dp"android:layout_margin="10dp"android:src="@mipmap/ic_launcher"/>
<TextViewandroid:id="@+id/textview_music_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="音乐名称"/><TextViewandroid:id="@+id/tv_music_auther"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="作家"android:layout_margin="10dp"/></LinearLayout>

主线程

package com.example.laowang.mymediaplayer;import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Environment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;import com.example.laowang.mymediaplayer.adapter.Config;
import com.example.laowang.mymediaplayer.adapter.MusicAdapter;import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;public class MainActivity extends Activity{private CheckBox mBtnBeforeMusic;private CheckBox mBtnPauseMusic;private CheckBox mBtnNextMusic;private SeekBar mSeekBar;private ListView mListView;private TextView mTextViewAllTime;private TextView mTextViewCurrentTime;private TextView mTextViewMusicName;private MyBroadCastService myBroad;private int mPosition;private File[] musics;private boolean flag;public static final String MUSIC_TIME = "com.laowang.music";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mBtnBeforeMusic = (CheckBox) findViewById(R.id.btn_brfore_music);mBtnNextMusic = (CheckBox) findViewById(R.id.btn_next_music);mBtnPauseMusic = (CheckBox) findViewById(R.id.btn_pause_music);mSeekBar = (SeekBar) findViewById(R.id.seekbar);mListView = (ListView) findViewById(R.id.listview);mTextViewAllTime = (TextView) findViewById(R.id.textview_all_time);mTextViewCurrentTime = (TextView) findViewById(R.id.textview_current_time);mTextViewMusicName = (TextView) findViewById(R.id.textview_music_name);//        获得所有的歌曲final File music = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);musics = music.listFiles();for (File item:musics){Log.d("歌曲的位置", "→"+item);}
//          添加到listView中final LayoutInflater inflater = getLayoutInflater();MusicAdapter musicAdapter = new MusicAdapter(inflater, musics);mListView.setAdapter(musicAdapter);
//          注册广播myBroad = new MyBroadCastService();IntentFilter filter = new IntentFilter();filter.addAction(MUSIC_TIME);registerReceiver(myBroad, filter);//      设置下一首音乐mBtnNextMusic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                不是最后一首音乐时mPosition才+1if(mPosition!=musics.length-1){mPosition++;}Intent intent = new Intent(getApplicationContext(), MyService.class);
//                将点击位置的音乐路径传到服务中intent.putExtra("musicPath", musics[mPosition].getAbsolutePath());intent.putExtra("musicName", musics[mPosition].getName());intent.putExtra("type", Config.MUSIC_NEXT);startService(intent);}});//        设置上一首音乐mBtnBeforeMusic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                      不是第一首音乐时mPosition才-1if(mPosition!=0){mPosition--;}Intent intent = new Intent(getApplicationContext(), MyService.class);
//                将点击位置的音乐路径传到服务中intent.putExtra("musicPath", musics[mPosition].getAbsolutePath());intent.putExtra("musicName", musics[mPosition].getName());intent.putExtra("type", Config.MUSIC_PREVIOUS);startService(intent);}});//      设置音乐暂停开始mBtnPauseMusic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Intent intent=new Intent(getApplicationContext(),MyService.class);intent.putExtra("flag", flag);intent.putExtra("type", Config.MUSIC_BUTTON_PAUSE);startService(intent);flag=!flag;}});//        打开服务,在服务中打开音乐mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent(getApplicationContext(), MyService.class);
//                将点击位置的音乐路径传到服务中intent.putExtra("musicPath", musics[position].getAbsolutePath());intent.putExtra("musicName", musics[position].getName());intent.putExtra("type",Config.MUSIC_CLICK_START);startService(intent);
//                用于设置下一首上一首音乐mPosition =position;}});//        设置音乐随着seekbar的跳转mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {Intent intent=new Intent(getApplicationContext(),MyService.class);intent.putExtra("type", Config.MUSIC_SEEK);intent.putExtra("progress",seekBar.getProgress());startService(intent);}});}//    动态注册注销广播@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(myBroad);}//    在活动中接受广播以便设置UI参数class MyBroadCastService extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {int type = intent.getIntExtra("type", 0);switch (type) {case 0:int time = intent.getIntExtra("time", 0);mSeekBar.setMax(time);Date date1=new Date(time);SimpleDateFormat format1=new SimpleDateFormat("mm:ss");String s1=format1.format(date1);mTextViewAllTime.setText(s1);String name=intent.getStringExtra("name");mTextViewMusicName.setText(name);break;case 1:int time1 = intent.getIntExtra("time", 0);mSeekBar.setProgress(time1);Date date=new Date(time1);SimpleDateFormat format=new SimpleDateFormat("mm:ss");String s=format.format(date);mTextViewCurrentTime.setText(s);break;}}}
}

适配器

package com.example.laowang.mymediaplayer.adapter;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.example.laowang.mymediaplayer.R;import java.io.File;/*** Created by Administrator on 2015/9/10.*/
public class MusicAdapter extends BaseAdapter {private LayoutInflater mInflater;private File[] musics;public MusicAdapter(LayoutInflater mInflater, File[] musics) {this.mInflater = mInflater;this.musics = musics;}@Overridepublic int getCount() {return musics.length;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder vh=null;if(convertView==null){vh=new ViewHolder();convertView=mInflater.inflate(R.layout.listview_item,null);vh.musicName = (TextView) convertView.findViewById(R.id.textview_music_name);vh.musicAuther = (TextView) convertView.findViewById(R.id.tv_music_auther);vh.img= (ImageView) convertView.findViewById(R.id.img);convertView.setTag(vh);}vh= (ViewHolder) convertView.getTag();
//        设置音乐名称vh.musicName.setText(musics[position].getName());//      获取作家MediaMetadataRetriever mmr=new MediaMetadataRetriever();mmr.setDataSource(musics[position].getAbsolutePath());String auther=mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
//        判断作者是否为空if(auther!=null){vh.musicAuther.setText(auther);}else {vh.musicAuther.setText("<未知>");}//        获得图片byte[] image=mmr.getEmbeddedPicture();if(image!=null){Bitmap bitmap= BitmapFactory.decodeByteArray(image,0,image.length);vh.img.setImageBitmap(bitmap);}else{vh.img.setImageResource(R.mipmap.ic_launcher);}return convertView;}class ViewHolder{TextView musicName;TextView musicAuther;ImageView img;}
}

服务

package com.example.laowang.mymediaplayer;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.support.annotation.Nullable;import com.example.laowang.mymediaplayer.adapter.Config;import java.io.IOException;/*** Created by Administrator on 2015/9/10.*/
public class MyService extends Service {private MediaPlayer mediaPlayer;private boolean flag;private String musicName;@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(final Intent intent, int flags, int startId) {int type = intent.getIntExtra("type", Config.MUSIC_CLICK_START);switch (type) {case Config.MUSIC_CLICK_START:startMusic(intent);break;case Config.MUSIC_SEEK:seekToProgress(intent);break;case Config.MUSIC_BUTTON_PAUSE:pauseMusic(intent);break;case Config.MUSIC_NEXT:startMusic(intent);break;case Config.MUSIC_PREVIOUS:startMusic(intent);break;default:break;}return super.onStartCommand(intent, flags, startId);}private void seekToProgress(Intent intent) {int progress = intent.getIntExtra("progress", 0);
//                歌曲跳转到progress的位置后保持原来状态mediaPlayer.seekTo(progress);}private void pauseMusic(Intent intent) {boolean flag = intent.getBooleanExtra("flag", true);if (!flag) {
//                    此时线程关闭了mediaPlayer.pause();} else {
//                  跳转到暂停后滑动到的位置int keepOn = mediaPlayer.getCurrentPosition();mediaPlayer.seekTo(keepOn);mediaPlayer.start();
//                    再次打开线程MySeekBar seekBar = new MySeekBar();seekBar.start();}}private void startMusic(Intent intent) {String musicPath = intent.getStringExtra("musicPath");musicName= intent.getStringExtra("musicName");
//        防止多个歌曲重复if (mediaPlayer == null) {mediaPlayer = new MediaPlayer();}mediaPlayer.reset();try {mediaPlayer.setDataSource(musicPath);mediaPlayer.prepare();mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();int allTime = mediaPlayer.getDuration();
//                   发送广播将时间参数送过去Intent intent1 = new Intent(MainActivity.MUSIC_TIME);intent1.putExtra("type", 0);intent1.putExtra("time", allTime);intent1.putExtra("name",musicName);sendBroadcast(intent1);
//                    服务中不能进行耗时操作,启动一个线程来传递音乐进度条(耗时操作)MySeekBar seekBar = new MySeekBar();seekBar.start();}});} catch (IOException e) {e.printStackTrace();}}class MySeekBar extends Thread {@Overridepublic void run() {
//            super.run();while (mediaPlayer.isPlaying()) {int now = mediaPlayer.getCurrentPosition();Intent intent1 = new Intent(MainActivity.MUSIC_TIME);intent1.putExtra("type", 1);intent1.putExtra("time", now);sendBroadcast(intent1);try {
//                    休眠一秒Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

存放静态常量的类

package com.example.laowang.mymediaplayer.adapter;/*** Created by Administrator on 2015/9/10.*/
public class Config {public static final int MUSIC_CLICK_START =1;public static final int MUSIC_SEEK=0;public static final int MUSIC_BUTTON_PAUSE =2;public static final int MUSIC_BUTTON_START=3;public static final int MUSIC_NEXT=5;public static final int MUSIC_PREVIOUS =4;}

AndroidMainFest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.laowang.mymediaplayer" >
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".MyService"/></application></manifest>

0910Android音乐播放器相关推荐

  1. 单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器

    http://www.amobbs.com/thread-4503884-1-1.html 这个小玩意,采用 ATMEL 的传统51MCU作主控制芯片,加上SD卡和显示屏,就可以作简单的音乐播放器了, ...

  2. android手机播放pc音乐播放器,最强手机音乐播放器?Foobar2K安卓版体验

    说到最强大的PC音乐播放器,相信很多朋友,特别是HiFi发烧友,会把选票投给Foobar2000.的确,在PC平台上,Foobar2000的优势非常巨大.例如它能够自由定制界面,虽然原生界面很简陋,但 ...

  3. android 系统锁屏音乐播放器,Android实现音乐播放器锁屏页

    本文实例为大家分享了Android音乐播放器锁屏页的具体代码,供大家参考,具体内容如下 首页我们先看一下效果图 下边来说一下实现逻辑,其主要思路就是新建一个activity使其覆盖在锁屏页上边. 一. ...

  4. 从零开始撸音乐播放器(源码可下载)

    演示视频 哈哈,自己是真的弱.被生活狠狠打脸了. Java课设要搞音乐播放器.然而老师只讲了输入输出啥的,其他自学. 从零开始撸代码. 1 .从sound,到AppletPlayer又到Player. ...

  5. 编写音乐播放器的一些感想

    编写音乐播放器的一些感想 当初是想着学习C#,就动手开始实现一个简单的播放器.在实现的工程中发现自己能够学到很多东西,就有了把播放器用c++重写的想法,在实现过程中,发现c++想实现c#同样的功能,真 ...

  6. Linux开发板怎么用madplay,Linux中madplay 音乐播放器移植步骤

    madplay 音乐播放器移植步骤 madplay版本: madplay-0.15.2 交叉编译器版本: arm-linux-gcc 3.4.1 操作系统平台: Linux -- Red Hat 9. ...

  7. 小型音乐播放器插件APlayer.js的简单使用例子

      本篇博客将会给出一个小型音乐播放器插件APlayer.js的使用例子.关于APlayer.js的具体介绍和Github地址,可以参考: https://github.com/MoePlayer/. ...

  8. Mac无损音乐播放器Audirvana plus

    Audirvana plus for Mac(点击进入)一款适用于Mac系统的无损音乐播放器,有别于MP3的有损压缩编码,它不会破坏任何原有的音讯资讯,可以完整地还原音乐CD的音质.除此以外,Audi ...

  9. js插件---10个免费开源的JS音乐播放器插件

    js插件---10个免费开源的JS音乐播放器插件 一.总结 一句话总结:各种插件都有很多,多去找. 二.js插件---10个免费开源的JS音乐播放器插件 亲测可用 音乐播放器在网页设计中有时候会用到, ...

最新文章

  1. 用es6 (proxy 和 reflect)轻松实现 观察者模式
  2. 几张表格怎么联动_猛男必备具皮肤:和平精英火箭少女联动火爆来袭,这摩托皮不香?...
  3. 数据库索引为什么使用B+树?
  4. php isapi mysql_windows server 2003以isapi的方式配置php+mysql环境的详细过程
  5. Android Setting 日期相关API,自定义DatePicker
  6. drools 7.x 模板的简单使用
  7. 3GPP规范命名规则解读
  8. bzoj5392 [Lydsy1806月赛]路径统计
  9. CANoe软件打不开了怎么办?
  10. 什么是广域网WAN?学WAN,看这篇文章就够了
  11. OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?
  12. 【答读者问5】如何实现以当天收盘价交易?
  13. 关于笔记本连接显示器检测不到的问题(NoVideoInput)
  14. Delphi XE E2064 Left side cannot be assigned to 错误解决方法
  15. ASP.NET MVC-4种过滤器
  16. 易基因 | 文献速递:RRBS方法绘制1538例乳腺癌甲基化图谱并预测癌症发生/预后
  17. Packstack搭建Openstack R版本
  18. 关于virgo插件的初学体验
  19. 计算机上没有足够的硬盘空间,磁盘分区时显示“磁盘上没有足够的空间”解决方法...
  20. Filter-Policy简述

热门文章

  1. b85主板装服务器系统,B85主板+奔腾G3258完美安装Win10的方法!
  2. 严格对角化(Exact diagonalization)介绍
  3. 600多种Excel财务类表格模板
  4. 毕业设计 - 基于JSP的超市积分管理系统【源码 + 论文】
  5. ValueError问题的解决
  6. mysql用sql语句将表中学生_用sql语句创建学生表如何做
  7. 【mysql数据库开放授权】
  8. 谷歌新作Imagic:扩散模型只用文字就能PS照片了!网友:效果太震撼...
  9. 五款用了就爱不释手的Mac高效软件
  10. 38、静默活体检测测试及ncnn、mnn部署