热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[原创]新手作品简单版音乐播放器

为了完成别人交给的小任务,作为一个新手看了很多的视频教程,实在是难死宝宝了,好在终于找到一篇合适我的布局的关于音乐播放器布局的文章

为了完成别人交给的小任务,作为一个新手看了很多的视频教程,实在是难死宝宝了,好在终于找到一篇合适我的布局的关于音乐播放器布局的文章,所以用了两天,就照猫画虎的学了下来,为了完全适配我的布局文件,删删减减,查了很多资料....才算是搞出个基本样子,废话不多说,直接上代码和效果图,新人作品,不喜勿喷。

功能很简单:

1.扫描sd卡内的音乐文件,将扫描到的音乐文件加载到音乐列表中。

2.点击音乐列表,实现播放音乐的功能

3.点击播放控制按钮(播放/暂停 上/下一曲)实现相关功能

 

首先是三个Java文件

package com.example.yangmusicplayer;import com.example.yangmusicplayer.MusicAdapter;import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;public class MainActivity extends Activity implements OnItemClickListener, OnClickListener {private ImageButton playmusic,lastmusic,nextmusic;public MusicAdapter mAdapter;private ListView mListView;public static int mIndex = 0;public static MediaPlayer myMediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.listview);playmusic=(ImageButton) findViewById(R.id.playorpause);nextmusic=(ImageButton) findViewById(R.id.next);lastmusic=(ImageButton) findViewById(R.id.last);mAdapter = new MusicAdapter(this);mListView.setAdapter(mAdapter);mListView.setOnItemClickListener(this);playmusic.setOnClickListener(this);nextmusic.setOnClickListener(this);lastmusic.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.playorpause:playMusic();// 播放歌曲、暂停歌曲break;case R.id.next:playNextMusic();// 播放下一首歌曲break;case R.id.last:playlastMusic();// 播放下一首歌曲break;default:break;}}private void playlastMusic() {if (mIndex == mAdapter.musicList.size() - 1) {initMp3Source(initMusicUri(0));} else {initMp3Source(initMusicUri(--mIndex));}playMusic();}private void playNextMusic() {if (mIndex == mAdapter.musicList.size() - 1) {initMp3Source(initMusicUri(0));} else {initMp3Source(initMusicUri(++mIndex));}playMusic();}private void playMusic() {if (myMediaPlayer != null) {if (myMediaPlayer.isPlaying()) {playmusic.setImageResource(R.drawable.play);myMediaPlayer.pause();} else {getMusciInfo();playmusic.setImageResource(R.drawable.pause);myMediaPlayer.start();}} else {initMp3Source(initMusicUri(0));playmusic.setImageResource(R.drawable.pause);myMediaPlayer.start();}}private String initMusicUri(int _id) {mIndex = _id;getMusciInfo();return mAdapter.musicList.get(mIndex).getMusicPath();}private void getMusciInfo() {String songName = mAdapter.musicList.get(mIndex).getMusicName();// 歌曲名称String songSinger = mAdapter.musicList.get(mIndex).getMusicSinger();// 歌手名称
}@Overridepublic void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {mIndex = arg2;String path = mAdapter.musicList.get(arg2).getMusicPath(); // 获得歌曲地址
getMusciInfo();initMp3Source(path);playMusic();}private void initMp3Source(String path) {Uri mp3Uri = Uri.parse(path);if (myMediaPlayer != null) {myMediaPlayer.stop();myMediaPlayer.reset();myMediaPlayer = null;}myMediaPlayer = MediaPlayer.create(this, mp3Uri);myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {playNextMusic();}});}
}

MainActivity

 

package com.example.yangmusicplayer;import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;public class MusicAdapter extends BaseAdapter {// 用来获得ContentProvider(共享数据库)public ContentResolver cr;// 用来装查询到的音乐文件数据public Cursor cur;// 歌曲信息列表public List musicList;public Context context;public MusicAdapter(Context context) {this.context = context;// 取得数据库对象cr = context.getContentResolver();musicList = new ArrayList();String[] mString = new String[] { MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.SIZE,MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.DATA };// 查询所有音乐信息cur = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mString,null, null, null);if (cur != null) {// 移动游标到第一个
cur.moveToFirst();int j &#61; 1;for (int i &#61; 0; i ) {if (cur.getString(0).endsWith(".mp3")) {// 过滤获取MP3文件MusicInfo mInfo &#61; new MusicInfo();String musicName &#61; cur.getString(0).substring(0,cur.getString(0).lastIndexOf(".mp3"));mInfo.setMusicIndex(j&#43;&#43;);mInfo.setMusicName(musicName);mInfo.setMusicAlubm(cur.getString(1));mInfo.setMusicSinger(cur.getString(2));mInfo.setMusicTime(cur.getInt(3));mInfo.setMusicSize(cur.getInt(4));mInfo.setMusicId(cur.getInt(5));mInfo.setMusicPath(cur.getString(6));musicList.add(mInfo);}cur.moveToNext();}}}&#64;Overridepublic int getCount() {return musicList.size();}&#64;Overridepublic Object getItem(int arg0) {return musicList.get(arg0);}&#64;Overridepublic long getItemId(int arg0) {return arg0;}&#64;Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {LayoutInflater mlistLayout &#61; LayoutInflater.from(context);View mlistView &#61; mlistLayout.inflate(R.layout.musiclist, null);TextView songName &#61; (TextView) mlistView.findViewById(R.id.listName);TextView singerName &#61; (TextView) mlistView.findViewById(R.id.list_Singer);ImageView songImage &#61; (ImageView) mlistView.findViewById(R.id.listImage);int mid &#61; musicList.get(arg0).getMusicIndex();String musicName &#61; musicList.get(arg0).getMusicName();String musciSinger &#61; musicList.get(arg0).getMusicSinger();if (musciSinger.contains("")) {musciSinger &#61; "<未知>";}Bitmap img &#61; getAlbumArt(musicList.get(arg0).getMusicId());songName.setText(mid &#43; ". " &#43; musicName);singerName.setText(musciSinger);songImage.setImageBitmap(img);return mlistView;}/*** 歌曲专辑图片显示,如果有歌曲图片&#xff0c;才会返回&#xff0c;否则为返回默认的图片* * &#64;param albumId* 专辑地址* &#64;return 返回类型Bitmap*/public Bitmap getAlbumArt(int albumId) {// albumId是音乐专辑的idBitmap bitmap &#61; null;Uri sArtworkUri &#61; Uri.parse("content://media/external/audio/albumart");Uri albumArtUri &#61; ContentUris.withAppendedId(sArtworkUri, albumId);try {bitmap &#61; MediaStore.Images.Media.getBitmap(context.getContentResolver(), albumArtUri);bitmap &#61; Bitmap.createScaledBitmap(bitmap, 30, 30, true);} catch (FileNotFoundException exception) {exception.printStackTrace();bitmap &#61; BitmapFactory.decodeResource(context.getResources(),R.drawable.album);} catch (IOException e) {e.printStackTrace();}return bitmap;}
}

MusicAdapter

 

package com.example.yangmusicplayer;/*** &#64;author YFoliage 歌曲信息类*/
public class MusicInfo {private int musicIndex; //排序号private int musicAlubmId;//专辑IDprivate String musicName;// 歌曲名private String musicSinger;// 歌手名private int musicTime;// 歌曲时间长度private String musicAlubm;// 专辑名称private int musicSize;// 曲歌大小private String musicPath;// 歌曲路径public int getMusicIndex() {return musicIndex;}public void setMusicIndex(int musicIndex) {this.musicIndex &#61; musicIndex;}public int getMusicId() {return musicAlubmId;}public void setMusicId(int musicAlubmId) {this.musicAlubmId &#61; musicAlubmId;}public String getMusicName() {return musicName;}public void setMusicName(String musicName) {this.musicName &#61; musicName;}public String getMusicSinger() {return musicSinger;}public void setMusicSinger(String musicSinger) {this.musicSinger &#61; musicSinger;}public int getMusicTime() {return musicTime;}public void setMusicTime(int musicTime) {this.musicTime &#61; musicTime;}public String getMusicAlubm() {return musicAlubm;}public void setMusicAlubm(String musicAlubm) {this.musicAlubm &#61; musicAlubm;}public int getMusicSize() {return musicSize;}public void setMusicSize(int musicSize) {this.musicSize &#61; musicSize;}public String getMusicPath() {return musicPath;}public void setMusicPath(String musicPath) {this.musicPath &#61; musicPath;}}

MusicInfo


然后是两个.xml文件

xmlns:tools&#61;"http://schemas.android.com/tools"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"android:background&#61;"&#64;drawable/a4"tools:context&#61;"com.example.yang" ><ImageButton android:id&#61;"&#64;&#43;id/playorpause"android:layout_width&#61;"55dp"android:layout_height&#61;"55dp"android:layout_alignParentBottom&#61;"true"android:layout_centerHorizontal&#61;"true"android:layout_marginBottom&#61;"20dp"android:src&#61;"&#64;drawable/play"/><ImageButton android:id&#61;"&#64;&#43;id/next"android:layout_width&#61;"55dp"android:layout_height&#61;"55dp"android:layout_alignParentBottom&#61;"true"android:layout_alignParentRight&#61;"true"android:layout_marginRight&#61;"60dp"android:layout_marginBottom&#61;"20dp"android:src&#61;"&#64;drawable/next"/><ImageButton android:id&#61;"&#64;&#43;id/last"android:layout_width&#61;"55dp"android:layout_height&#61;"55dp"android:layout_alignParentBottom&#61;"true"android:layout_alignParentLeft&#61;"true"android:layout_marginLeft&#61;"60dp"android:layout_marginBottom&#61;"20dp"android:src&#61;"&#64;drawable/last"/><TextViewandroid:id&#61;"&#64;&#43;id/tv1"android:layout_width&#61;"400dp"android:layout_height&#61;"60dp"android:layout_alignParentTop&#61;"true"android:layout_centerHorizontal&#61;"true"android:textSize&#61;"50px" android:textColor&#61;"#FFFF99"android:gravity&#61;"center"android:text&#61;"我的音乐"><ListViewandroid:id&#61;"&#64;&#43;id/listview"android:layout_width&#61;"wrap_content"android:layout_height&#61;"30dp"android:layout_above&#61;"&#64;&#43;id/playorpause"android:layout_alignParentLeft&#61;"true"android:layout_below&#61;"&#64;&#43;id/tv1"android:divider&#61;"#FFFFFF"android:dividerHeight&#61;"4px" >

activity_main


android:layout_width&#61;"match_parent"android:layout_height&#61;"wrap_content"android:orientation&#61;"horizontal" ><LinearLayoutandroid:layout_width&#61;"50sp"android:layout_height&#61;"50sp"android:orientation&#61;"vertical" android:gravity&#61;"center" ><ImageViewandroid:id&#61;"&#64;&#43;id/listImage"android:layout_width&#61;"40sp"android:layout_height&#61;"40sp" /><LinearLayoutandroid:layout_width&#61;"match_parent"android:layout_height&#61;"50sp"android:orientation&#61;"vertical" ><TextViewandroid:id&#61;"&#64;&#43;id/listName"android:layout_width&#61;"fill_parent"android:layout_height&#61;"match_parent"android:layout_weight&#61;"1"android:gravity&#61;"center_vertical"android:paddingLeft&#61;"10dp"android:singleLine&#61;"true"android:textSize&#61;"16sp" /><TextViewandroid:id&#61;"&#64;&#43;id/list_Singer"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent"android:layout_weight&#61;"1"android:gravity&#61;"center_vertical"android:paddingLeft&#61;"10dp"android:singleLine&#61;"true"android:textSize&#61;"13sp" />

musiclist

展示下效果图&#xff1a;

 

转:https://www.cnblogs.com/ILoke-Yang/p/4907750.html



推荐阅读
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • 本文介绍了如何使用Java代码在Android设备上检测特定应用程序是否已安装。通过创建一个Intent并利用PackageManager查询该Intent的可用性来实现这一功能。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 探讨了一个关于使用多线程实现从0累加至1000的面试题,分析了在不同线程数量下结果出现偏差的原因,并提供了修正方案。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 本文介绍了如何在iOS应用中自定义导航栏按钮,包括使用普通按钮和图片生成导航条专用按钮的方法。同时,探讨了在不同版本的iOS系统中实现多按钮布局的技术方案。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文提供了多种方法来计算给定年份和月份的起始日和结束日,并进一步探讨了如何根据年、月、周获取特定周的起始日和结束日。 ... [详细]
  • 本文详细记录了一位具有五年半开发经验的候选人,在华为Android高级开发职位面试过程中的经历。从早晨9点到下午5点半,经过了群体面试、技术面试、综合面试及英语面试等多个环节,最终成功通过考核。文章不仅分享了面试心得,还提供了宝贵的面试题资源。 ... [详细]
  • iOS 开发技巧:TabBarController 自定义与本地通知设置
    本文介绍了如何在 iOS 中自定义 TabBarController 的背景颜色和选中项的颜色,以及如何使用本地通知设置应用程序图标上的提醒个数。通过这些技巧,可以提升应用的用户体验。 ... [详细]
author-avatar
阿贵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有