gpt4 book ai didi

c# - 在 Unity 应用启动时阅读 Android intent 额外数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:12 24 4
gpt4 key购买 nike

我正在使用自定义隐式 Intent 从另一个 Android 应用程序启动 Unity 应用程序。这工作正常,但我不知道如何在 Unity 中读取 Intent 额外数据?

Android Intent 启动 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>

我的场景中有一个游戏对象,并附有脚本。在 start 方法中,我有这段代码来尝试读取随 Intent 一起传递的额外数据

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

这是行不通的,参数总是空的。任何帮助将不胜感激。

最佳答案

我花了很长时间才弄明白这一点。网上找到的所有解决方案都只是部分完成。以下是使用自定义隐式 Intent 从另一个 android 应用程序启动 Unity 应用程序的完整解决方案,以及如何访问 Unity 内部使用 Intent 发送的额外数据。

为此,您需要创建一个 Android 插件,Unity 将使用该插件访问 Intent 额外数据。

安卓插件:


您需要将Unity安装文件夹中的classes.jar复制到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);
}
}

安卓 list .xml

这里重要的是使用的包名: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 构建文件:

将以下内容添加到应用程序 gradle 构建文件中,以便能够创建与 Unity 一起使用的 .jar

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.jar复制到Unity Assets/Plugins/Android

统一应用程序:


PlayerSettings 中的包标识符设置为与 Android 插件 - com.company.plugin 中设置的相同

在 Assets/Plugins/Android 中创建自定义 AndroidManifest.xml 文件

重要的是使用与插件中相同的 package 名称。还要注意 Intent 名称: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>

创建一个名为 AccessManager 的统一脚本并将脚本附加到场景中的游戏对象。 OnAccessToken 是一种方法,它将接收从 android 插件发送的消息,并将包含从 intent 发送的额外数据。

public class accessManager : MonoBehaviour {

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

安卓应用:

创建一个将启动 Unity 应用程序并发送 Intent 额外数据的标准 Android 应用程序

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

关于c# - 在 Unity 应用启动时阅读 Android intent 额外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com