Как заставить плагин Android общаться с приемником трансляции с Unity Scrpit

Я пытаюсь создать новый плагин для Android Java для использования в моем приложении, которое я сделал в Unity для управления GameObject,

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

Для этого я сделал Android Java плагин с двумя .java файлы. Первый (PluginExample.java) является продолжением UnityPlayerActivity где метод OnCreate, Метод OnDestroy (важно отменить регистрацию речевого клиента). И последний метод для вызова метода Unity. Идея этого сценария состоит в том, чтобы создать все экземпляры при запуске приложения и вызвать метод в моем C# сценарии.

Другой .java Сценарий называется речь и тот, который создает голосовой клиент, вставить фразу и вызывает ChangeValue() метод, когда фраза распознается.

Я также сделал в Unity простое приложение с дополненной реальностью, которое показывает куб при распознавании изображения. Там всего 4 GameObjects, AR-камера, Image Target, дети-кубы Image Target и SpeechPlugin, в которых есть мой скрипт C#, О C# код:

Идея заключается в том, чтобы получить GameObject Куб Появляется и исчезает при получении намерения с помощью голосовой команды в speech.java скрипт. Прямо сейчас единственное, что я получаю, это куб, который появляется, когда изображение распознается, но не голосовая команда, и я включил всплывающее окно для всплывающего окна в коде, когда оно достигает некоторых сегментов для отладки (я пытался проверить logcat, но у меня было понятия не имел, что там происходит) и ни один не появился.

Если у кого-то есть идеи, где я пропустил важную строку кода, если я неправильно понял всю идею, любые советы о том, как планировать свою программу... Любая помощь приветствуется ^^.

PluginExample.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Create the voice command receiver class
    mspeech = new speech(this);
}

/**
 * Unregister from the speech SDK
 */
@Override
protected void onDestroy() {
    mspeech.unregister();
    super.onDestroy();
}

public void ChangeValue() {
    if (TorF) {
        TorF = false;
        UnityPlayer.UnitySendMessage("SpeechPlugin", "changeValue", "False");
        Log.i("State_of_value", "False");
    } else {
        TorF = true;
        UnityPlayer.UnitySendMessage("SpeechPlugin", "changeValue", "True"); //sends "True" to changevalue() in SpeechPlugin.cs.
        Log.i("State_of_value", "True");
    }
}

speech.java

public class speech  extends BroadcastReceiver {
// Voice command substitutions. These substitutions are returned when  phrases are recognized.
// This is done by registering a phrase with a substition. This eliminates localization issues
// and is encouraged
final String PHRASE_RECEIVED = "validar";
final String LOG_TAG = "VoiceSample";

private PluginExample mPluginExample;

/**
 * Constructor which takes care of all speech recognizer registration
 * @param iActivity MainActivity from which we are created
 */
public speech(PluginExample iActivity)
{
    mPluginExample = iActivity;
    mPluginExample.registerReceiver(this, new IntentFilter(VuzixSpeechClient.ACTION_VOICE_COMMAND));
    Log.d(LOG_TAG, "Connecting to M300 SDK");

    try {
        VuzixSpeechClient sc = new VuzixSpeechClient(iActivity); // Creates a VuzixSpeechClient. Needs an activity as a parameter.
        sc.insertPhrase("validar", PHRASE_RECEIVED); //Phrase that we insert in the voice command list and the phrase we receive when the phrase is recognized.

        Log.i(LOG_TAG, sc.dump());// See what we've done

    } catch(NoClassDefFoundError e) {
        // We get this exception if the SDK stubs against which we compiled cannot be resolved
        // at runtime. This occurs if the code is not being run on an M300 supporting the voice
        // SDK
        // En caso de error nos aparece lo siguiente.
        Toast.makeText(iActivity, "Voice SDK only runs on Vuzix M300 version 1.2.2 or higher", Toast.LENGTH_LONG).show();
        Log.e(LOG_TAG, "Voice SDK only runs on Vuzix M300 version 1.2.2 or higher");
        Log.e(LOG_TAG, e.getMessage());
        e.printStackTrace();
        iActivity.finish();
    } catch (Exception e) {
        Log.e(LOG_TAG, "Error setting custom vocabulary: " + e.getMessage());
        e.printStackTrace();
    }
}

/**
 * @param context Context in which the phrase is handled
 * @param intent Intent associated with the recognized phrase
 */
// On receive is called when a voice command is listened and sends the context and an intent
@Override
public void onReceive(Context context, Intent intent)
{

    if (intent.getAction().equals(VuzixSpeechClient.ACTION_VOICE_COMMAND)) //If a phrase is recognized it gives back ACTION_VOICE_COMMAND.
    {
        Bundle extras = intent.getExtras(); //Get what is in the intent
        if (extras != null) //Si tenemos extras o por el contrario esta vacio.
        {
            Toast.makeText(context,"Tenemos Extras",Toast.LENGTH_LONG).show();
            if (extras.containsKey(VuzixSpeechClient.PHRASE_STRING_EXTRA)) //Comprobamos que el mensaje recibido es un PHRASE_STRING
            {
                Toast.makeText(context,"PHASE_STRING_EXTRA true",Toast.LENGTH_LONG).show();
                String phrase = intent.getStringExtra(VuzixSpeechClient.PHRASE_STRING_EXTRA);
                if (phrase.equals(PHRASE_RECEIVED)) //If the phrase is equals to the one we inserted go to method ChangeValue.
                {
                    Toast.makeText(context,"ChangeValue",Toast.LENGTH_LONG).show();
                    mPluginExample.ChangeValue();
                } else { // En caso de que no, error.
                    Log.e(mPluginExample.LOG_TAG, "Phrase not handled");
                }
            } //else if (extras.containsKey(VuzixSpeechClient.RECOGNIZER_ACTIVE_BOOL_EXTRA)) {
                // if we get a recognizer active bool extra, it means the recognizer was
                // activated or stopped
               // boolean isRecognizerActive = extras.getBoolean(VuzixSpeechClient.RECOGNIZER_ACTIVE_BOOL_EXTRA, false);
                //mPluginExample.RecognizerChangeCallback(isRecognizerActive);
            //}
        }
    }
}

/**
 * Called to unregister for voice commands.
 */
public void unregister() {
    try {
        mPluginExample.unregisterReceiver(this);
        Log.i(LOG_TAG, "Custom vocab removed");
        mPluginExample = null;
    }catch (Exception e) {
        Log.e(LOG_TAG, "Custom vocab died " + e.getMessage());
    }
}

}

speechplugin.cs

public class SpeechPlugin : MonoBehaviour {

public GameObject cube;

void Start () {
        cube = GameObject.Find("/ImageTarget/Cube");
}

void changeValue(string value) {
    if (value == "True")
    {
        Appears();
    }
    else if (value == "False")
    {
        Dissapear();
    }
}

void Dissapear(){
    cube.SetActive(false);//gameobject setActive(false)
}

void Appears(){
    cube.SetActive(true);//gameobject setActive(true)
}
}

AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ancaslo3.speechtest" android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="23"/>

    <application android:label="@string/app_name">
        <activity android:name=".PluginExample" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

0 ответов

Другие вопросы по тегам