Как заставить плагин 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>