2016-09-23 4 views
2

Я работаю над простым плагином. Теперь я пытаюсь добавить свойство вибрировать. Но этот код не работает. Где я иду не так? Мой код выглядит следующим образом. Не могли бы вы мне помочь.Unity3D Vibrate Android

Android:

импорт 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"); 
      } 
     } 
    } 
} 

Кнопка события:

public void vibrate() 
    { 
#if UNITY_ANDROID 

     Bridge.Vibrate(null, null); 

#endif 
    } 

Спасибо заранее ...

+0

Вы получаете любую ошибку в журнале? – Programmer

+0

Проверьте свой манифест для '' –

+0

Я только пробовал на Android. Но приложение не было закрыто. –

ответ

0

Мое решение следующим образом.

Unity:

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

Кроме того, я нашел Manifest.xml пример файла до 1 минуты. Теперь плагин работает.

1

У меня есть решение. Для тех, кто не хочет использовать Java. Вы можете сделать это только с C#.

1.Go в <UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk, скопируйте файл AndroidManifest.xml ваших <ProjectName>Assets\Plugins\Android

2.Now открыть скопированный файл манифеста из <ProjectName>Assets\Plugins\Android и добавить <uses-permission android:name="android.permission.VIBRATE"/> к нему. Сохранить, построить и запустить. Если это проблема разрешения, это должно быть разрешено.

Какой 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> 

Вам даже не нужно писать Java плагин для простой вибрации. Это можно сделать с помощью классов Unity AndroidJavaClass и AndroidJavaObject.

Полный вибрирующий плагин без 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"); 
    } 
} 

Usage:

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(); 
} 
Смежные вопросы