为统一3D创建原生Flashlight Android Java插件
我有一个问题,我不知道如何从Unity访问我的java插件。
这是Java代码:
package fr.vincentmazet.utilslibrary; import android.content.Context; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraManager; import com.unity3d.player.UnityPlayerActivity; public class FlashLight extends UnityPlayerActivity { private CameraManager camManager; private Context context; public void FlashLight(Context context){ this.camManager = (CameraManager) context.getSystemService(context.CAMERA_SERVICE); this.context = context; } public boolean enableFlash(){ try { camManager.setTorchMode("0", true); } catch (CameraAccessException e) { e.printStackTrace(); } return true; } public boolean stopFlash(){ try { camManager.setTorchMode("0", false); } catch (CameraAccessException e) { e.printStackTrace(); } return true; } }
在这里我的c#func:
public bool startFlash(){ if (Application.platform == RuntimePlatform.Android) { using (var javaUnityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { using (var currentActivity = javaUnityPlayer.GetStatic ("currentActivity")) { using (var androidPlugin = new AndroidJavaObject ("fr.vincentmazet.utilslibrary.FlashLight", currentActivity)) { return androidPlugin.Call ("enableFlash"); } } } } return false; }
但是当我进入时它失败了:
var androidPlugin = new AndroidJavaObject ("fr.vincentmazet.utilslibrary.FlashLight", currentActivity)
而且我不知道如何调试,从我的android访问堆栈跟踪。
感谢您的任何想法提前。
而且我不知道如何调试,从我的android访问堆栈跟踪。
自己调试Android插件是必须的。 您可以使用Unity / C#中的 Log.V
和Android / Java端的Debug.Log
来完成此操作。
使用Android Studio中的 Android Monitor查看Unity中的日志和exception日志。
我不知道如何从Unity访问我的java插件
您需要将 Unity 的Context
实例发送到Android插件。 您也不必从UnityPlayerActivity
扩展。 这里完全没必要。
许可 :
Java的:
public class FlashLight{ private CameraManager camManager; static Context myContext; // Called From C# to get the Context Instance public static void receiveContextInstance(Context tempContext) { myContext = tempContext; this.camManager = (CameraManager) myContext.getSystemService(context.CAMERA_SERVICE); } public static boolean enableFlash(){ try { camManager.setTorchMode("0", true); } catch (CameraAccessException e) { e.printStackTrace(); } return true; } public static boolean stopFlash(){ try { camManager.setTorchMode("0", false); } catch (CameraAccessException e) { e.printStackTrace(); } return true; } }
C#:
AndroidJavaClass unityClass; AndroidJavaObject unityActivity; AndroidJavaObject unityContext; AndroidJavaClass customClass; void Start() { //Replace with your full package name sendActivityReference("fr.vincentmazet.utilslibrary.FlashLight"); //Enable Flashlight enableFlash(); //Disable Flashlight //stopFlash(); } void sendActivityReference(string packageName) { unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); unityActivity = unityClass.GetStatic("currentActivity"); unityContext = unityActivity.Call ("getApplicationContext"); customClass = new AndroidJavaClass(packageName); customClass.CallStatic("receiveContextInstance", unityContext); } bool enableFlash() { return customClass.CallStatic("enableFlash"); } bool stopFlash() { return customClass.CallStatic ("stopFlash"); }