2016-12-09 11 views
0

アンドロイドアプリのシンプルなプラグインを作成しました。しかし、いくつかの奇妙な理由のために私の機能の呼び出しの結果は常に "偽"です。私のプラグインは、アプリがミュートされているかどうかを知らせるべきです。ここに私のプラグインのコードは次のとおりです。Androidデバイスがミュートされていないか確認してください。

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; 
    } 

} 

そして、私のC#コード:

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

答えて

1

AudioManagerが動作する活性またはコンテキストへの参照を必要とするため、これがあります。

ライン:非があるので

(AudioManager) this.getActivity() 

が無残に失敗する必要があります。現在のアクティビティまたはコンテキストをUnityプラグインから静的関数に送信し、それを呼び出す必要があります。

また、ここではFragmentを拡張することは全く役に立たない。

ThisはをJavaプラグインに送信する方法で、thisはJavaプラグインにActivityを送信する方法です。

この場合は、Contextをプラグインに送信します。

の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"); 

それは働いている。

関連する問題