You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否用C#程序化访问Android PLA播放列表并解析.PLA文件?

关于C#访问Android PLA播放列表的解答

1. 能否通过C#程序化访问Android设备中PLA播放列表内的歌曲?

当然可以!不过得拆成两步来操作:

  • 第一步是从MTP模式的Android设备获取PLA文件:Windows下直接用普通File类没法访问MTP设备的内容,得借助Windows Portable Devices (WPD) API。你可以用C#直接调用这个API,或者用Windows.Devices.Portable命名空间的封装接口(注意项目类型,比如UWP或者COM互操作方式)来读取设备里的PLA文件。
  • 第二步就是解析拿到手的PLA文件,提取里面的歌曲信息——这部分正好对应第二个问题的内容。

2. 能否编写C#代码打开.PLA文件并输出其中的歌曲信息?

绝对没问题!PLA是三星等Android设备常用的播放列表格式,本质是二进制文件,里面存储的歌曲路径/URI多为UTF-16编码的字符串。下面给你一段实用的解析代码示例:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

class PlaPlaylistParser
{
    static void Main(string[] args)
    {
        // 替换成你的PLA文件本地路径
        string targetPlaFile = @"D:\Downloads\MyMusicPlaylist.pla";
        var songPaths = ExtractSongPathsFromPla(targetPlaFile);
        
        Console.WriteLine("PLA播放列表包含的歌曲路径:");
        foreach (var path in songPaths)
        {
            Console.WriteLine(path);
        }
    }

    static List<string> ExtractSongPathsFromPla(string filePath)
    {
        var songList = new List<string>();
        
        using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        using (var binaryReader = new BinaryReader(fileStream, Encoding.Unicode))
        {
            // 跳过PLA文件的固定头部(以常见三星PLA版本为例,偏移量可根据实际文件调整)
            fileStream.Seek(0x2C, SeekOrigin.Begin);
            
            // 读取列表内的歌曲总数
            int totalSongs = binaryReader.ReadInt32();
            
            // 跳转到歌曲路径的起始位置
            fileStream.Seek(0x40, SeekOrigin.Begin);
            
            // 逐个读取每首歌的路径
            for (int i = 0; i < totalSongs; i++)
            {
                // 读取字符串长度(UTF-16每个字符占2字节,所以要除以2)
                int strByteLength = binaryReader.ReadInt32();
                int strCharLength = strByteLength / 2;
                string songPath = new string(binaryReader.ReadChars(strCharLength));
                songList.Add(songPath);
                
                // 跳过每个条目末尾的空字节块(不同PLA版本可能需要调整跳过的字节数)
                binaryReader.ReadBytes(4);
            }
        }
        
        return songList;
    }
}

小提示:

  • 不同品牌或版本的PLA文件头部结构可能略有差异,如果上面的代码解析失败,你可以用HxD这类二进制编辑器打开PLA文件,观察头部偏移量和结构,调整Seek的参数。
  • 建议先把PLA文件从Android设备复制到本地磁盘再解析,避免MTP访问的权限或性能问题。

内容的提问来源于stack exchange,提问作者sdMarth

火山引擎 最新活动