2016-12-09 2 views
0

Android 앱을위한 간단한 플러그인을 만들었습니다. 그러나 어떤 이상한 이유 때문에 내 기능을 호출 한 결과는 항상 "거짓"입니다. 내 플러그인이 앱에 알리미가 있는지 알려야합니다.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# 코드 : 여기 내 플러그인의 코드가 AudioManager이 작동하는 활동 또는 컨텍스트에 대한 참조를 필요로하기 때문에

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

답변

1

이입니다.

라인 : 비 있기 때문에

(AudioManager) this.getActivity() 

가 비참하게 실패한다. 유니티 플러그인의 현재 활동 또는 컨텍스트를 정적 함수로 보내야합니다. 그러면 호출 할 수 있습니다.

또한 여기서 Fragment을 확장하는 것은 완전히 쓸모가 없습니다.

This 자바 플러그인에 Context를 보내고 this 자바 플러그인에 Activity을 보내는 방법입니다 방법입니다.

이 경우에는 Context을 플러그인에 보내 드리겠습니다.

자바 :

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

그것은 작동합니다.

관련 문제