【问题标题】:How to start an Android activity from a Unity Application?如何从 Unity 应用程序启动 Android 活动?
【发布时间】:2012-04-21 14:20:42
【问题描述】:

我知道这似乎是一个微不足道的问题,但我在互联网上的任何地方都找不到任何具体的答案。我在 stackoverflow 上看到了这个非常相似的问题:How to start Unity application from android activity? 但这与我的问题完全相反。此外,android Activity 必须能够接收来自 Unity 应用程序的一些输入字符串,就像使用带有行参数的 system() 调用在 PC 上启动另一个程序一样。

以下是我在 Android 上的测试 Unity 应用的测试按钮事件处理程序的代码:

private void ExternalAppCallHandler()
{
    if(Application.platform == RuntimePlatform.WindowsEditor)
    {
        Process.Start(@"C:\Program Files (x86)\Notepad++\notepad++.exe");
    }
    else if(Application.platform == RuntimePlatform.Android)
    {
        Process.Start("Internet");
    }
}

当我使用 Unity Editor 进行测试时,当我点击测试按钮时,应用程序成功打开 Notepad++.exe。但是,当我尝试在三星 Galaxy S2 设备上打开“互联网”应用程序时,它失败了。有谁知道为什么会这样?使用 Process.Start 打开另一个 Android 应用程序的正确字符串应该是什么?

【问题讨论】:

  • 我很难过没有人能帮我解决这个问题......
  • 我找到了两种方法来做到这一点:1。扩展 UnityPlayerActivity 或 2. 创建一个启动另一个活动的 Android Native 插件。我已经多次尝试方法 1,但它总是以强制关闭的情况结束。希望方法 2 对我有用。
  • 我有同样的问题。我们是否可以在统一内调用另一个移动设备中的 android 应用程序?例如录音机,录像机,......我想在我的统一应用程序中调用录音机并记录用户的声音。这可能吗?

标签: c# android mono unity3d interprocess


【解决方案1】:

试试这个 将此 Launch() 方法更改为静态并传递 Android java 对象,即。像下面这样“jo”。

AndroidJavaClass androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo= androidJC.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass jc = new AndroidJavaClass("package_name.Ur_Actvity_Name");
jc.CallStatic("Launch",jo);`

并将 Launch() 方法更改为:

public static Launch(Activity activity)
{
 Intent myIntent = new Intent();
 activity.startActivity(myIntent);
}

希望它会有所帮助。

【讨论】:

    【解决方案2】:

    我对 Unity 不是很熟悉,但有相当多的 Android 经验。所以把我的回答当作一个建议,而不是一个权威的答案。

    查看 Launching an Android application from within Unity,您可以尝试以下操作:

    按照Integrating Unity with Eclipse 上的指南进行操作。

    将第一步创建的Java文件修改如下:

    package com.Unity3D.EclipseIntegration;
    
    import android.os.Bundle;
    
    import com.unity3d.player.UnityPlayerActivity;
    
    public class EclipseIntegration extends UnityPlayerActivity {
    
        private Intent myIntent;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //Assuming that we want to launch the browser to browse a website
            Uri uri = Uri.parse("http://www.google.com");
            myIntent= new Intent(Intent.ACTION_VIEW, uri);
        }
    
        public void Launch()
        {       
            startActivity(myIntent);
        }
    }
    

    并修改您的 Unity 代码:

    private void ExternalAppCallHandler()
    {
        if(Application.platform == RuntimePlatform.WindowsEditor)
        {
            Process.Start(@"C:\Program Files (x86)\Notepad++\notepad++.exe");
        }
        else if(Application.platform == RuntimePlatform.Android)
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("Launch");
        }
    }
    

    如果您遇到任何问题,请发布 LogCat 消息。

    【讨论】:

    • 实际上,我已经尝试过类似于您建议的方法,但没有使用 Eclipse 集成。它来自扩展 UnityPlayerActivity Java 代码部分下unity3d.com/support/documentation/Manual/PluginsForAndroid.html 中的示例。尝试直接使用 Javac 编译并使用 classes.jar 添加扩展类以创建 Extended.jar。我什至达到了可以成功构建 apk 文件的阶段,但是当我在 Android 设备上运行它时,会发生强制关闭。一直在努力弄清楚输入的 AndroidManifest.xml 文件有什么问题。
    • 尝试 Eclipse 集成是否需要大量工作?正如我所说,我不熟悉 Unity 框架,因此我很难理解您可能面临哪些问题。此外,如果可能,请粘贴 LogCat 消息以进行强制关闭。
    • Rajesh:我会将您的答案标记为正确,因为它们看起来最接近我想要的。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2016-12-09
    • 2012-06-22
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多