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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三