AndroidJavaClass / AndroidJavaObject, вызывающий сбой встроенного приложения - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть Android-приложение, которое создает и запускает find до введения следующего кода в объект моей сцены. Моя цель состояла в том, чтобы вибрировать в приложении разную длину, а не просто использовать функцию по умолчанию Handheld.Vibrate(). Как только этот код добавлен, мое приложение все еще хорошо собирается на моем устройстве, но падает при запуске.

Я использую Unity 2019.2.9f1, и мой минимальный уровень API установлен на 25, используя Mono и .NET. 2.0.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HapticController : Singleton<HapticController> {

    #if UNITY_ANDROID && !UNITY_EDITOR
        public static AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        public static AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        public static AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
    #else
        public static AndroidJavaClass unityPlayer;
        public static AndroidJavaObject currentActivity;
        public static AndroidJavaObject vibrator;
    #endif

    bool isVibrating;

    ...

    // Update is called once per frame
    void Update()
    {
        if(!isVibrating && ( *other condition* ) ){
            isVibrating = true; //this will later be changed, just trying to get it to vibrate once            
            Vibrate(200);
        }
    }

    public static void Vibrate(long milliseconds)
    {
        if(isAndroid() && vibrator != null){
            print("vibrating");
            vibrator.Call("vibrate", milliseconds);
        } else {
            Handheld.Vibrate();
        }
    }

    private static bool isAndroid()
   {
    #if UNITY_ANDROID && !UNITY_EDITOR
        return true;
    #else
        return false;
    #endif
    }
}

Я знаю, что вызовы AndroidJavaClass / AndroidJavaObject вверху вызывают сбой. Я проверил журналы в logcat в Android Studio, но нет заметных выводов, которые бы имели какое-либо отношение к сбою. Есть ли что-то, что я не учитываю, это может вызвать это?

РЕДАКТИРОВАТЬ: я должен добавить, что я использую SDK (Mapbox), который имеет свой собственный AndroidManifest.xml. Он инструктирует вас переименовать его и переместить в папку плагинов / Android. Вы можете увидеть это здесь:

<!--
Android Manifest for UniAndroid Permission (2016/03/19 sanukin39)

--- if already have AndroidManifest file at Assets/Plugins/Android/ ----
Copy the activity and meta-data sentence to your AndroidManifest.xml

--- if not ---
Rename this file to AndroidManifest.xml and add permission you want to add And move the file to Assets/Plugins/Android

-->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product">
  <application android:icon="@drawable/app_icon" android:label="@string/app_name">
    <activity android:name="net.sanukin.OverrideUnityActivity"
             android:label="@string/app_name"
             android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
  </application>
</manifest>

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Для всех, кто боролся с этим, я смог решить эту проблему с помощью комбинации ответа Фархана, а также сделать следующее:

Вместо инициализации объектов AndroidJavaClass и AndroidJavaObject вверху я создал функцию инициализатораответственность за это. Я добавил строку

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]

над ней, чтобы заставить ее инициализировать их до загрузки сцены. Я не уверен, почему это требуется, но это исправило это для меня. Вы можете увидеть полную функцию ниже:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HapticController : Singleton<HapticController> {

    public static AndroidJavaClass unityPlayer = null;
    public static AndroidJavaObject currentActivity = null;
    public static AndroidJavaObject vibrator = null;

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    private static void Initialize(){
    #if UNITY_ANDROID && !UNITY_EDITOR
        if (Application.platform == RuntimePlatform.Android) {
            unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
            }
    #endif
    }
...
}
0 голосов
/ 01 ноября 2019

Вы должны добавить следующее разрешение на вибрацию в {Местоположение проекта} \ Assets \ Plugins \ Android \ AndroidManifest.xml

<uses-permission android:name="android.permission.VIBRATE"/>

Таким образом, ваш окончательный AndroidManifest станет.

<?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>

...