Accessing Data from a Android java class

I am trying to access what level that has been choosen when starting the Unity application. Unity is started from my (Android java) UnityPlay class. I want to know what button that was pressed to launch Unity to know what scene to load.

The UnityPlay class:

package com.company.project;
    ...
    public class UnityPlay extends UnityPlayerActivity{
    
	public String selectedItem;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
	public String getSelectedItem() {
        selectedItem = "levelname";
		return selectedItem;
		}
}

In Unity a script is created and added to a object:

function Start() {
	yield WaitForSeconds(3.0);
	var jo = new AndroidJavaObject("com.company.project.UnityPlay");
	var level = jo.Call.<String>("getSelectedItem");
	
	Application.LoadLevel(level);
}

As far as I can see the return value of the request is null or a blank String “”.

There are some issues with the code you posted:

  1. Did you update the AndroidManifest.xml with details about your new custom Activity class?
  2. In your Start() method, you are creating a AndroidJavaObject, which means you are attempting to build a new UnityPlay object in Java. What you intent to do is grab the active Activity class and call methods on it.

What you should do is provide some global (e.g: static) access to your UnityPlay class, grab that instance that is already created at startup by Android, and then call the getSelecdtedItem method on it.

In your Activity class, add a new static field:

public static UnityPlay activity;

In your onCreate, initialize this field:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activity = this;
}

Then, in your Unity code:

function Start() {
    yield WaitForSeconds(3.0);
    var jc = new AndroidJavaClass("com.company.project.UnityPlay");
    var activity = jc.GetStatic<AndroidJavaObject>("activity");

    var level = activity.Call.<String>("getSelectedItem");
 
    Application.LoadLevel(level);
}

This is all in theory, i haven’t tested it.