Unity3D-调用Android系统邮件发送邮件,或调用系统分享去分享内容

最近在将项目移植到Android平台,虽然大部分的东西都不需要动,但是关于分享、反馈这类需要用到原生系统功能的,就需要单独去处理了!

其实发送邮件和分享是同样的道理,只是发送邮件的参数不同,最主要代码是这样的:

AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
            AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
            intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
            AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
            AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "file://" + destination);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), "Can you beat my score?");
            intentObject.Call<AndroidJavaObject>("setType", "image/jpeg");
            AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject chooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Share your new score");
            currentActivity.Call("startActivity", chooser);

其实就是利用unity提供的java接口,调用android系统自己的一个分享类,然后设置相关参数即可。

下面是完整代码,要想试试效果,直接把下面的代码复制到一个类里面,然后弄个按钮调用OnShareNative分享,调用OnConnect去调用邮箱

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class NativeShareAndroid : MonoBehaviour {
	public GameObject waitObject;
	private bool isProcessing = false;
	private bool isFocus = false;
	void Awake()
	{
		waitObject.SetActive(false);
	}
	public void OnShareNative(){
		if (!isProcessing){
			StartCoroutine(TakeScreenshot());
		}
	}
	public void OnQuitGame(){
		Application.Quit();
	}
	public void OnConnect(){
		if (!isProcessing){
			StartCoroutine(SendMailAndroid());
		}
	}
	private IEnumerator TakeScreenshot()
	{
		isProcessing = true;
		waitObject.SetActive(true);
        yield return new WaitForEndOfFrame();
		var width = Screen.width;
		var height = Screen.height;
		var tex = new Texture2D(width, height, TextureFormat.RGB24, false);
		tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
		tex.Apply();
        string destination = Path.Combine(Application.persistentDataPath, "shareAndroid001.png");
		File.WriteAllBytes(destination, tex.EncodeToPNG());
        yield return new WaitForSeconds(0.3f);
        if (!Application.isEditor)
        {
            AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
            AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
            intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
            AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
            AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "file://" + destination);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), "Can you beat my score?");
            intentObject.Call<AndroidJavaObject>("setType", "image/jpeg");
            AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject chooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Share your new score");
            currentActivity.Call("startActivity", chooser);
            yield return new WaitForSeconds(1f);
        }
        yield return new WaitUntil(() => isFocus);
        isProcessing = false;
		waitObject.SetActive(false);
	}
	void OnApplicationFocus(bool focusStatus)
	{
		isFocus = focusStatus;	
	}
	private IEnumerator SendMailAndroid(){
		isProcessing = true;
		waitObject.SetActive(true);
		if (!Application.isEditor){
			AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
            AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
            intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
			// AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
            // AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "mailto:pz789asdf@163.com");
            // intentObject.Call<AndroidJavaObject>("setData", uriObject);
			string[] mailto = new string[]{"pz789asdf@163.com"};
			intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_EMAIL"), mailto);
            intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), "[USERFEED]Android Test Feedback");
			intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), "We will get your suggestion!");
            intentObject.Call<AndroidJavaObject>("setType", "plain/text");
            AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject chooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Send your idea!");
            currentActivity.Call("startActivity", chooser);
			yield return new WaitForSeconds(1f);
		}
		yield return new WaitUntil(() => isFocus);
        isProcessing = false;
		waitObject.SetActive(false);
	}
}

我自己测试的机器是华为p9,其他的机型还没试过。

下面是实测截图:





另外,如果邮箱你在系统设置好了,会直接打开邮箱,然后创建一个新邮件,填写好你给出的内容。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏小败在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值