安卓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

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St