从Unity脚本调用Android电子邮件意图

时间:2016-05-19 06:25:19

标签: c# android unity3d

我在统一游戏中有一个反馈按钮,如果用户点击它,那么它应该启动一个默认的电子邮件应用程序,主题,电子邮件地址已经填写。我在Android应用程序中做过这个,但是如何从统一调用它?

除此之外,还有其他更好的反馈方法吗?

3 个答案:

答案 0 :(得分:2)

你在做什么是插件。你不需要插件。

您只需发送电子邮件:

即可
void sendEmail(string toEmail, string emailSubject, string emailBody)
{
    emailSubject = System.Uri.EscapeUriString(emailSubject);
    emailBody = System.Uri.EscapeUriString(emailSubject);
    Application.OpenURL("mailto:" + toEmail + "?subject=" + emailSubject + "&body=" + emailBody);
}

要发送,请致电:

sendEmail("example@example.com", "Test", "This is a text\r\nAnother test\r\nAnd another text");

这适用于PC,Android和iOS。我不知道Mac。

现在,如果你仍想使用Android API,你仍然不需要为此制作插件。您可以使用AndroidJavaObject并使用Android API编写电子邮件代码。

private static void SendMail(string subject, string body, bool useHTML)
{
    using (var intentClass = new AndroidJavaClass("android.content.Intent"))
    {
        // intent = new Intent(Intent.ACTION_SEND);
        using (var intentObject = new AndroidJavaObject("android.content.Intent", intentClass.GetStatic<string>("ACTION_SEND")))
        {
            // Setting text type
            if (useHTML)
                // intent.setType("text/html");
                intentObject.Call<AndroidJavaObject>("setType", "text/html");
            else
                // intent.setType("message/rfc822");
                intentObject.Call<AndroidJavaObject>("setType", "message/rfc822");

            // intent.putExtra(Intent.EXTRA_SUBJECT, emailSubject);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), subject);

            // Setting emailBody
            if (useHTML)
            {
                // intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(emailBody));
                using (var html = new AndroidJavaClass("android.text.Html"))
                {
                    var htmlBody = html.CallStatic<AndroidJavaObject>("fromHtml", body);
                    intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), htmlBody);
                }
            }
            else
            {
                intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), body);
            }
            using (var unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
                using (var currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity"))
                {
                    currentActivity.Call("startActivity", intentObject);
                }
            }
        }
    }
}

并称之为SendMail("test", "Message", false);。您可以改进它并为其添加更多功能。最后一个例子是从here解除的。

答案 1 :(得分:1)

@程序员的(本机方法)答案是正确的;但是,当提示用户选择要发送电子邮件的应用程序时,用户很有可能选择电子邮件应用程序以外的其他应用程序;例如WhatsApp。我们不希望这种情况发生。如docs中所述,我们可以确保只向用户显示电子邮件应用程序的方法是使用Intent.ACTION_SENDTOintent.setData(Uri.parse("mailto:")

private void SendMail(string subject, string body)
{
    using (var intentClass = new AndroidJavaClass("android.content.Intent"))
    {
        // intent = new Intent(Intent.ACTION_SEND);
        using (var intentObject = new AndroidJavaObject("android.content.Intent", intentClass.GetStatic<string>("ACTION_SENDTO")))
        {
            //intent.setData(Uri.parse("mailto:"));
            var uriClass = new AndroidJavaClass("android.net.Uri");
            var uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "mailto:");
            intentObject.Call<AndroidJavaObject>("setData", uriObject);

            // intent.putExtra(Intent.EXTRA_SUBJECT, emailSubject);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), subject);
            //intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_EMAIL"), "youremail@abc.xyz");
            string[] email = { "youremail@abc.xyz" };
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_EMAIL"), email);

            // Setting emailBody
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), body);
            using (var unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
                using (var currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity"))
                {
                    currentActivity.Call("startActivity", intentObject);
                }
            }
        }
    }
}

用您要发送电子邮件的电子邮件替换youremail@abc.xyz

问题是,为什么要这么麻烦呢,而不是简单地发送如下所述的电子邮件:

void sendEmail(string toEmail, string emailSubject, string emailBody)
{
    emailSubject = System.Uri.EscapeUriString(emailSubject);
    emailBody = System.Uri.EscapeUriString(emailSubject);
    Application.OpenURL("mailto:" + toEmail + "?subject=" + emailSubject + 
"&body=" + emailBody);
}

您可能想在电子邮件正文中添加HTML或某些非拉丁文本(例如,日语,阿拉伯语)。使用System.Uri.EscapeUriString会使事情变得混乱。在这种情况下,本机方法将是您的选择方法。

答案 2 :(得分:0)

点击按钮,你必须打电话:

  public void OpenActivity()
    {
        var androidJC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var jo = androidJC.GetStatic<AndroidJavaObject>("currentActivity");
        // Accessing the class to call a static method on it
        var jc = new AndroidJavaClass("com.xyz.abc.StartActivity");
        // Calling a Call method to which the current activity is passed
        jc.CallStatic("Call", jo);
    }

}

将其替换为您的活动和包名称

  

var jc = new AndroidJavaClass(&#34; com.xyz.abc.StartActivity&#34;);