unity programatically pattern development java android android-studio unity3d plugins

java - programatically - Unity3D Vibrate Android



vibrate is deprecated (2)

Estoy trabajando en un plugin simple. Ahora estoy tratando de agregar una propiedad de vibración. Pero este código no está funcionando. ¿Dónde estoy equivocado? Mi código es el siguiente. Puedes ayudarme por favor.

Androide:

import android.os.Vibrator;

public class Brid { private Context context; private static Brid instance; public Brid() { this.instance = this; } public static Brid instance() { if(instance == null) { instance = new Brid(); } return instance; } public void setContext(Context context) { this.context = context; } public void Vibrate() { Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(100); }

}

Unity3D:

public static void Vibrate(AndroidJavaObject Brid, AndroidJavaObject context) { if (Brid == null) { using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { context = activityClass.GetStatic<AndroidJavaObject>("currentActivity"); } using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.xxx.ultimatemobile.Brid")) { if (pluginClass != null) { Brid = pluginClass.CallStatic<AndroidJavaObject>("instance"); Brid.Call<AndroidJavaObject>("setContext", context); Brid.Call<AndroidJavaObject>("Vibrate"); } } } }

Evento de botones:

public void vibrate() { #if UNITY_ANDROID Bridge.Vibrate(null, null); #endif }

Gracias por adelantado...


Mi solución de la siguiente manera.

Unidad:

using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.xx.ultimatemobile.Brid")) { if (pluginClass != null) { Brid = pluginClass.CallStatic<AndroidJavaObject>("instance"); Brid.Call("setContext", context); context.Call("runOnUiThread", new AndroidJavaRunnable(() => { Brid.Call("Vibrate"); })); } }

Además, encontré el ejemplo del archivo Manifest.xml antes de 1 minuto. Ahora el complemento está funcionando.


Veo que tienes una solución. Para aquellos que no quieren usar Java. Puede hacer esto solo desde C #.

1.Vaya a <UnityInstallationDirecory>/Editor/Data/PlaybackEngines/AndroidPlayer/Apk , copie el archivo AndroidManifest.xml a su <ProjectName>Assets/Plugins/Android

2.Ahora abra el archivo Manifest copiado desde <ProjectName>Assets/Plugins/Android y agregue <uses-permission android:name="android.permission.VIBRATE"/> a él. Guardar, compilar y ejecutar. Si esto es un problema de permiso, ahora debería resolverse.

Cómo debería ser su AndroidManifest.xml (Unity 5.4):

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.VIBRATE"/> <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>

Ni siquiera necesita escribir el plugin de Java para una vibración simple. Esto se puede hacer con las clases AndroidJavaClass y AndroidJavaObject de Unity.

Complete Vibration Plugin sin Java.

using UnityEngine; using System.Collections; public class Vibrate { public AndroidJavaClass unityPlayer; public AndroidJavaObject currentActivity; public AndroidJavaObject sysService; public void Vibrate() { unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); sysService = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator"); } //Functions from https://developer.android.com/reference/android/os/Vibrator.html public void vibrate() { sysService.Call("vibrate"); } public void vibrate(long milliseconds) { sysService.Call("vibrate", milliseconds); } public void vibrate(long[] pattern, int repeat) { sysService.Call("vibrate", pattern, repeat); } public void cancel() { sysService.Call("cancel"); } public bool hasVibrator() { return sysService.Call<bool>("hasVibrator"); } }

Uso :

Vibrate vibrate = new Vibrate(); if (vibrate.hasVibrator()) { //Vibrate vibrate.vibrate(); //Vibrate for 500 milliseconds vibrate.vibrate(500); // Start without a delay // Vibrate for 200 milliseconds // Sleep for 2000 milliseconds long[] pattern = { 0, 200, 2000 }; vibrate.vibrate(pattern, 0); //Cancel Vibration vibrate.cancel(); }