ファイル選択

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

この記事では、.NET マルチプラットフォームアプリUI (.NET MAUI) IFilePicker インターフェイスを使用する方法について説明します。 IFilePicker インターフェースを使用すると、デバイスから 1 つ以上のファイルを選択するようにユーザーに指示することができます。

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

概要

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 ファイルを開き、 ノードに次を追加します。

    <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 の種類」をご覧ください。

Warnung

Android では、 FileResult.FullPath はファイルシステム パスではなく content:// URI を返す場合があります。 content:// URI をFile.OpenRead()または同様の API に直接渡すと、FileNotFoundExceptionで失敗します。 常に OpenReadAsync を使用してファイルの内容を読み取ります。

// Correct: works on all platforms, including Android content URIs
using var stream = await result.OpenReadAsync();

// Incorrect: may fail on Android when FullPath is a content:// URI
using var stream = File.OpenRead(result.FullPath);