2016-03-19 12 views
7

Sto lanciando un'applicazione Unity da un'altra applicazione Android utilizzando un intento implicito personalizzato. Funziona bene, ma non riesco a capire come leggere i dati extra di intento in Unity?Lettura di dati aggiuntivi di intent Android sull'app di Unity

INTENTI ANDROID PER LANCIARE L'UNITÀ 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> 

Ho un GameObject nella mia scena con uno script allegato. All'interno del metodo start ho questo codice per cercare di leggere i dati in più che è stato passato insieme con l'intento

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

Questo non funziona e argomenti è sempre vuoto. Qualsiasi aiuto sarebbe apprezzato.

risposta

9

Mi ci è voluto un po 'di tempo per capirlo. Tutte le soluzioni trovate online erano solo parzialmente complete. Di seguito è riportata la soluzione completa per il lancio di un'applicazione Unity da un'altra applicazione Android utilizzando un intento implicito personalizzato e anche come accedere ai dati aggiuntivi inviati con l'intento all'interno di Unity.

Per fare ciò è necessario creare un plug-in Android che verrà utilizzato da Unity per accedere ai dati extra di intent.

PLUGIN ANDROID:


È necessario copiare il classes.jar dalla cartella di installazione Unità nella cartella plugin di Android /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

Importante è il nome del pacchetto utilizzato: 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 build:

Aggiungere il seguente al file Gradle costruire app per essere in grado di creare un .jar per essere usato con 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) 

Copiare il creato AndroidPlugin.jar ad Attività Unity/Plugins/Android

UNITA APP:


Impostare l'identificatore fascio in Player Impostazioni di essere lo stesso impostato nel Plugin Android - com.company.plugin

creare il file AndroidManifest.xml personalizzato in attività/Plugins/Android

importante qui è di utilizzare lo stesso nome del pacchetto, come utilizzato nella collegare. Nota anche il nome dell'intenzione: com.company.plugin.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> 

Creare uno script di nome dell'unità AccessManager e allegare lo script per un oggetto di gioco nella scena. OnAccessToken è il metodo che riceverà il messaggio inviato dal plugin Android e conterrà i dati aggiuntivi inviati dall'intento.

public class accessManager : MonoBehaviour { 

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

ANDROID APP:

Creare un'applicazione standard Android che lancerà l'applicazione Unità e inviare i dati aggiuntivi intenti

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, grazie per la breve spiegazione. Ho seguito l'intera procedura. L'app nativa avvia l'app Unity ma non riesce a ottenere il messaggio. E idea cosa potrei fare di sbagliato? –

Problemi correlati