0

For xamarin forms, I am using Plugin.Messaging.EmailMessageBuilder for email sending option. I need to attach the text file with mail. I am using the following code:

call from my xaml.cs file:

CrossMessaging.Current.EmailMessenger.SendSampleEmail(true);

SampleExtenstion.cs:

using Plugin.DeviceInfo;
using Plugin.Messaging;
using CompanyName.Helper;
using System.IO;
using System;
using Plugin.Permissions;
using Plugin.Permissions.Abstractions;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace CompanyName.BusinessLogic
{
    public static class SamplesExtensions
    {
        public static EmailMessageBuilder BuildSampleEmail(bool sendAsHtml = false)
        {

            var builder = new EmailMessageBuilder()
            .To("abc@gmail.com")
            .Subject("Support Ticket for Forms");
                if (sendAsHtml)
                    builder.BodyAsHtml("<p>Well hello there from Xam.Messaging.Plugin</p>");
                else
                    builder.Body("Well hello there from Xam.Messaging.Plugin");
                return builder;
        }

        public static void SendSampleEmail(this IEmailTask emailTask, IEmailMessage email)
        {
            try
            {
                if (emailTask.CanSendEmailAttachments)
                {
                    emailTask.SendEmail(email);
                }
            }
            catch(Exception ex)
            {

            }
        }

        public static void SendSampleEmail(this IEmailTask emailTask, bool sendAsHtml)
        {
            try
            {
                Task.Run(async () => {
                    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage);
                    if (status == PermissionStatus.Granted)
                    {
                        string LogFile = "CompanyNameLog.txt";
                        string Secure_Folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);

                        var folderPath1 = Path.Combine(Secure_Folder,LogFile);
                        if (File.Exists(folderPath1))
                        {
                            var email = BuildSampleEmail(sendAsHtml).WithAttachment(folderPath1, @"text/plain").Build();
                            emailTask.SendSampleEmail(email);
                        }
                    }
                    else
                    {
                        var denyMessage = string.Format("Please enable the {0} permission to storage", Permission.Storage);
                        status = await Utils.CheckPermissions(Permission.Storage, denyMessage);
                        if (status == PermissionStatus.Granted)
                        {
                            string LogFile = "CompanyNameLog.txt";
                        string Secure_Folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);

                        var folderPath1 = Path.Combine(Secure_Folder,LogFile);
                            if (File.Exists(folderPath1))
                            {
                                var email = BuildSampleEmail(sendAsHtml).WithAttachment(folderPath1, @"text/plain").Build();
                                emailTask.SendSampleEmail(email);
                            }
                        }
                    }
                });
            }
            catch(Exception ex)
            {

            }
        }
    }
}

In AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.CompanyName.xxx24x7.app" android:versionName="1.0.4" android:versionCode="6">
<uses-sdk android:minSdkVersion="20"  android:targetSdkVersion="28" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
<application android:label="CompanyName 24x7" android:largeHeap="true" android:icon="@drawable/Icon" android:theme="@style/MyTheme">
...
<provider
       android:name="android.support.v4.content.FileProvider"
       android:authorities="com.CompanyName.xxx24x7.app.fileprovider"
       android:exported="false"
       android:grantUriPermissions="true">
          <meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/file_paths" />
        </provider>
        </application>
    </manifest>

in file_paths.xml:

<?xml version="1.0" encoding="utf-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external_files" path="." />
</paths>

I am getting exception like this:

{Java.Lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.CompanyName.xxx24x7.app/files/CompanyNameLog.txt
  at Java.Interop.JniEnvironment+StaticMethods.CallStaticObjectMethod (Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <034d4a9852dd45bea9353cc7776c99f0>:0 
  at Android.Runtime.JNIEnv.CallStaticObjectMethod (System.IntPtr jclass, System.IntPtr jmethod, Android.Runtime.JValue* parms) [0x00000] in /Users/builder/data/lanes/6090/a8a3b0ec/source/monodroid/external/xamarin-android/src/Mono.Android/Android.Runtime/JNIEnv.g.cs:562 
  at Android.Support.V4.Content.FileProvider.GetUriForFile (Android.Content.Context context, System.String authority, Java.IO.File file) [0x00077] in <7d47c22d29c547b3a95ff45009a20705>:0 
  at Plugin.Messaging.EmailTask.SendEmail (Plugin.Messaging.IEmailMessage email) [0x00191] in C:\PragmaDev\OKSource\Git\Xamarin.Plugins\Messaging\Plugin.Messaging.Android\EmailTask.cs:102 
  at CompanyName.BusinessLogic.SamplesExtensions.SendSampleEmail (Plugin.Messaging.IEmailTask emailTask, Plugin.Messaging.IEmailMessage email) [0x0000d] in D:\manthiram\Scular Project\Former\20190103\FormerApp\CompanyName\CompanyName\BusinessLogic\SamplesExtensions.cs:41 
  --- End of managed Java.Lang.IllegalArgumentException stack trace ---
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.CompanyName.xxx24x7.app/files/CompanyNameLog.txt
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:719)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:404)
}

can anyone help me to resolve this issue.

Manthiram
  • 149
  • 2
  • 13
  • can anyone have solution for this? – Manthiram Jan 04 '19 at 10:00
  • I cannot get the solution as you mentioned. But i got the solutions listed below: I dicrease the version of xam.plugin.messaging from 5.0.2 to 3.2.1. I am adding the following two lines on mainapplicaiton.cs on OnCreate method: StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.SetVmPolicy(builder.Build()); it is working fine now. – Manthiram Jan 07 '19 at 10:18

0 Answers0