【问题标题】:Getting a List of all filepaths for Audio Files in a certain directory获取某个目录中音频文件的所有文件路径列表
【发布时间】:2019-10-30 15:06:57
【问题描述】:

我正在尝试构建自己的音乐播放器安卓应用。

我希望它非常简单,只需找到所有有效的音乐文件(也许我设置了文件类型,例如 mp3、m4a、wma 等供它查找?)并按照找到的顺序播放它们。

到目前为止,我已经有了它,因此我可以使用

找到默认的音乐文件夹路径
string musicDirectoryPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic).ToString();

我现在需要检查该文件夹中的每个文件(和文件夹),看看它是否是 mp3/m4a 等,然后将它们添加到列表中。我一直在搞乱并尝试了一些 foreach 循环,但没有得到任何有用的东西。

我很困惑,对 Android 开发很陌生。

如您所见,如果我在默认目录 (*/NewPipe/Intergalatic - Beastie.m4a) 中指定我知道在手机上的歌曲,则音乐正在播放。

那么,如何获取所有这些字符串的列表,例如“NewPipe/Beastie..”等(以及我的默认音乐目录中的其他 500 多个文件夹?

到目前为止,这是我的整个班级(这是项目中唯一的班级):

using System;
using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Support.Design.Widget;
using Android.Support.V7.App;
using Android.Views;
using Android.Widget;
using Android.Media;
using Xamarin.Android;
using System.IO;
using System.Collections.Generic;
using Android.Util;

namespace Music_Player_v001
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
    protected MediaPlayer mediaPlayer;
    List<string> filepaths_audio = new List<string>();

    public void StartMediaPlayer(String filePath)
    {
        mediaPlayer.Reset();
        mediaPlayer.SetDataSource(filePath);
        mediaPlayer.Prepare();
        mediaPlayer.Start();
    }

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);

        Android.Support.V7.Widget.Toolbar toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
        SetSupportActionBar(toolbar);

        FloatingActionButton fab = FindViewById<FloatingActionButton>(Resource.Id.fab);
        fab.Click += FabOnClick;

        string musicDirectoryPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic).ToString();
        Log.Info("FILEPATHS: ", "music directory path is: " + musicDirectoryPath);

        mediaPlayer = new MediaPlayer();
        StartMediaPlayer(musicDirectoryPath + "/NewPipe/Intergalactic - Beastie Boys (HD).m4a");

        //foreach(AudioTrack track in Android.OS.Environment.DirectoryMusic)
        //{
        //    Log.Info("BULLSHIT TAG","track count =======================" + tracks);
        //    tracks++;

        //}
    }

    public override bool OnCreateOptionsMenu(IMenu menu)
    {
        MenuInflater.Inflate(Resource.Menu.menu_main, menu);
        return true;
    }

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        int id = item.ItemId;
        if (id == Resource.Id.action_settings)
        {
            return true;
        }

        return base.OnOptionsItemSelected(item);
    }

    private void FabOnClick(object sender, EventArgs eventArgs)
    {
        View view = (View) sender;
        Snackbar.Make(view, "Replace with your own action", Snackbar.LengthLong)
            .SetAction("Action", (Android.Views.View.IOnClickListener)null).Show();
    }


}
}

附加

我也试过这个:

 foreach (File f in Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryMusic))
        {


        }

【问题讨论】:

    标签: c# android xamarin


    【解决方案1】:

    听起来您的主要问题是递归地遍历目录及其子目录中的所有文件。以下是一些相关链接:

    How to recursively list all the files in a directory in C#?

    Best way to iterate folders and subfolders

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-iterate-through-a-directory-tree

    最简单的方法可能是Directory.EnumerateFiles,像这样使用:Directory.EnumerateFiles(musicDirectoryPath, "*", SearchOption.AllDirectories),以确保它也枚举子目录。

    foreach (string musicFilePath in Directory.EnumerateFiles(musicDirectoryPath, "*", SearchOption.AllDirectories)) {
            Log.Info("Music File", "Music file path is " + musicFilePath);
            // do whatever you want to with the file here
    }
    

    请注意,如果树中某处存在访问受限目录(或其他错误),这可能会失败。如果您希望您的解决方案能够解决此问题,请参阅我在上面发布的链接,尤其是底部的链接。

    另外请注意,您可以将方法调用中的 "*"(通配符)更改为 "*.mp3""*.wav" 等,以仅匹配具有这些扩展名的文件。但是,由于该方法不支持正则表达式,我认为没有任何方法可以匹配多个文件扩展名(例如 mp3 和 wav)。我认为您必须使用"*",然后只需在foreach 中检查该文件是否是有效的音乐文件。

    【讨论】:

    • 哇,这看起来很棒!谢了哥们。我会在睡觉之前尝试一下(早该睡了这么多小时,但我一直在尝试解决它哈哈)。我会回来确认一切正常。再次感谢!
    • 你先生是一个绝对的传奇!
    • 没问题,很高兴它成功了 :) 请确保您知道如果音乐目录中有访问受限的内容,这可能会失败。如果这是一个爱好项目,我相信它会很好......但在生产应用程序中这样做可能不是一个好主意!
    • 它实际上仍然失败 :[ 但现在错误是: Exception Unhandled at line 'mediaPlayer.SetDataSource(filepath);
    • 在 logcat 中我实际上看到了歌曲的名称!!!但后来它失败了......哦,我刚刚修复它哈哈,我是白痴,我给它文件名+文件路径[0],但后者已经包含前者,我也不得不将通配符更改为 m4a,所以我猜它正在寻找一个不受支持的文件(例如 jpg 或其他东西)
    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 2011-11-18
    • 2010-12-01
    • 1970-01-01
    • 2016-06-29
    • 2016-02-20
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多