博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xamarin.Android开发音乐播放器
阅读量:4653 次
发布时间:2019-06-09

本文共 6311 字,大约阅读时间需要 21 分钟。

最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多windows下的方法都可以用,做一个安卓音乐播放器,主要实现音乐播放,上一曲下一曲,音乐播放列表,随机播放,扫描SD卡内所有音乐。

先show一组界面啊,话说有图有真相啊:

              

项目结构如图:

Lrc是歌词处理方法

MusicService是安卓服务播放音乐,服务Broadcast,以及界面接收Receiver

SqlHelper是歌曲扫描后寸本地数据库Sqlite的一些方法

说说几个难点:

音乐扫描:

主要就是遍历目录,代码如下

IList
visibleThings = new List
(); var dir = new DirectoryInfo (directory); try { foreach (var item in dir.GetFileSystemInfos().Where(item => item.IsVisible())) { visibleThings.Add (item); if (item.IsDirectory ()) { RefreshFilesList (item.FullName); } if (item.IsFile () && (item.FullName.Substring (item.FullName.LastIndexOf (".") + 1)) == "mp3") { //是音乐文件 }

  ListView添加数据,这个主要用到ListAdapter,ListAdapter是新建一个前台xaml界面,每个界面存放一首歌曲,然后最后把遍历所有歌曲加入N个界面,这N个界面加入ListView,

  后台代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Android.App;using Android.Content;using Android.OS;using Android.Runtime;using Android.Views;using Android.Widget;using Android.Util;namespace MusicPlayer{	public class SongListAdapter: BaseAdapter
{ List
items; Activity context; public SongListAdapter (Activity context, List
items) : base() { this.context = context; this.items = items; } public override long GetItemId(int position) { return position; } public override SongDetail this[int position] { get { return items[position]; } } public override int Count { get { return items.Count; } } public override View GetView(int position, View convertView, ViewGroup parent) { var item = items[position]; View view = convertView; if (view == null) view = context.LayoutInflater.Inflate(Resource.Layout.SongItem, null); view.FindViewById
(Resource.Id.songid).Text = item.ID.ToString(); view.FindViewById
(Resource.Id.songtitle).Text = item.Title; view.FindViewById
(Resource.Id.songurl).Text=(item.Path); return view; } } }

  listView加入方式:

Lv = FindViewById
(Resource.Id.listView1); Lv.Adapter = new SongListAdapter (this, SonList);

  其中sonlist是遍历除了所有歌曲List集合

至于安卓服务,主要就是继承Service,主要代码:

[Service]    public class MainService : Service    {        public override void OnCreate()        {            base.OnCreate();            Log.Debug("xamarin", "创建服务");        }        public override StartCommandResult OnStartCommand(Android.Content.Intent intent, StartCommandFlags flags, int startId)        {            Log.Debug("xamarin", "启动服务");            return StartCommandResult.Sticky;        }        public override void OnDestroy()        {            base.OnDestroy();            Log.Debug("xamarin", "关闭服务");        }        public override Android.OS.IBinder OnBind(Android.Content.Intent intent)        {            return null;        }}

  最后歌词显示,主要用到就是解析歌词,解析歌词C#下面有代码可参考,不知道具体怎么解析的搜搜winform做音乐播放器歌词是怎么做的,其实就是一个播放但钱position和播放时间转换成position的一个匹配,下面看解析歌词的方法:

public class Lrc    {        ///         /// 歌曲        ///         public string Title { get; set; }        ///         /// 艺术家        ///         public string Artist { get; set; }        ///         /// 专辑        ///         public string Album { get; set; }        ///         /// 歌词作者        ///         public string LrcBy { get; set; }        ///         /// 偏移量        ///         public string Offset { get; set; }        ///         /// 歌词        ///         public Dictionary
LrcWord = new Dictionary
(); ///
/// 获得歌词信息 /// ///
歌词路径 ///
返回歌词信息(Lrc实例)
public static Lrc InitLrc(string LrcPath) { Lrc lrc = new Lrc(); using (FileStream fs = new FileStream(LrcPath, FileMode.Open, FileAccess.Read, FileShare.Read)) { string line; using (StreamReader sr = new StreamReader(fs, Encoding.Default)) { while ((line = sr.ReadLine()) != null) { if (line.StartsWith("[ti:")) { lrc.Title = SplitInfo(line); } else if (line.StartsWith("[ar:")) { lrc.Artist = SplitInfo(line); } else if (line.StartsWith("[al:")) { lrc.Album = SplitInfo(line); } else if (line.StartsWith("[by:")) { lrc.LrcBy = SplitInfo(line); } else if (line.StartsWith("[offset:")) { lrc.Offset = SplitInfo(line); } else { Regex regex = new Regex(@"\[([0-9.:]*)\]+(.*)", RegexOptions.Compiled); MatchCollection mc = regex.Matches(line); double time = TimeSpan.Parse("00:" + mc[0].Groups[1].Value).TotalSeconds; string word = mc[0].Groups[2].Value; lrc.LrcWord.Add(time, word); } } } } return lrc; } ///
/// 处理信息(私有方法) /// ///
///
返回基础信息
static string SplitInfo(string line) { return line.Substring(line.IndexOf(":") + 1).TrimEnd(']'); } } 一行代码:Lrc lrc= Lrc.InitLrc("test.lrc");

  差不多就这样,最后还有一个菜单创建

public override bool OnCreateOptionsMenu(IMenu menu)		{			var m1 = menu.Add(0, 1, 0, "歌曲列表");			var m2 = menu.Add (0,2,0,"退出");			return base.OnCreateOptionsMenu(menu);		}		public override bool OnOptionsItemSelected(IMenuItem item)		{			switch (item.ItemId)			{			case 1:								break;			case 2:								break;			}			return base.OnOptionsItemSelected(item);		}

  好啦,差不多就是这些,至于音乐播放都是用Mediaplaye系统提供Api搞定

 

转载于:https://www.cnblogs.com/bktmkd/p/4148927.html

你可能感兴趣的文章
DirectX中的纹理及其创建
查看>>
20145322第九周JAVA程序设计基础学习总结
查看>>
洛谷-小鱼的数字游戏-数组
查看>>
面向对象(OOP)基本概念
查看>>
PHP扩展编写示例
查看>>
SpringMVC(一) 简单代码编写,注解,重定向与转发
查看>>
DT大数据梦工厂 第59,60,61讲
查看>>
02 变量和语句
查看>>
(C#) 多线程访问探讨,如果保证线程安全?
查看>>
NOIP2013火柴排队[逆序对]
查看>>
DataPipeline的增量数据支持回滚功能
查看>>
工厂模式之简单工厂案例
查看>>
SAP技术工作
查看>>
Java: Difference between ArrayList and LinkedList
查看>>
LeetCode Delete Operation for Two Strings
查看>>
[SDOI2014]重建
查看>>
[AH2017/HNOI2017]礼物
查看>>
gated pixelCNN。
查看>>
[题解]CQOI2012 T1 编号 number
查看>>
centos 6.5 mysql 5.7.11安装流程
查看>>