How to get intent Data for Unity to use?
i already have intent-filter to catch some filetype open with my unity app by manifest.xml.
it like user download a file and choose open in my app . so i can't create customActivity to catch .
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="*/*" />
<data android:host="*" />
<data android:pathPattern=".*\\.ksvquiz" />
<data android:pathPattern=".*\\..*\\.ksvquiz" />
<data android:pathPattern=".*\\..*\\..*\\.ksvquiz" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.ksvquiz" />
</intent-filter>
but i can't receive intent message on my script , i found something to receive message on interest, but it doesn't work ,and another information was partly ....
void Start () {
string arguments = "";
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent");
bool hasExtra = intent.Call<bool> ("hasExtra", "arguments");
if (hasExtra) {
AndroidJavaObject extras = intent.Call<AndroidJavaObject> ("getExtras");
arguments = extras.Call<string> ("getString", "arguments");
}
}
does anyone was do samething like this, and was work?
thanks for any help!
Answer by Zyosoft · Mar 17, 2017 at 08:50 AM
finally , it's work ...
i change my Script like this
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent");
arguments = intent.Call<string> ("getDataString");
THAN$$anonymous$$ YOU !! It looks like google changed the intent behavior a few times and I couldn't get my hand on an up to date version. Looking at your previous code it looks like we went on the same "stackoverflow path". $$anonymous$$aybe you should rename the question for people trying to do the same. Something like "open custom file extension in unity android app", ID$$anonymous$$ but I think this answer should have way more visibility.
Thank you again, and maybe see you when Google change it again maybe !
Answer by jcmontanez · Jun 01, 2018 at 04:20 PM
Hi all,
In our case we want to get data passing through extras and, after a couple days trying to do this, the way we found to do this was:
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent");
String text = intent.Call<String> ("getStringExtra", "varName");
In our case, we sent the information through a Cordova app and then read it in Unity.
And, the difference with @Zyosoft was in the Java method, because we want a specific value in the extras, no the URI.
Hope this will helps.
Answer by Chopium · Feb 23, 2020 at 07:26 PM
I wanna piggy back on this thread with some extra advice. If you're just setting it up, I recommend trying to post the intent URI to see what you're getting (if anything).
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent");
Debug.Log("intent URI:" + intent.Call<string>("toUri", 0).ToString());
This is what posted to my in app console for reference. A seperate app is launching mine with an int and a string as extras.
URI#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;package=com.MY.APP.IDENTITY;component=com.MY.APP.IDENTITY/com.unity3d.player.UnityPlayerActivity;S.stringVariable1=hello;i.integerVariable1=225500;end
You can see each extra piece of data has a type hint, S for string and i for int.
This was how I parsed an integer, for instance.
int parsedInt = 0;
parsedInt = intent.Call<int>("getIntExtra", new object[] { "YOUR-VARIABLE-NAME", parsedInt };
And parsing a string:
string parsedString = "";
parsedString = intent.Call<String>("getStringExtra", "YOUR-VARIABLE-NAME"));
You'll be calling the methods linked below. You'll want to use the reference to know how to parse each data type. https://developer.android.com/reference/android/content/Intent
Answer by urfx · May 14, 2020 at 10:58 AM
anybody worked on an equivalent to this thread, for iOS share extensions?
Answer by degee147 · Dec 01, 2020 at 02:19 PM
Please see an answer here, It took me a while as well but I figured it out: https://stackoverflow.com/a/65092095/1828990