ファイル ピッカー

Browse sample. サンプルを参照する

この記事では、.NET Multi-platform App UI (.NET MAUI) IFilePicker インターフェイスを使用する方法について説明します。 IFilePicker インターフェイスを使用すると、デバイスから 1 つ以上のファイルを選択するようにユーザーに促すことができます。

IFilePicker インターフェイスの既定の実装は、FilePicker.Default プロパティを通じて利用できます。 IFilePicker インターフェイスと FilePicker クラスはどちらも Microsoft.Maui.Storage 名前空間に含まれます。

作業の開始

FilePicker の機能にアクセスするには、次のプラットフォーム固有のセットアップが必要です。

アプリが Android 12 以下をターゲットにする場合は、READ_EXTERNAL_STORAGE アクセス許可を要求する必要があります。 アプリが Android 13 以降をターゲットにし、他のアプリで作成したファイルへのアクセスが必要な場合は、READ_EXTERNAL_STORAGE アクセス許可ではなく、次の詳細なアクセス許可を 1 つ以上要求する必要があります。

  • READ_MEDIA_IMAGES
  • READ_MEDIA_VIDEO
  • READ_MEDIA_AUDIO

これらのアクセス許可は、次の方法で追加できます。

  • アセンブリベースのアクセス許可を追加します。

    Platforms/Android/MainApplication.cs ファイルを開き、using ディレクティブの後に次のアセンブリ属性を追加します。

    [assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage, MaxSdkVersion = 32)]
    [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaAudio)]
    [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaImages)]
    [assembly: UsesPermission(Android.Manifest.Permission.ReadMediaVideo)]
    

    または

  • Android マニフェストを更新します。

    Platforms/Android/AndroidManifest.xml ファイルを開き、manifest ノードに次を追加します。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <!-- Required only if your app needs to access images or photos that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <!-- Required only if your app needs to access videos that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    <!-- Required only if your app needs to access audio files that other apps created -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />    
    

    または

  • マニフェスト エディターで Android マニフェストを更新します。

    Visual Studio で、Platforms/Android/AndroidManifest.xml ファイルをダブルクリックして、Android マニフェスト エディターを開きます。 次に、[必要なアクセス許可] で、上記に一覧表示されたアクセス許可をチェックします。 これにより、AndroidManifest.xml ファイルが自動的に更新されます。

重要

アクセス許可の確認と要求は .NET MAUI で自動的に処理されるので、すべてのメソッドを UI スレッドで呼び出す必要があります。

ファイルを選択する

PickAsync メソッドは、デバイスからファイルを選択するようにユーザーを促します。 PickOptions 型を使用すると、ピッカーで許可されるタイトルとファイルの種類を指定できます。 次の例は、ピッカーを開き、選択された画像を処理する方法を示します。

public async Task<FileResult> PickAndShow(PickOptions options)
{
    try
    {
        var result = await FilePicker.Default.PickAsync(options);
        if (result != null)
        {
            if (result.FileName.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) ||
                result.FileName.EndsWith("png", StringComparison.OrdinalIgnoreCase))
            {
                using var stream = await result.OpenReadAsync();
                var image = ImageSource.FromStream(() => stream);
            }
        }

        return result;
    }
    catch (Exception ex)
    {
        // The user canceled or something went wrong
    }

    return null;
}

既定のファイルの種類には FilePickerFileType.ImagesFilePickerFileType.PngFilePickerFilerType.Videos が表示されます。 FilePickerFileType クラスのインスタンスを作成することで、プラットフォームごとにカスタム ファイルの種類を指定できます。 このクラスのコンストラクターは、DevicePlatform 型でキー指定されたディクショナリを引数として受け取って、プラットフォームを識別します。 ディクショナリ キーの値は、ファイルの種類を表す文字列のコレクションです。 たとえば、ファイルの種類として特定のコミックを指定するには次のようにします。

var customFileType = new FilePickerFileType(
                new Dictionary<DevicePlatform, IEnumerable<string>>
                {
                    { DevicePlatform.iOS, new[] { "public.my.comic.extension" } }, // UTType values
                    { DevicePlatform.Android, new[] { "application/comics" } }, // MIME type
                    { DevicePlatform.WinUI, new[] { ".cbr", ".cbz" } }, // file extension
                    { DevicePlatform.Tizen, new[] { "*/*" } },
                    { DevicePlatform.macOS, new[] { "cbr", "cbz" } }, // UTType values
                });

PickOptions options = new()
{
    PickerTitle = "Please select a comic file",
    FileTypes = customFileType,
};

ファイルの種類に基づくファイルの検索は、プラットフォームによって異なる場合があります。 詳細については、「プラットフォームによる違い」をご覧ください。

複数のファイルを選択する

ユーザーに複数のファイルを選択させる場合は、FilePicker.PickMultipleAsync メソッドを呼び出します。 このメソッドは、追加情報を指定するための PickOptions パラメーターも受け取ります。 結果は PickAsync と同じですが、FileResult 型が返されるのではなく、選択されたすべてのファイルを含んだ IEnumerable<FileResult> 型が返されます。

ヒント

FullPath プロパティは、ファイルへの物理パスを常に返すとは限りません。 ファイルを取得するには、OpenReadAsync メソッドを使用します。

プラットフォームによる違い

このセクションでは、ファイル ピッカーに関するプラットフォーム固有の違いについて説明します。

PickOptions.PickerTitle は、ユーザーに対する最初のプロンプトには表示されますが、ピッカー ダイアログ自体には表示されません。

ファイルを種類でフィルタリングする場合は、ファイルの MIME の種類を使用します。 MIME の種類の一覧については、「Mozilla: よくある MIME の種類」をご覧ください。