2016-04-09 4 views
0

Я снял снимок экрана в своей игре, когда игрок умирает. У меня есть код для захвата снимка экрана.Share Image на Android-приложении от Unity Game

RenderTexture rt = new RenderTexture (800, 600, 24); 
    MainCamera.targetTexture = rt; 
    Texture2D texture = new Texture2D (800, 600, TextureFormat.RGB24, false); 
    MainCamera.Render(); 
    RenderTexture.active = rt; 
    texture.ReadPixels (new Rect (0, 0, 800, 600), 0, 0); 
    MainCamera.targetTexture = null; 
    RenderTexture.active = null; 
    Destroy (rt); 
    byte[] bytes = texture.EncodeToPNG(); 
    Directory.CreateDirectory (Application.persistentDataPath + "/GameOverScreenShot"); 
    File.WriteAllBytes (Application.persistentDataPath + "/GameOverScreenShot" + "/DiedScreenShot.png", bytes); 

Я получаю сохраненный снимок экрана, используя следующий код.

byte[] bytes = File.ReadAllBytes (Application.persistentDataPath +"/GameOverScreenShot" + "/BirdDiedScreenShot.png"); 

Texture2D texture = new Texture2D (800, 600, TextureFormat.RGB24, false); 
RectOffset tempOffset = new RectOffset (5, 5, 5, 5); 
texture.filterMode = FilterMode.Trilinear; 
texture.LoadImage (bytes); 
Sprite sprite = Sprite.Create (texture, new Rect (0, 0, 800, 400), new Vector2 (0.5f, 0.0f), 2.0f); 
ScreenShot_Image.GetComponent<Image>().sprite = sprite; 

Теперь, я хочу поделиться этим снимком экрана в приложении для Android. Согласно моему исследованию, у меня есть следующий код для этого, но он возвращает пустое изображение.

//instantiate the class Intent 
AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent"); 

//instantiate the object Intent 
AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent"); 

//call setAction setting ACTION_SEND as parameter 
intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND")); 

//instantiate the class Uri 
AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri"); 

//instantiate the object Uri with the parse of the url's file 
string destination = Application.persistentDataPath + "/GameOverScreenShot" + "/DiedScreenShot.png"; 
AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse","file://"+destination); 

//call putExtra with the uri object of the file 
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject); 

//set the type of file 
intentObject.Call<AndroidJavaObject>("setType", "image/*"); 

//instantiate the class UnityPlayer 
AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 

//instantiate the object currentActivity 
AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity"); 

//call the activity with our Intent 
currentActivity.Call("startActivity", intentObject); 

Что я должен изменить в этом? Пожалуйста, помогите, Advance Спасибо

+0

Пробовали ли вы мой ответ? – Programmer

+0

Да, но все же есть одна проблема. Я не могу поделиться простым текстом и изображением вместе. Я думаю, что есть проблема с setType. –

+0

Ваш комментарий об изображении. Вы можете создать для этого еще один вопрос. – Programmer

ответ

3

Просто позвоните takeScreenShotAndShare(), чтобы снять Screen Shot и поделиться им. Если у вас есть изображение, которое вы хотите поделиться, просто позвоните StartCoroutine(shareScreenshot(path)); и пройдите по пути/местоположению изображения. Это поддерживает только png изображений. Для совместного использования JPEG, изменение

intentObject.Call<AndroidJavaObject>("setType", "image/png");

в

intentObject.Call<AndroidJavaObject>("setType", "image/jpeg"); 

Весь код:

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" + "\nhttp://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; 
    }