最近在将项目移植到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,其他的机型还没试过。
下面是实测截图:
另外,如果邮箱你在系统设置好了,会直接打开邮箱,然后创建一个新邮件,填写好你给出的内容。