Xamarin Droid using FileProvider.GetUriForFile

Phillip Mobley 31 Reputation points

Hello all,

I am creating an app that uses MMS to send a picture to a contact. I currently have mostly everything created. The part that I am having trouble on is creating the URI from a file.

What I have right now is that I am using the FileProvider class to generate the URI (using the function GetUriFromFile).

However, when I run the code, I get the exception:

Java.Lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference\n  at Java.Interop.JniEnvironment+StaticMethods.CallStaticObjectMethod (Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <26521a5118b44c858c385715922b9d5d>

I am not sure what is going on. Looking for a solution for a few days but I haven't found anything. Does anyone have any suggestions?

Below is a copy of my code:

public void SendMMSMessage()

                Android.Telephony.SmsManager smsMessage = Android.Telephony.SmsManager.Default;
                IList<string> divideContents = smsMessage.DivideMessage("I auto sent this message to you! No typing here!!!!!");
                string filePath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures) + "/TestPic.jpg";

                byte[] sendPDUData = GetMMSPDUData("1111111111", filePath, "Hey this image was sent from my phone using code! No typing here");

                if (sendPDUData != null)

        public byte[] GetMMSPDUData(string DestinationNumber, string AudioFilePath, string smsMessage)
            byte[] pduData = null;
                SendReq sendReq = new SendReq();

                sendReq.AddTo(new EncodedStringValue(DestinationNumber));

                PduBody pduBody = new PduBody();

                // Add text message data to message
                PduPart txtPart = new PduPart();
                txtPart.SetContentType(new EncodedStringValue("text/plan").GetTextString());
                txtPart.SetName(new EncodedStringValue("Message").GetTextString());

                // Add image data 
                // TODO: Later, this will be audio file. But image file for testing
                PduPart imgPart = new PduPart();
                byte[] sampleImageData = System.IO.File.ReadAllBytes(AudioFilePath);

                imgPart.SetContentType(new EncodedStringValue("image/jpg").GetTextString());
                imgPart.SetFilename(new EncodedStringValue(System.IO.Path.GetFileName(AudioFilePath)).GetTextString());

                // Now create body of MMS
                sendReq.Body = pduBody;
                // Finally, generate the byte array to send to the MMS provider
                PduComposer composer = new PduComposer(sendReq);
                pduData = composer.Make();
            catch(Exception ex)
                // TODO: Do something here
            return pduData;


        public bool SendMMSData(byte[] PDUData)
            Context CTX = Android.App.Application.Context;
            Android.Telephony.SmsManager sm = Android.Telephony.SmsManager.Default;
            Random rnd = new Random();

                string cacheFilePath = System.IO.Path.Combine(CTX.CacheDir.AbsolutePath, "send." + rnd.Next().ToString() + ".dat");
                System.IO.File.WriteAllBytes(cacheFilePath, PDUData);
                Java.IO.File testFile = new Java.IO.File(cacheFilePath);
                string authString = CTX.PackageName + ".fileprovider";
                if (System.IO.File.Exists(cacheFilePath))
                    Android.Net.Uri contentURI = AndroidX.Core.Content.FileProvider.GetUriForFile(CTX, CTX.PackageName + ".fileprovider", testFile);

                    PendingIntent pendingIntent = PendingIntent.GetBroadcast(CTX, 0, new Intent(CTX.PackageName + ".WAP_PUSH_DELIVER"), 0);

                    sm.SendMultimediaMessage(CTX, contentURI, null, null, null);
            catch(Exception ex)
                String exString = ex.ToString();
                return false;
            return true;

Note: The number I made up. But I can guarantee you that I placed a working phone number in the function.

A Microsoft open-source app platform for building Android and iOS apps with .NET and C#.
5,326 questions
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
10,614 questions
{count} votes

Accepted answer
  1. JarvanZhang 23,951 Reputation points


    Welcome to our Microsoft Q&A platform!

    Java.Lang.IllegalArgumentException: Couldn't find meta-data for provider with authority com.companyname.janxxxx.fileprovider

    It seems there is something wrong with the applicationId. According to the error info, the package name is com.companyname.janxxxx. But in the <application> tag of AndroidManifest.xaml, it's com.companyname.Janxxxx. The j is an uppercase letter, please change it to lowercase and test again.

       //the funtion code  
       Android.Net.Uri contentURI = Android.Support.V4.Content.FileProvider.GetUriForFile(CTX, CTX.PackageName + ".fileprovider", testFile);  
       //the application tag  
         <provider android:authorities="com.companyname.Janxxx.fileprovider" ...>  

    Best Regards,

    Jarvan Zhang

    If the response is helpful, please click "Accept Answer" and upvote it.

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

0 additional answers

Sort by: Most helpful