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

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操