Unable to convert from 'Android.Net.Uri' to 'string'

0

I'm trying to save an image attached to a variable to send by mail but I get this error:

  

Unable to convert from 'Android.Net.Uri' to 'string'

I send code where I get an error:

if (uris != null)
{
    var filePath = System.IO.Path.Combine(uris, "");
    var File = new Java.IO.File(filePath);
    var path = Uri.FromFile(File);
    mail.Attachments.Add(new Attachment(Android.Content.Intent.ExtraStream, path));
}

Complete code:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreateView(inflater, container, savedInstanceState);

    textView = inflater.Inflate(Resource.Layout.Autorizaciones, container, false);
    textView.FindViewById<TextView>(Resource.Id.txtAutoNombre).Text = mTxtNombre;
    textView.FindViewById<TextView>(Resource.Id.txtAutoCedula).Text = mTxtCedula;
    imageView = textView.FindViewById<ImageView>(Resource.Id.ImgMostrarFotos);

    Adjuntar = textView.FindViewById<Button>(Resource.Id.btnCamara);
    Enviar = textView.FindViewById<Button>(Resource.Id.btnEnviar);
    Enviar.Visibility = ViewStates.Invisible;
    imageView.Visibility = ViewStates.Invisible;

    Adjuntar.Click += delegate
    {
        var imageIntent = new Intent();
        imageIntent.SetType("image/*");
        imageIntent.SetAction(Intent.ActionGetContent);
        StartActivityForResult(Intent.CreateChooser(imageIntent, "Select photo"), 0);
    };

    Enviar.Click += delegate 
    {
        try
        {
            string smtpAddress = "smtp.gmail.com";
            int portNumber = 587;
            bool enableSSL = true;
            string emailFrom = "[email protected]";
            string password = "xxxxxxxxxxxx";
            string emailTo = "[email protected]";
            string subject = "Tramite Autorización "+ mTxtNombre;
            string body = "Hello, Mr."+mTxtCedula;
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress(emailFrom);
            mail.To.Add(emailTo);
            mail.Subject = subject;
            mail.Body = body;
            mail.IsBodyHtml = true;


            if (uris != null)
            {
                var filePath = System.IO.Path.Combine(uris, "");
                var File = new Java.IO.File(filePath);
                var path = Uri.FromFile(File);
                mail.Attachments.Add(new Attachment(Android.Content.Intent.ExtraStream, path));
            }


            using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
            {
                smtp.Credentials = new NetworkCredential(emailFrom, password);
                smtp.EnableSsl = enableSSL;
                smtp.Send(mail);
            }

            Toast.MakeText(Activity, "Mensaje Enviado" , ToastLength.Short).Show();
        }
        catch (Exception ex)

        {
            Toast.MakeText(Activity, "Mensaje Fallido" +ex, ToastLength.Short).Show();
        }
    };

    return textView;

}

public override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (resultCode == Result.Ok)
    {
        imageView = textView.FindViewById<ImageView>(Resource.Id.ImgMostrarFotos);
        imageView.SetImageURI(data.Data);
        imageView.Visibility = ViewStates.Visible;
        uris = GetPathToImage(data.Data);
        Enviar.Visibility = ViewStates.Visible;
    }
}

private string GetPathToImage(Uri uri )
{
    string doc_id = "";
    using (var c1 = Application.Context.ContentResolver.Query(uri, null, null, null, null))
    {
        c1.MoveToFirst();
        System.String document_id = c1.GetString(0);
        doc_id = document_id.Substring(document_id.LastIndexOf(":") + 1);
    }
    string path = null;

    string selection = Android.Provider.MediaStore.Images.Media.InterfaceConsts.Id + " =? ";
    using (var cursor = Application.Context.ContentResolver.Query(Android.Provider.MediaStore.Images.Media.ExternalContentUri, null, selection, new string[] { doc_id }, null))
    {
        if (cursor == null) return path;
        var columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Images.Media.InterfaceConsts.Data);
        cursor.MoveToFirst();
        path = cursor.GetString(columnIndex);
    }
    return path;
}

public override void OnActivityCreated(Bundle savedInstanceState)
{
    Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
    base.OnActivityCreated(savedInstanceState);
    Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation;

}
    
asked by Andrés Felipe Contreras Muñoz 08.08.2017 в 23:35
source

1 answer

1

The constructors of Attachment receive String as a non-Uri parameter. Uri.FromFile returns an object Uri so the variable path is type Uri .

Try passing filePath to the constructor of Attachment :

 var filePath = System.IO.Path.Combine(uris, "");
 var File = new Java.IO.File(filePath);
 var path = Uri.FromFile(File);
 mail.Attachments.Add(new Attachment(Android.Content.Intent.ExtraStream,  filePath));
    
answered by 09.08.2017 / 15:01
source