- Home /
 
Share image in Unity Game on Android devices error
I am trying to share a screenshot in my Unity Game on Android devices with the following error:
E/Unity: AndroidJavaException: java.lang.NoSuchMethodError: no static method with name='getUriForFile' signature='(Landroid.app.Application;Ljava/lang/String;Ljava.io.File;)Ljava/lang/Object;' in class Ljava.lang.Object; java.lang.NoSuchMethodError: no static method with name='getUriForFile' signature='(Landroid.app.Application;Ljava/lang/String;Ljava.io.File;)Ljava/lang/Object;' in class Ljava.lang.Object; at com.unity3d.player.ReflectionHelper.getMethodID(Unknown Source:167) at com.unity3d.player.UnityPlayer.nativeRender(Native Method) at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0) at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:83) at android.os.Handler.dispatchMessage(Handler.java:101) at android.os.Looper.loop(Looper.java:173) at com.unity3d.player.UnityPlayer$e.run(Unknown Source:20) at UnityEngine.AndroidJNISafe.CheckException () [0x00000] in :0 > at > UnityEngine.AndroidJNISafe.CallStaticObjectMethod > (System.IntPtr clazz, System.IntP
From the Logs I can see that "getUriForFile" method doesn't exists.. I have already checked most of the questions regarding the problem I have but I still cannot fix it.
Here is the ShareScreenshot code I have:
 private IEnumerator ShareScreenshot(string screenShotPath, string shareSubject, string shareLink, string textToShare)
 {
     if (!Application.isEditor)
     {
         /// Get Activity then Context
         AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
         AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
         AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");
 
         /// Get the package Name
         string packageName = unityContext.Call<string>("getPackageName");
         string authority = packageName + ".fileprovider";
 
         AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
         string ACTION_VIEW = intentClass.GetStatic<string>("ACTION_VIEW");
         AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);
 
         int FLAG_ACTIVITY_NEW_TASK = intentClass.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
         int FLAG_GRANT_READ_URI_PERMISSION = intentClass.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");
 
         AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", screenShotPath);
         AndroidJavaClass fileProvider = new AndroidJavaClass("androidx.core.content.FileProvider");
         AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", unityContext, authority, fileObj);
 
         intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uri);
         intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), textToShare + shareLink);
         intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), shareSubject);
         intent.Call<AndroidJavaObject>("setType", "image/png");
 
         intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
         intent.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION);
 
         currentActivity.Call("startActivity", intent);
     }
 
     yield return null;
 }
 
               Android Manifest:
 <provider android:name="androidx.core.content.FileProvider" android:authorities="com.mycompanyname.gamename.fileprovider" android:exported="false" android:grantUriPermissions="true">
   <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
 </provider>
 
               and the provider_paths.xml:
 <external-path path="Android/data/com.mycompanyname.gamename" name="files_root" />
 <external-path path="." name="external_storage_root" />
 
               I was using "android.support.v4.content.FileProvider" but it's not working on Android version 9 and up so I tried "androidx.core.content.FileProvider" and I'm getting the error above.
Thank you.
Answer by adityakaishav · Jan 12, 2021 at 07:01 AM
@Gng357 Have you found the solution, I am getting the same issue for opening a pdf file in the Unity game. If you found the solution, please let me know. Thanks!
Answer by Douglad · Jan 12, 2021 at 01:52 PM
 private IEnumerator ShareScreenshot(string screenShotPath, string shareSubject, string shareLink, string textToShare)
 {
     if (!Application.isEditor)
     {
         /// Get Activity then Context
         AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
         AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
         AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");
 
         /// Get the package Name
         string packageName = unityContext.Call<string>("getPackageName");
         string authority = packageName + ".fileprovider";
 
         AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
         string ACTION_VIEW = intentClass.GetStatic<string>("ACTION_VIEW");
         AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);
 
         int FLAG_ACTIVITY_NEW_TASK = intentClass.GetStatic<int>("FLAG_ACTIVITY_NEW_TASK");
         int FLAG_GRANT_READ_URI_PERMISSION = intentClass.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");
 
         AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", screenShotPath);
         AndroidJavaClass fileProvider = new AndroidJavaClass("androidx.core.content.FileProvider");
         AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", unityContext, authority, fileObj);
 
         intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uri);
         intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), textToShare + shareLink);
         intent.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), shareSubject);
         intent.Call<AndroidJavaObject>("setType", "image/png");
 
         intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
         intent.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION);
 
         currentActivity.Call("startActivity", intent);
     }
 
     yield return null;
 }
 
               To use this function properly, you need to provide the function a path where your screenshot is located mycardstatement.com
@Gng357 I want to open a pdf file in Unity, can I use this for that?
Your answer
 
             Follow this Question
Related Questions
Facebook app review for screenshot share 0 Answers
Android Share text and image? 4 Answers
Android Native share (intent) an image with a link 4 Answers
Share Button 3 Answers
Share Screenshot Image to Facebook with Facebook SDK 0 Answers