danglingPointer
danglingPointer

Reputation: 916

Unity3D - Android Communication?

So I wrote an Android plugin that displays ads in my Unity3D game for Android. I want to make it so that I can turn off and on ads inside my Unity C# code. However, nothing in working.

If I am trying to call the following functions found in com/mycompany/mygame/MainActivity.java:

public void hideAd() {
    adView.setVisibility(View.INVISIBLE);
}   

public void showAd() {
    adView.setVisibility(View.VISIBLE);
}

From my script inside my game:

using UnityEngine;
using System.Collections;

public class callMyPlugin : MonoBehaviour {
    AndroidJavaObject ajo;
    float o = 0f;
    bool ohBool = true;

    void Start() {
        ajo = new AndroidJavaObject("com.mycompany.mygame.MainActivity");
    }

    void Update () {
        ...
        // Touch
        foreach (Touch touch in Input.touches) {
            // Other game code involving screen touch
            ...
            if (touch.phase == TouchPhase.Began) {
                // Call my function
                float touchLoc = Camera.main.ScreenToWorldPoint(touch.position).y;
                if (touchLoc > 0.0f) {
                    if (ohBool) {
                        ajo.Call("hideAd");
                        //hideAd();
                        ohBool = false;
                    } else {
                        ajo.Call("showAd");
                        //showAd();
                        ohBool = true;
                    }
                }

            }
        }
        // More game code
        ...
    }
}

Edit: Here is my manifest if it helps:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.mygame">

  <!-- User permissions -->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATS"/>

  <!-- Application -->
  <application android:icon="@drawable/app_icon" android:label="@string/app_name">

    <!-- Ad Banner -->
    <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    <!-- UnityPlayerAcivity -->
    <activity android:name="com.mycompany.mygame.MainActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <!-- UnityPlayerNativeActivity -->
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <meta-data android:name="android.app.lib_name" android:value="unity" />
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <!-- UnityPlayerProxyActivity -->
    <activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>
    <!-- VideoPlayer -->
    <activity android:name="com.unity3d.player.VideoPlayer"
              android:label="@string/app_name"
              android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
    </activity>

  </application>
</manifest> 

Upvotes: 0

Views: 682

Answers (1)

Stefan Hoffmann
Stefan Hoffmann

Reputation: 3234

First, you are trying to call a static method while your Java methods are non static.

Replace ajo.CallStatic("someMethod") with ajo.Call("someMethod")

Second, by using new AndroidJavaObject("com.mycompany.mygame.MainActivity") you are creating a new instance of MainActivity. We'll handle this in a bit

AndroidJavaClass vs. AndroidJavaObject

AndroidJavaObject will create a new instance of the given class.
AndroidJavaClass will not create a new instance and you can access static methods and fields

Call methods in your current activity

AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject curActivity = playerClass.GetStatic<AndroidJavaObject>("currentActivity");

curActivity.Call("showAd");

Upvotes: 4

Related Questions