7

Ich starte eine Unity-Anwendung von einer anderen Android-Anwendung mit einer benutzerdefinierten impliziten Absicht. Das funktioniert einwandfrei, aber ich kann nicht herausfinden, wie die zusätzlichen Daten in Unity gelesen werden sollen.Lesen Sie zusätzliche Daten von Android Intent für den Start der Unity-App

ANDROID INTENT starten UNITY APP

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> 

Ich habe einen Gameobject in meiner Szene mit einem Skript angebracht. Innerhalb der Start-Methode habe ich diesen Code, um die zusätzlichen Daten, um zu versuchen und zu lesen, die zusammen mit der Absicht

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"); 
} 

Dies funktioniert nicht und Argumente sind immer leer übergeben wurden. Jede Hilfe wäre willkommen.

Antwort

9

Ich brauchte einige Zeit, um das herauszufinden. Alle online gefundenen Lösungen waren nur teilweise vollständig. Im Folgenden finden Sie die vollständige Lösung zum Starten einer Unity-Anwendung von einer anderen Android-Anwendung mit einer benutzerdefinierten impliziten Absicht und darüber hinaus, wie Sie auf die zusätzlichen Daten zugreifen können, die mit der Absicht in Unity gesendet wurden.

Um dies zu erreichen, müssen Sie ein Android-Plugin erstellen, das von Unity für den Zugriff auf zusätzliche Daten verwendet wird.

ANDROID PLUGIN:


Sie müssen die classes.jar von Unity Installationsordner auf den Android Plugin-Ordner /lib/classes.jar

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

kopieren

Wichtig hier ist der Paketname verwendet: com.company.plugin

<?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 bauen Datei:

Folgendes der App gradle Build-Datei hinzufügen Lage sein, eine .jar zu schaffen, mit 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) 

Kopieren Sie die erstellte AndroidPlugin.jar zur Einheit Assets verwendet werden/Plugins/Android

UNITY APP:


die Bündel-Kennung im Player Set Einstellungen die gleiche wie Set im Android Plugin sein - com.company.plugin

Erstellen von benutzerdefiniertem AndroidManifest.xml Datei in Assets/Plugins/Android

hier Wichtig ist die gleichen Paketnamen in dem verwendeten zu verwenden Plugin. Beachten Sie auch den Intent-Namen: com.company.plugin.do

AndroidManifest.XML

Erstellen Sie ein Unity-Skript mit dem Namen AccessManager, und hängen Sie das Skript an ein Spielobjekt in der Szene an. OnAccessToken ist die Methode, die die vom Android-Plugin gesendete Nachricht empfängt und die zusätzlichen Daten enthält, die von der Absicht gesendet werden.

public class accessManager : MonoBehaviour { 

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

ANDROID APP:

Erstellen Sie eine Standard-Android-Anwendung, die die Unity Application starten wird und die Absicht zusätzliche Daten

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); 
} 
+0

Hey Hardy, Danke für die kurze Erklärung. Ich habe die ganze Prozedur verfolgt. Native App startet die Unity App, kann die Nachricht jedoch nicht abrufen. Und was könnte ich falsch machen? –