安卓java音乐播放器下一曲_Xamarin.Android开发音乐播放器

2023-10-31 03:59

本文主要是介绍安卓java音乐播放器下一曲_Xamarin.Android开发音乐播放器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

20180919231133011760.jpg

20180919231133521493.jpg

20180919231133921858.png

20180919231134222620.jpg

项目结构如图:

20180919231134622009.png

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,

android:id="@+id/linearLayout1"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

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" />

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" />

android:id="@+id/songurl"

android:layout_width="wrap_content"

android:layout_height="0dip"

android:visibility="invisible" />

后台代码:

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搞定

这篇关于安卓java音乐播放器下一曲_Xamarin.Android开发音乐播放器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312657

相关文章

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Spring MVC跨域问题及解决

《SpringMVC跨域问题及解决》:本文主要介绍SpringMVC跨域问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录跨域问题不同的域同源策略解决方法1.CORS2.jsONP3.局部解决方案4.全局解决方法总结跨域问题不同的域协议、域名、端口

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

SpringBoot操作MaxComputer方式(保姆级教程)

《SpringBoot操作MaxComputer方式(保姆级教程)》:本文主要介绍SpringBoot操作MaxComputer方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录引言uqNqjoe一、引入依赖二、配置文件 application.properties(信息用自己

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使