【问题标题】:Share Image from Memory to Android Unity Game将图像从内存共享到 Android Unity 游戏
【发布时间】:2016-10-08 02:08:19
【问题描述】:

这个问题与之前回答的这个问题Share Image on Android Application from Unity Game有关

我的问题是这样的:

有没有办法在不使用文件的情况下共享图像?我想删除 Android 上的 sd 卡读/写权限。我不是 Java 程序员,所以我花了很长时间让它工作。我的任何尝试都没有取得任何成果。

“程序员”用下面的代码回答了上一个问题,这对我很有用。我基本上想使用变量 imageBytes 而不是文件。这甚至可能吗?

void takeScreenShotAndShare()
{
    StartCoroutine(takeScreenshotAndSave());
}

private IEnumerator takeScreenshotAndSave()
{
    string path = "";
    yield return new WaitForEndOfFrame();

    Texture2D screenImage = new Texture2D(Screen.width, Screen.height);

    //Get Image from screen
    screenImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
    screenImage.Apply();

    //Convert to png
    byte[] imageBytes = screenImage.EncodeToPNG();


    System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/GameOverScreenShot");
    path = Application.persistentDataPath + "/GameOverScreenShot" + "/DiedScreenShot.png";
    System.IO.File.WriteAllBytes(path, imageBytes);

    StartCoroutine(shareScreenshot(path));
}

private IEnumerator shareScreenshot(string destination)
{
    string ShareSubject = "Picture Share";
    string shareLink = "Test Link" + "\nhttps://stackoverflow.com/questions/36512784/share-image-on-android-application-from-unity-game";
    string textToShare = "Text To share";

    Debug.Log(destination);


    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"), textToShare + shareLink);
        intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), ShareSubject);
        intentObject.Call<AndroidJavaObject>("setType", "image/png");
        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("startActivity", intentObject);
    }
    yield return null;
}

Unity3d share image on android

【问题讨论】:

    标签: java unity3d java-native-interface share screenshot


    【解决方案1】:

    字节数组可以直接传递,不需要转成file -> uri -> string

    以下是 java 代码,但您可以轻松地将其转换为 JNI 包装器调用

    Bundle bundle = new Bundle();
    bundle.putByteArray("byteArr", imageBytes); //put byte array to bundle!!!
    Intent intent = new Intent(...);
    intent.putExtra(bundle );
    

    要在另一个活动中检索图像字节数组,请使用以下代码:

    getIntent().getByteArrayExtra("byteArr");
    

    如果将上面的每个函数调用都包装到一个对应的 JNI 函数中,那将非常繁琐。另一方面,您可以:

    • 创建一个android库项目
    • 添加两个静态java函数,一个是saveByteArrayToBundle(...),另一个是getByteArrayFromBundle(...)
    • 将android库编译成aar文件;
    • 然后将 aar 文件放入 Assets/ 文件夹中(实际上任何子文件夹都可以)
    • 然后像在 OP 中那样调用两个静态 java 函数

    如果您需要逐步完成,请参阅以下教程:

    【讨论】:

    • 非常感谢您的快速回答,但我不懂 Java,因此无法轻松翻译。我会尽力而为并回复。
    • 你不需要知道java,你只需用你自己的代码翻译它作为参考。
    • 试一试:
    • 我得到一个 AndroidJavaException: java.lang.ClassNotFoundException: android.net.Bundle。我相信那是我需要使用的课程对吗?也许这在 Unity 中不可用?
    • @JasonHowerslitz 查看我更新的答案和教程链接。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多