2016-12-09 4 views
0

Ich habe ein einfaches Plugin für Android-Apps erstellt. Aber aus irgendeinem seltsamen Grund ist das Ergebnis des Aufrufs meiner Funktion immer "falsch". Mein Plugin sollte die App darüber informieren, ob das Telefon stummgeschaltet ist oder nicht. Hier ist der Code meiner Plugin:Überprüfen, ob das Android-Gerät stummgeschaltet ist

import android.app.Fragment; 
import android.content.Context; 
import android.media.AudioManager; 

public class AndroidMuteCtrl extends Fragment { 

    public static String debugThis() 
    { 
     return "Test message from AndroidMuteCtrl plugin."; 
    } 

    public boolean isMuted() 
    { 
     AudioManager audio = (AudioManager) this.getActivity().getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 
     if (audio.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) return false; 
     else return true; 
    } 

} 

Und mein C# -Code:

//... 
AndroidJavaClass pluginClass = new AndroidJavaClass("com.overly.mutecontrol.AndroidMuteCtrl"); 
//... 
bool isMuted = pluginClass.Call<bool>("isMuted"); // ALWAYS FALSE 
//... 

Antwort

1

Dies liegt daran, AudioManager einen Verweis auf Aktivität oder Kontext erfordert zu arbeiten.

Die Linie:

(AudioManager) this.getActivity() 

sollte kläglich scheitern, da es nicht ist. Sie müssen die aktuelle Aktivität oder den aktuellen Kontext vom Unity-Plugin an eine statische Funktion senden, dann können Sie diese aufrufen.

Auch hier ist es unnötig, Fragment hier zu erweitern.

This ist, wie Context zu Java-Plugin zu senden und this ist, wie Activity zu Java-Plugin zu senden.

In diesem Fall werde ich Context an das Plugin senden.

Java:

public final class AndroidMuteCtrl{ 

    static Context myContext; 
    // Called From C# to get the Context Instance 
    public static void receiveContextInstance(Context tempContext) { 
     myContext = tempContext; 
    } 

    public static String debugThis() 
    { 
     return "Test message from AndroidMuteCtrl plugin."; 
    } 

    public static boolean isMuted() 
    { 
     AudioManager audio = myContext.getSystemService(Context.AUDIO_SERVICE); 
     if (audio.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) return false; 
     else return true; 
    } 
} 

C#:

AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity"); 
AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext"); 

AndroidJavaClass pluginClass = new AndroidJavaClass("com.overly.mutecontrol.AndroidMuteCtrl"); 
//Send the Context 
pluginClass.CallStatic("receiveContextInstance", unityContext); 
bool isMuted = pluginClass.CallStatic<bool>("isMuted"); 

Diese in den Editor eingegeben wurde direkt und nicht geprüft wird, so kann man es ein wenig ändern müssen, um zu bekommen es funktioniert.

Verwandte Themen