Читайте Android intent дополнительные данные о запуске приложения Unity

я запускаю приложение Unity из другого приложения Android с использованием пользовательского неявного намерения. Это работает нормально, но я не могу понять, как читать дополнительные данные намерения в Unity?

ANDROID НАМЕРЕНИЕ ЗАПУСТИТЬ ПРИЛОЖЕНИЕ UNITY

i=new Intent();
i.setAction("com.company.unityapp.MyMethod");
i.putExtra("KEY","This is the message string");
startActivity(i);

UNITY APP AndroidManifest.в XML

<intent-filter>
     <action android:name="com.company.unityapp.MyMethod" />
     <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

у меня есть GameObject в моей сцене с прикрепленным скриптом. Внутри метода start у меня есть этот код, чтобы попытаться прочитать дополнительные данные, которые были переданы вместе с намерение

AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

AndroidJavaObject intent = currentActivity.Call<AndroidJavaObject>("getIntent");
bool hasExtra = intent.Call<bool> ("hasExtra", "arguments");

if (hasExtra) {
 AndroidJavaObject extras = intent.Call<AndroidJavaObject> ("getExtras");
 arguments = extras.Call<string> ("getString", "arguments");
}

Это не работает, и аргументы всегда пусто. Любая помощь будет оценена.

1 ответов


мне потребовалось довольно много времени, чтобы понять это. Все решения, найденные в интернете, были выполнены лишь частично. Ниже приведено полное решение для запуска приложения Unity из другого приложения android с использованием пользовательского неявного намерения, а также Как получить доступ к дополнительным данным, отправленным с намерением внутри Unity.

для этого вам нужно создать плагин Android, который будет использоваться Unity для доступа к дополнительным данным intent.

ANDROID Плагин:


вам нужно скопировать классы.jar из папки установки Unity в папку плагина android / lib / classes.Джар

public class MainActivity extends UnityPlayerActivity {

  @Override
  protected void onNewIntent(Intent intent) {
      super.onNewIntent(intent);
      handleNewIntent(intent);
  }

  private void handleNewIntent(Intent intent){
      String text = intent.getStringExtra("KEY");
      UnityPlayer.UnitySendMessage("AccessManager","OnAccessToken", text);
  }
}

AndroidManifest.в XML

важно здесь используется имя пакета: com.компания.плагин

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.plugin">
    <application
        android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"
        android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

файл сборки Gradle:

добавьте следующее в файл сборки приложения gradle, чтобы иметь возможность создать .jar для использования с Unity

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
        }
    }       
...
...

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile files('libs/classes.jar')
}

//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

скопируйте созданный AndroidPlugin.банку Unity Assets / Плагины / Android

UNITY APP:


установите идентификатор пакета в PlayerSettings таким же, как и в плагине Android - com.компания.плагин

создать пользовательский AndroidManifest.xml-файл в активах / плагинах / Android

важно здесь использовать то же имя пакета,что и в плагине. Также обратите внимание на имя намерения: com.компания.плагин.do

AndroidManifest.В XML

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.plugin"
      android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />
    <application android:label="@string/app_name">
        <activity android:name=".MainActivity" android:label="@string/app_name"
          android:launchMode="singleTask" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="sensor">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.company.plugin.do" />
                <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

создать сценарий unity назовите AccessManager и прикрепите скрипт к игровому объекту в сцене. OnAccessToken-это метод, который получит сообщение, отправленное из плагина android, и будет содержать дополнительные данные, отправленные из намерения.

public class accessManager : MonoBehaviour {

    public void OnAccessToken(string accessToken)
    {
        Debug.Log("Message Received!!!! :" + accessToken);
    }
}

ANDROID APP:

создайте стандартное приложение для Android, которое запустит приложение Unity и отправит дополнительные данные

public void LaunchUnityApp(){
    Intent i=new Intent();
    i.setAction("com.company.plugin.do");
    i.setType("text/plain");
    i.putExtra("KEY","This is the text message sent from Android");
    startActivity(i);
}