Voice SDK crash on Activate (Meta Quest 3)

Hey,

trying to add the Voice SDK in my project.

I’m using the exampe script named VoiceActivationButton:

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* Licensed under the Oculus SDK License Agreement (the "License");
* you may not use the Oculus SDK except in compliance with the License,
* which is provided at the time of installation or download, or which
* otherwise accompanies this software in either electronic or hard copy form.
*
* You may obtain a copy of the License at
*
* https://developer.oculus.com/licenses/oculussdk/
*
* Unless required by applicable law or agreed to in writing, the Oculus SDK
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

using Meta.WitAi;
using Meta.WitAi.Requests;
using UnityEngine;
using UnityEngine.UI;

namespace Taikonauten.Conduit.UX
{
    [RequireComponent(typeof(Button))]
    public class VoiceActivationButton : MonoBehaviour
    {
        // The button to be observed
        private Button _button;
        // The button label to be adjusted with state
        private Text _buttonLabel;

        [Tooltip("Reference to the current voice service")]
        [SerializeField] private VoiceService _voiceService;

        [Tooltip("Text to be shown while the voice service is not active")]
        [SerializeField] private string _activateText = "Activate";
        [Tooltip("Whether to immediately send data to service or to wait for the audio threshold")]
        [SerializeField] private bool _activateImmediately = false;

        [Tooltip("Text to be shown while the voice service is active")]
        [SerializeField] private string _deactivateText = "Deactivate";
        [Tooltip("Whether to immediately abort request activation on deactivate")]
        [SerializeField] private bool _deactivateAndAbort = false;

        // Current request
        private VoiceServiceRequest _request;
        private bool _isActive = false;

        // Get button & label
        private void Awake()
        {
            _buttonLabel = GetComponentInChildren<Text>();
            _button = GetComponent<Button>();
            if (_voiceService == null)
            {
                _voiceService = FindObjectOfType<VoiceService>();
            }
        }
        // Add click delegate
        private void OnEnable()
        {
            RefreshActive();
            if (_button != null)
            {
                _button.onClick.AddListener(OnClick);
            }
        }
        // Remove click delegate
        private void OnDisable()
        {
            _isActive = false;
            if (_button != null)
            {
                _button.onClick.RemoveListener(OnClick);
            }
        }

        // On click, activate if not active & deactivate if active
        private void OnClick()
        {
            if (!_isActive)
            {
                Activate();
            }
            else
            {
                Deactivate();
            }
        }

        // Activate depending on settings
        private void Activate()
        {
            if (!_activateImmediately)
            {
                _request = _voiceService.Activate(GetRequestEvents());
            }
            else
            {
                _request = _voiceService.ActivateImmediately(GetRequestEvents());
            }
        }

        // Deactivate depending on settings
        private void Deactivate()
        {
            if (!_deactivateAndAbort)
            {
                _request.DeactivateAudio();
            }
            else
            {
                _request.Cancel();
            }
        }

        // Get events
        private VoiceServiceRequestEvents GetRequestEvents()
        {
            VoiceServiceRequestEvents events = new VoiceServiceRequestEvents();
            events.OnInit.AddListener(OnInit);
            events.OnComplete.AddListener(OnComplete);
            return events;
        }
        // Request initialized
        private void OnInit(VoiceServiceRequest request)
        {
            _isActive = true;
            RefreshActive();
        }
        // Request completed
        private void OnComplete(VoiceServiceRequest request)
        {
            _isActive = false;
            RefreshActive();
        }

        // Refresh active text
        private void RefreshActive()
        {
            if (_buttonLabel != null)
            {
                _buttonLabel.text = _isActive ? _deactivateText : _activateText;
            }
        }
    }
}

As soon i press the button in an Android build the following happens:
An suggestions?

2023/12/09 09:49:15.841 25324 25349 Info Unity Taikonauten.Conduit.UX.VoiceActivationButton:Activate()
2023/12/09 09:49:15.841 25324 25349 Info Unity UnityEngine.Events.UnityEvent:Invoke()
2023/12/09 09:49:15.841 25324 25349 Info Unity UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
2023/12/09 09:49:15.841 25324 25349 Info Unity UnityEngine.XR.Interaction.Toolkit.UI.UIInputModule:ProcessPointerButton(ButtonDeltaState, PointerEventData)
2023/12/09 09:49:15.841 25324 25349 Info Unity UnityEngine.XR.Interaction.Toolkit.UI.UIInputModule:ProcessTrackedDevice(TrackedDeviceModel&, Boolean)
2023/12/09 09:49:15.841 25324 25349 Info Unity UnityEngine.XR.Interaction.Toolkit.UI.XRUIInputModule:smile:oProcess()
2023/12/09 09:49:15.841 25324 25349 Info Unity 
2023/12/09 09:49:15.850 25324 25349 Error Unity AndroidJavaException: java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference
2023/12/09 09:49:15.850 25324 25349 Error Unity java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference
2023/12/09 09:49:15.850 25324 25349 Error Unity     at android.os.Handler.<init>(Handler.java:257)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at android.os.Handler.<init>(Handler.java:162)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at com.oculus.assistant.api.voicesdk.core.VoiceSDKConnection$1.<init>(VoiceSDKConnection.java:54)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at com.oculus.assistant.api.voicesdk.core.VoiceSDKConnection.<init>(VoiceSDKConnection.java:54)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at com.oculus.assistant.api.voicesdk.logging.PlatformLogger$2.<init>(PlatformLogger.java:57)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at com.oculus.assistant.api.voicesdk.logging.PlatformLogger.<init>(PlatformLogger.java:56)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at com.oculus.assistant.api.unity.logging.UnityPlatformLoggerServiceFragment.createAndAttach(UnityPlatformLoggerServiceFragment.java:53)
2023/12/09 09:49:15.850 25324 25349 Error Unity     at com.oculus.assistant.api.unity.logging.UnityPlatformLoggerServiceFragment.createAndAttach(UnityPlatformLogg

Thanks!

Ok found the issue.

  • Set Android target API 12L
  • Use custom Manifest under Publishing settings
  • Switch to Player Activity instead of Game Activity

Glad you fixed the issue - it seems like you’re using a third-party package provided by Taikonauten - I would recommend contacting them if you have further issues.

Player activity is now unsupported in unity 2023.2+. Is where any way to work with Voice SDK and Game Activity?