question

PhillipMobley-0553 avatar image
0 Votes"
PhillipMobley-0553 asked ·

Xamarin Droid using FileProvider.GetUriForFile

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)
                 {
                     SendMMSData(sendPDUData);
                 }
         }
    
         public byte[] GetMMSPDUData(string DestinationNumber, string AudioFilePath, string smsMessage)
         {
             byte[] pduData = null;
             try
             {
                 SendReq sendReq = new SendReq();
    
                 sendReq.AddTo(new EncodedStringValue(DestinationNumber));
    
                 PduBody pduBody = new PduBody();
    
                 // Add text message data to message
                 PduPart txtPart = new PduPart();
                 txtPart.SetData(Encoding.ASCII.GetBytes(smsMessage));
                 txtPart.SetContentType(new EncodedStringValue("text/plan").GetTextString());
                 txtPart.SetName(new EncodedStringValue("Message").GetTextString());
                 pduBody.AddPart(txtPart);
    
                 // 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.SetData(sampleImageData);
                 imgPart.SetContentType(new EncodedStringValue("image/jpg").GetTextString());
                 imgPart.SetFilename(new EncodedStringValue(System.IO.Path.GetFileName(AudioFilePath)).GetTextString());
                 pduBody.AddPart(imgPart);
    
                 // 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();
    
             try
             {
                 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.

dotnet-csharpdotnet-xamarinformsdotnet-android
· 8
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

@PhillipMobley-0553
NullPointerException is a common exception , can you clarify which line cause the error?

0 Votes 0 ·

@ColeXia-MSFT

Hello Cole,

No problem, It is line 80 that is causing me problems.

0 Votes 0 ·

Do I need to do something with the Android Manifest XML file like this stack overflow post:

https://stackoverflow.com/questions/46550472/fileprovider-geturiforfile-returns-nullpointerexception


0 Votes 0 ·

So I tried adding this into my manifest and I am getting the following error:

 <application>
         <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.JanineSafety2.fileprovider" android:grantUriPermissions="true" android:exported="false">
             <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
         </provider>
     </application>

Error:

 resource xml/provider_paths (aka com.companyname.janinesafety2:xml/provider_paths) not found


0 Votes 0 ·

Hi, PhillipMobley-0553. What's the version of the Xamarin.Forms? Or what's the version of the targetFramework in the Android project? Since Xamarin.Forms 5.0, it requires to set the TargetFramework to Android 10 which will using AndroidX library by defalut. In this case, please use the function code in AndroidX library.


resource xml/provider_paths (aka com.companyname.janinesafety2:xml/provider_paths) not found

This error occurs because manifest couldn't find the file you indicated here: android:resource="@xml/file_path". Did you create the 'provider_paths.xml' in the Resource\xml folder?

0 Votes 0 ·
Show more comments

1 Answer

JarvanZhang-MSFT avatar image
0 Votes"
JarvanZhang-MSFT answered ·

Hello,​

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
<application>
  <provider android:authorities="com.companyname.Janxxx.fileprovider" ...>
    ...
  </provider>
</application>


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.



· 4 ·
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Hello, so I changed that in the xml file and I am still getting the same error..

Also, I should note that I changed the source a little bit ago. I have reflected the changes in my post above.

0 Votes 0 ·

I am currently running v5.0.0.2012 My current Target is set to Android 9 which is what my phone runs

Xamarin.Forms 5.0 requires the Target Framework should be Android 10 or greater and uses AndroidX by defult. Have you updated the Xamarin.Forms package on the Android platform project?

If the Target Framework is set to Android 10, we should use AndroidX.Core.Content.FileProvider.GetUriForFile instead. And the android:name's value of the <provide> tag should also be changed to androidx.xxx .

<provider android:name="androidx.core.content.FileProvider" 
          android:authorities="${applicationId}.fileprovider" 
          android:exported="false" 
          android:grantUriPermissions="true">
          
      <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
                     android:resource="@xml/file_paths"></meta-data>
</provider>
0 Votes 0 ·

Yes, I have done all of that and I am seeing the same error.

0 Votes 0 ·
Show more comments