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.