【问题标题】:AndroidJavaClass/AndroidJavaObject causing built application to crashAndroidJavaClass/AndroidJavaObject 导致构建的应用程序崩溃
【发布时间】:2020-02-27 08:51:39
【问题描述】:

我有一个 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 调用。我在 Android Studio 中检查了 logcat 中的日志,但没有明显的输出与崩溃有关。有什么我没有考虑到的会导致这种情况吗?

编辑:我应该补充一点,我正在使用具有自己的 AndroidManifest.xml 的 SDK(Mapbox)。它指示您重命名它并将其移动到 Plugins/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>

【问题讨论】:

    标签: c# android unity3d mapbox android-native-library


    【解决方案1】:

    您应该在{Project location}\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>
    

    【讨论】:

    • 谢谢你。 1) 我的印象是,在 Handheld.Vibrate() 中包含一行代码会导致 Unity 自动将这些权限包含在其生成的清单中。不是这样吗? 2) 我的项目中实际上没有 Plugins/Android 目录。我正在使用一个似乎在其子文件夹中有自己的 AndroidManifest 的 SDK(Mapbox),我现在已将其添加到我的原始帖子中。我复制了它并将其移动到 Plugins/Android(它说你应该这样做),并在其中添加了振动权限行。不幸的是,一旦应用构建并启动,它仍然会崩溃。
    • 对于您的问题 #1:我不确定,可能是 unity 会自动执行此操作。问题#2:如果您在 Assets/Plugins/Android 目录中没有 AndroidManifest.xml,那么您可以手动创建 Plugins/Android 目录并将 AndroidManifest.xml 放在那里(您可以在任何编辑器中复制粘贴上面发布的 xml 并保存文件名称为 AndroidManifest.xml)。如果不想手动创建 Assets/Plugins/Android 目录和 Androidmanifest.xml,也可以在 Mapbox 的 AndroidManifest.xml 中添加权限。
    【解决方案2】:

    对于其他为此苦苦挣扎的人,我可以结合 Farhan 的回答并执行以下操作来解决这个问题:

    我没有在顶部初始化 AndroidJavaClass 和 AndroidJavaObjects,而是创建了一个初始化函数来负责执行此操作。我加了一行

    [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
        }
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2016-06-04
      • 2011-08-24
      • 2014-05-03
      相关资源
      最近更新 更多