Xamarin.Android开发音乐播放器

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

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

项目结构如图:

Lrc是歌词处理方法

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

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

说说几个难点:

音乐扫描:

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

			IList<FileSystemInfo> visibleThings = new List<FileSystemInfo> ();
			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,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/songid"
        android:layout_width="wrap_content"
        android:layout_height="0dip"
        android:textColor="#FF7F3300"
        android:textSize="0dip"
        android:textStyle="italic"
        android:visibility="invisible" />
    <TextView
        android:id="@+id/songtitle"
        android:layout_width="wrap_content"
        android:layout_height="50dip"
        android:textSize="20dip"
        android:textColor="#FFFFFF"
        android:paddingLeft="5dip"
        android:gravity="center_vertical|left" />
    <TextView
        android:id="@+id/songurl"
        android:layout_width="wrap_content"
        android:layout_height="0dip"
        android:visibility="invisible" />
</LinearLayout>

  后台代码:

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<SongDetail>
	{   List<SongDetail> items;

		Activity context;
		public SongListAdapter (Activity context, List<SongDetail> 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<TextView>(Resource.Id.songid).Text = item.ID.ToString();
			view.FindViewById<TextView>(Resource.Id.songtitle).Text = item.Title;
			view.FindViewById<TextView>(Resource.Id.songurl).Text=(item.Path);

			return view;
		}

	}
}

  listView加入方式:

Lv = FindViewById<ListView> (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
    {
        /// <summary>
        /// 歌曲
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 艺术家
        /// </summary>
        public string Artist { get; set; }
        /// <summary>
        /// 专辑
        /// </summary>
        public string Album { get; set; }
        /// <summary>
        /// 歌词作者
        /// </summary>
        public string LrcBy { get; set; }
        /// <summary>
        /// 偏移量
        /// </summary>
        public string Offset { get; set; }

        /// <summary>
        /// 歌词
        /// </summary>
        public Dictionary<double, string> LrcWord = new Dictionary<double, string>();

        /// <summary>
        /// 获得歌词信息
        /// </summary>
        /// <param name="LrcPath">歌词路径</param>
        /// <returns>返回歌词信息(Lrc实例)</returns>
        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;
        }

        /// <summary>
        /// 处理信息(私有方法)
        /// </summary>
        /// <param name="line"></param>
        /// <returns>返回基础信息</returns>
        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搞定

时间: 2024-10-03 14:28:41

Xamarin.Android开发音乐播放器的相关文章

Android实现音乐播放器(一)

Graphical User Interface 本篇文章记录了我实现Android简单音乐播放器的过程,(一)中介绍了怎么构建音乐播放器的前端页面.首先大家看一下,界面最后是这样的(界面有点粗陋) 音乐文件列表是从SD卡中读取出来的. 首先我们先在Layout里面创建Music Player的GUI,diagram如下图所示: 根据diagram我们在activity_main.xml写出如下代码: <LinearLayout xmlns:android="http://schemas.

[Android应用]音乐播放器

Service是一个不可见的进程在后台执行. Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,例如我们打开一个音乐播放器来听音乐,在听音乐的同时也想做下其它的事情,比如上网聊Q.或者上网浏览新闻之类的事情.这样的话,我们就需要用到Service服务了.下面我们以一个简单的音乐播放器的实例来说明下Service的生命周期和Service的使用. 下面是音乐播放器Demo的程

android调用音乐播放器,三种方

小弟想请问一下,如何在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了,主要是有两种方法,但是都不是我想要的. 第一种是,使用mp3音乐文件的uri,和intent,进行调用,但是这种是针对某一首歌曲的播放使用的. /** * 播放指定名称的歌曲 * @param audioPath 指定默认播放的音乐 */ public static void playAudio(String audioPath){ Intent mIntent = new Intent(); mIntent

Android开发之startService和onBinderService混合开发音乐播放器

一.首先你需要知道MediaPlayer这个类的一些方法: int getDuration():获取流媒体的总播放时长,单位是毫秒. int getCurrentPosition():获取当前流媒体的播放的位置,单位是毫秒. void seekTo(int msec):设置当前MediaPlayer的播放位置,单位是毫秒. void setLooping(boolean looping):设置是否循环播放. boolean isLooping():判断是否循环播放. boolean  isPla

Android——简单音乐播放器

使用MediaPlayer做的简单音乐播放器,更多内容请到百度经验查看   http://jingyan.baidu.com/article/60ccbceb63452364cab197f1.html <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:l

android版音乐播放器----卡拉OK歌词实现(二)

相信大家都看过酷狗的音乐播放器,特别是酷狗的滚动歌词实现起来,效果特别好.我自己也尝试看了一下酷狗的歌词文件,发现是加密的,根本就看不了,所以只能是从目前开源的歌词文件出发了.我自己选择的是ksc歌词文件. 要实现歌词的功能,那首先就是要先认识一下ksc歌词的文件与普通的lrc歌词有那方面的区别? 当然,这里我从网上找了一个文档,看了文档里面的介绍,大家大概就会明白两都的区别. http://wenku.baidu.com/link?url=Ga4ESBrytlx3qUoxX5ApHbFIZro

独立开发音乐播放器

第一先整体布置好ui布局   开始动手:  先找好素材, 修改了mainActivity  去掉title 去掉title 方法之前已近写过了就不多说了! 定义main.xml 进入应用程序的布局 搞了一整天  主要是素材难搞 main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk

Android 简易音乐播放器

效果图: 1.获取本地音乐 2.播放音乐 MediaPlayer 音乐播放类 MediaPlayer其实是一个封装的很好的音频.视频流媒体操作类,如果查看其源码,会发现其内部是调用的native方法,所以它其实是有C++实现的. 既然是一个流媒体操作类,那么必然涉及到,播放.暂停.停止等操作,实际上MediaPlayer也为我们提供了相应的方法来直接操作流媒体. void statr():开始或恢复播放. void stop():停止播放. void pause():暂停播放. 通过上面三个方法

android 在音乐播放器中设置一首歌曲为来电铃声,设置不起作用

AudioProfile,情景模式,多卡设置铃声 系统开启Multi_ringtone_support.进入菜单--音乐--歌曲列表--长按一首歌曲选择设为手机铃声,提示已成功设置,但是进入设置中情景模式查看,仍然是默认铃声.打电话后铃声还为默认铃声. 修改: AudioProfileService.java mRingtoneObserver = new ContentObserver(new Handler())函数里面的 case GENERAL: case OUTDOOR: if (mE