Android利用Service实现简易音乐播放器
16lz
2021-01-23
话不多说,上代码
MainActivity.java
public class MainActivity extends AppCompatActivity implements ServiceConnection { private static final String TAG = "MainActivity"; ImageView img_play; boolean isPlaying; MusicService musicService; ListView listView; List mediaBeanList; BaseAdapter mAdapter; String[] needPermissons=new String[]{ "android.permission.READ_EXTERNAL_STORAGE" }; int mCuurentItem=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService(new Intent(this,MusicService.class),this, Context.BIND_AUTO_CREATE);//绑定Service img_play=findViewById(R.id.media_paly); img_play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { musicService.playMusic(mediaBeanList.get(mCuurentItem).path); } }); mediaBeanList=new ArrayList<>(); listView=findViewById(R.id.listview); mAdapter=new BaseAdapter() { @Override public int getCount() { return mediaBeanList.size(); } @Override public Object getItem(int i) { return mediaBeanList.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { TextView textview; if(view==null){ textview=new TextView(MainActivity.this); } else { textview=(TextView) view; } if(mCuurentItem==i){ textview.setBackgroundColor(Color.YELLOW); }else { textview.setBackgroundColor(Color.WHITE); } textview.setText(mediaBeanList.get(i).display_name); return textview; } }; listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { mCuurentItem=i; mAdapter.notifyDataSetChanged(); } }); listView.setAdapter(mAdapter); initData(); } public void initData(){ checkPermisson(); getAllMediaList(MediaStore.Audio.Media.DISPLAY_NAME+" like '%mp3'"); //Log.d(TAG,mediaBeanList.size()+""); } public void getAllMediaList( String selection) { Cursor cursor = null; try { cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.SIZE}, selection, null, MediaStore.Audio.Media.DATE_ADDED + " DESC"); if(cursor == null) { Log.d(TAG, "The getMediaList cursor is null."); return ; } int count= cursor.getCount(); if(count <= 0) { Log.d(TAG, "The getMediaList cursor count is 0."); return ; } MediaBean mediaEntity = null;//String[] columns = cursor.getColumnNames(); while (cursor.moveToNext()) { mediaEntity = new MediaBean(); mediaEntity.id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); mediaEntity.title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); mediaEntity.display_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); mediaEntity.duration = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); mediaEntity.size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)); mediaEntity.artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); mediaEntity.path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); mediaBeanList.add(mediaEntity); } } catch (Exception e) { e.printStackTrace(); } finally { if(cursor != null) { cursor.close(); } mAdapter.notifyDataSetChanged(); } } public void checkPermisson() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { //检查权限 List mRequestPermission=new ArrayList<>(); for (String one : needPermissons) { if (PackageManager.PERMISSION_GRANTED != this.checkPermission(one, Process.myPid(), Process.myUid())) { mRequestPermission.add(one); } } //申请 if (!mRequestPermission.isEmpty()) { this.requestPermissions(mRequestPermission.toArray(new String[mRequestPermission.size()]), 0x99); return; } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 0x99) { boolean allGrant=true; for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { allGrant=false; } } if(allGrant){ getAllMediaList(null); } } } @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { MusicService.MyBinder myBinder=(MusicService.MyBinder)iBinder; musicService=myBinder.getService(); if(mediaBeanList.size()>0) { musicService.playMusic(mediaBeanList.get(mCuurentItem).path); } Toast.makeText(this, "ssssss", Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName componentName) { }}
MusicService.java
public class MusicService extends Service { MusicListener musicListener; MediaPlayer mediaPlayer; boolean isPlaying=false; @Override public IBinder onBind(Intent intent) { mediaPlayer=new MediaPlayer(); return getBinder(); } public IBinder getBinder(){ return new MyBinder(); } public class MyBinder extends Binder { public MusicService getService(){ return MusicService.this; } } public void setMusicListener(MusicListener musicListener) { this.musicListener = musicListener; } public void playMusic(String path){ try { if(isPlaying==true){ mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer=new MediaPlayer(); } mediaPlayer.setDataSource(path); mediaPlayer.prepare(); mediaPlayer.start(); isPlaying=true; } catch (IOException e) { e.printStackTrace(); } } public interface MusicListener{ void onProgress(); void onNext(); }}
MediaBean.java
public class MediaBean { public int id; //id标识 public String title; // 显示名称 public String display_name; // 文件名称 public String path; // 音乐文件的路径 public int duration; // 媒体播放总时间 public String albums; // 专辑 public String artist; // 艺术家 public String singer; //歌手 public long size;}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
更多相关文章
- Android Service总结04 之被绑定的服务 -- Bound Service
- android将线程绑定在指定CPU
- 基于Android DataBinding的InverseBindingMethod改进SeekBar双向
- Android应用程序绑定服务(bindService)的过程
- Android中的数据绑定框架DataBinding(对比AngularJS双向数据绑定
- 使用Android BindingAdapter与InverseBindingAdapter实现SeekBar
- android源码下载并绑定到Eclipse中
- 认识Android中的双向绑定