Search code examples
emailxamarinattachmentfilepicker

Xamarin use the file choose with FilePicker using a button


First sorry for my bad English. The problem I have is when I'm creating a button to filepicker a file in Android folder, but when I wrote:

message.Attachments.Add("here I don't know");

I want to choose the file who was pickfile with button File.

I'm blocked, I have already searched a lot in internet and not found any solution.

XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AppETF.View.Menu.DetailViews.SignalementEM">
    <ContentPage.Content>
        <Grid VerticalOptions="FillAndExpand">
            <Button Text="Piece jointe" x:Name="fileLabel" Clicked="File" BackgroundColor="White" FontSize="25"/>
            <Button Text="Envoyer l'email" Clicked="SendSMTPMail" BackgroundColor="White" FontSize="25"/>
        </Grid>
    </ContentPage.Content>

Cs :

private async void File(object sender, EventArgs e)
{
    var fileData = await CrossFilePicker.Current.PickFile();

    if (fileData == null)
        return;

    byte[] data = fileData.DataArray;
    fileLabel.Text = fileData.FileName;
}

public async Task SendSMTPMail(string numero, string heure, string retard, string motif)
{
    var message = new MailMessage();
    var smtpServer = new System.Net.Mail.SmtpClient("smtp.gmail.com", 587);
    message.From = (new MailAddress("***"));
    message.To.Add("***");
    message.Subject = ***;
    message.Body = ***;

    message.Attachments.Add("second probleme here");

    smtpServer.Credentials = new NetworkCredential("***", "****");
    smtpServer.UseDefaultCredentials = false;
    smtpServer.EnableSsl = true;
    smtpServer.Send(message);
    await DisplayAlert("", "Email Envoyé", "Ok");
}

Solution

  • //Use this code For file picking
    //On Buton method:
    
    private void Button1_Click(object sender, System.EventArgs e)
        {
                Intent = new Intent();
                Intent.SetType("image/*");
                Intent.SetType("pdf/*");
                Intent.SetType("doc/*");
    
                Intent.SetAction(Intent.ActionGetContent);
                //Intent.PutExtra(Intent.ExtraAllowMultiple, true);
                StartActivityForResult(Intent.CreateChooser(Intent, "Select a File"), PickImageId);
                //CreateChooser(Intent, "Select Picture"), PickImageId);
        }
    
    //On OnActivityResult Method:
        protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
                        {
             base.OnActivityResult(requestCode, resultCode, data);
             if ((requestCode == PickImageId) && (resultCode == Result.Ok) && (data != null))
                        {
                            //Bitmap bitmap = (Bitmap)data.Extras.Get("Select Picture");
                            Android.Net.Uri uri = data.Data;
                            image.SetImageURI(uri);
                            //image.SetImageBitmap(bitmap);
                            //GetImageFromURI(uri);
                            Toast.MakeText(this, "Path is " + GetImageFromURI(uri), ToastLength.Long).Show();
    
                        }
             }
    
    //GetImageFromURI Method:
    public string GetImageFromURI(Uri contentURI)
           {
    Android.Database.ICursor cursor = ContentResolver.Query(contentURI, null, null, null, null);
                if (cursor != null)
                {
                    cursor.MoveToFirst();
                    string documentId = cursor.GetString(0);
                    documentId = documentId.Split(':')[1];
                    cursor.Close();
                    cursor = ContentResolver.Query(Android.Provider.MediaStore.Images.Media.ExternalContentUri,
                                                   null,
                                                   Android.Provider.MediaStore.Images.Media.InterfaceConsts.Id + " = ? ", new[] { documentId },
                                                   null);
                    cursor.MoveToFirst();
                    string path = cursor.GetString(cursor.GetColumnIndex(Android.Provider.MediaStore.Images.ImageColumns.Data));
                    cursor.Close();
                    return path;
                }
                return contentURI.Path;
    }