Condividi tramite


Xamarin.Essentials: Selezione supporti

La classe MediaPicker consente a un utente di selezionare o scattare una foto o un video nel dispositivo.

Operazioni preliminari

Per iniziare a usare questa API, leggere la guida introduttiva per Xamarin.Essentials assicurarsi che la libreria sia installata e configurata correttamente nei progetti.

Per accedere alla funzionalità MediaPicker è necessaria la configurazione specifica della piattaforma seguente.

Le autorizzazioni seguenti sono necessarie e devono essere configurate nel progetto Android. È possibile aggiungerla nei modi seguenti:

Aprire il file AssemblyInfo.cs nella cartella Proprietà e aggiungere:

// Needed for Picking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage)]

// Needed for Taking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
[assembly: UsesPermission(Android.Manifest.Permission.Camera)]

// Add these properties if you would like to filter out devices that do not have cameras, or set to false to make them optional
[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]

OPPURE aggiornare il manifesto di Android:

Aprire il file AndroidManifest.xml nella cartella Proprietà e aggiungere quanto segue all'interno del nodo manifest.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

Oppure fare clic con il pulsante destro del mouse sul progetto Android e aprire le proprietà del progetto. In Manifesto Android trovare l'area Autorizzazioni necessarie: e controllare queste autorizzazioni. Il file AndroidManifest.xml verrà aggiornato automaticamente.

Se la versione di Android di destinazione del progetto è impostata su Android 11 (API R 30) è necessario aggiornare il manifesto Android con query usate con i nuovi requisiti di visibilità del pacchetto.

Aprire il file AndroidManifest.xml nella cartella Proprietà e aggiungere quanto segue all'interno del nodo manifest:

<queries>
  <intent>
    <action android:name="android.media.action.IMAGE_CAPTURE" />
  </intent>
</queries>

Uso di Selezione supporti

La MediaPicker classe dispone dei metodi seguenti che tutti restituiscono un FileResult oggetto che può essere usato per ottenere il percorso dei file o leggerlo come .Stream

  • PickPhotoAsync: apre il browser multimediale per selezionare una foto.
  • CapturePhotoAsync: apre la fotocamera per scattare una foto.
  • PickVideoAsync: apre il browser multimediale per selezionare un video.
  • CaptureVideoAsync: apre la fotocamera per scattare un video.

Ogni metodo accetta facoltativamente un MediaPickerOptions parametro che consente di impostare su Title alcuni sistemi operativi visualizzati dagli utenti.

Suggerimento

Tutti i metodi devono essere chiamati nel thread dell'interfaccia utente perché i controlli delle autorizzazioni e le richieste vengono gestiti automaticamente da Xamarin.Essentials.

Utilizzo generale

async Task TakePhotoAsync()
{
    try
    {
        var photo = await MediaPicker.CapturePhotoAsync();
        await LoadPhotoAsync(photo);
        Console.WriteLine($"CapturePhotoAsync COMPLETED: {PhotoPath}");
    }
    catch (FeatureNotSupportedException fnsEx)
    {
        // Feature is not supported on the device
    }
    catch (PermissionException pEx)
    {
        // Permissions not granted
    }
    catch (Exception ex)
    {
        Console.WriteLine($"CapturePhotoAsync THREW: {ex.Message}");
    }
}

async Task LoadPhotoAsync(FileResult photo)
{
    // canceled
    if (photo == null)
    {
        PhotoPath = null;
        return;
    }
    // save the file into local storage
    var newFile = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
    using (var stream = await photo.OpenReadAsync())
    using (var newStream = File.OpenWrite(newFile))
        await stream.CopyToAsync(newStream);

    PhotoPath = newFile;
}

Suggerimento

La FullPath proprietà non restituisce sempre il percorso fisico del file. Per ottenere il file, usare il OpenReadAsync metodo .

API