清明节太冷了不想出去,正好试一试 Xamarin.Android 的生产力如何。实现了在线播放PC上的音乐,在此做个记录。
开发工具:Visual Studio 2017
首先,安装必须的插件
安装完成后新建Android项目
先不做任何修改,直接启动调试,没有报错,成功启动
说明环境配置没问题,下面正式开工
采用Socket实现Android设备和PC的通信。整个流程如下:
1、在PC上运行服务端,监听本地端口,作为服务器。Android设备通过IP地址和端口连接到服务器。
2、Android程序向服务器请求音乐文件列表
3、服务器返回音乐文件列表
4、Android程序向服务器请求播放音乐
5、服务器返回音乐文件字节流
6、Android程序播放字节流
通信协议实现2、3、4、5即可,由SOCKETPACKAGE实现需要的协议,将该结构体转为byte[]数组写入到Socket实现通信
public struct SOCKETPACKAGE
{
public SOCKETHEADER Header;//包头,16字节
public SOCKETBODY Body;//包身,1000字节
public SOCKETTAIL Tail;//包尾,8字节
}
public struct SOCKETHEADER
{
public ushort SocketHeader; //包头:0x55AA
public ushort Length; //有效数据长度
public PACKAGETYPE Type;//数据包类型
public uint Index; //数据包编号
public uint PackageCount; //数据包总数
}
public unsafe struct SOCKETBODY
{
public fixed byte Data[1000];//一次最多发送1000字节的有效数据
}
public struct SOCKETTAIL
{
public int FileSize; //有效数据总长度
public ushort UnKnow; //保留字段
public ushort SocketTail; //包尾:0xAA55
}
public enum PACKAGETYPE
{
UnKnown,//未知的数据类型
//客户端发送,服务端解析
GetFileList,//获取文件列表,Data字段无需赋值
PlayMusic,//播放音乐,Data字段为编码后的文件名
//服务端发送,客户端解析
FileList,//返回文件列表,Data字段为编码后的文件名,可能需要多次发送该数据包
Music//返回音乐文件字节流,需要多次发送该数据包
}
具体实现的代码不再过多展示,已上传到GitHub上,文后会附上地址。
运行效果如下图:
总结:使用C#开发Android程序效率还是很不错的,常用的库也支持的很好,C#里能够使用指针和结构体在解析数据这块相比Java还是很占优势的,用C#做一些简单的APP还是可以的。大型的程序也没法去验证。
开发中遇到的坑:
1、显示文件列表的是个ListView,数据源是SimpleAdapter,实例化SimpleAdapter的构造函数如下:
public SimpleAdapter(Context context, IList> data, int resource, string[] from, int[] to);
data对象类型为IList>,使用List> data作为参数编译没问题,但运行报错,使用List> data作为参数才能成功运行。
2、在线播放音乐给MediaPlayer设置数据源时可通过SetDataSource(MediaDataSource dataSource);这个接口实现边下边播,MediaDataSource是一个抽象类,需要自己实现这个类。
项目地址:
服务端:https://github.com/LittleDruid/MusicShareServer
客户端:https://github.com/LittleDruid/MusicShare
领取专属 10元无门槛券
私享最新 技术干货