为统一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.VAndroid / 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"); }