2017-06-26 1 views
0

Il prend la capture d'écran, mais ne montre pas dans la galerie. la capture d'écran est enregistré android/data/com.company.name/file.name mais je veux l'enregistrer directement à la galerie avec le nom de fichier capture d'écranCapture d'écran d'économie d'android galeria par jeu

Jusqu'à présent, voici mon code est:

public void Capture() 
{ 
    string filename = System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); 
    Application.CaptureScreenshot(filename + ".jpg"); 
    Debug.Log("captured screenshot"); 
} 
+0

Je ne pense pas que l'unité peut accéder à la galerie. Vous devez d'abord ajouter l'autorisation dans le manifeste, puis utiliser du code natif Android en passant un tableau d'octets de Unity à natif. – Everts

+0

oui je fixe dans un cadre de lecture, mon problème est qu'il ne semble pas galeria .. Je suis tout à fait noob, quelqu'un plz partager un peu de code pour essayer –

Répondre

3

Recherchez la réponse fournie here (le second). Cela fonctionne parfaitement.

Voici le code final:

protected const string MEDIA_STORE_IMAGE_MEDIA = "android.provider.MediaStore$Images$Media"; 
protected static AndroidJavaObject m_Activity; 

protected static string SaveImageToGallery(Texture2D a_Texture, string a_Title, string a_Description) 
{ 
    using (AndroidJavaClass mediaClass = new AndroidJavaClass(MEDIA_STORE_IMAGE_MEDIA)) 
    { 
     using (AndroidJavaObject contentResolver = Activity.Call<AndroidJavaObject>("getContentResolver")) 
     { 
      AndroidJavaObject image = Texture2DToAndroidBitmap(a_Texture); 
      return mediaClass.CallStatic<string>("insertImage", contentResolver, image, a_Title, a_Description); 
     } 
    } 
} 

protected static AndroidJavaObject Texture2DToAndroidBitmap(Texture2D a_Texture) 
{ 
    byte[] encodedTexture = a_Texture.EncodeToPNG(); 
    using (AndroidJavaClass bitmapFactory = new AndroidJavaClass("android.graphics.BitmapFactory")) 
    { 
     return bitmapFactory.CallStatic<AndroidJavaObject>("decodeByteArray", encodedTexture, 0, encodedTexture.Length); 
    } 
} 

protected static AndroidJavaObject Activity 
{ 
    get 
    { 
     if (m_Activity == null) 
     { 
      AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
      m_Activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); 
     } 
     return m_Activity; 
    } 
} 

Et vous appelez simplement:

string path = SaveImageToGallery(picture, "Test Picture", "This is a description."); 

EDIT: Puisque vous semblez vraiment nouveau à l'unité, je vous suggère de l'apprendre d'abord. Quoi qu'il en soit, voici comment vous pouvez appeler le code ci-dessus:

public void CaptureScreenshot() 
{ 
    StartCoroutine(CaptureScreenshotCoroutine(Screen.width, Screen.height)); 
} 

private IEnumerator CaptureScreenshotCoroutine(int width, int height) 
{ 
    yield return new WaitForEndOfFrame(); 
    Texture2D tex = new Texture2D(width, height); 
    tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); 
    tex.Apply(); 

    yield return tex; 
    string path = SaveImageToGallery(tex, "Name", "Description"); 
    Debug.Log("Picture has been saved at:\n" + path); 
} 

Il suffit d'ajouter ces deux méthodes à votre code et appelez la CaptureScreenshot() soit à partir d'un autre script, un bouton de l'unité, ou toute autre chose ...

espérons que cela aide,

+1

Ceci est le code C# ici. Le code Java est contenu dans les méthodes utilisées et vous ne pouvez pas le voir. – Everts

+0

je ne peux pas l'appeler .. je l'ai fait CaptureScreen public void() { string path = SaveImageToGallery (image, "Test de l'image", "Ceci est une description."); } –

+0

dois-je joindre ce script à la caméra principale, puis sur mon bouton ajouter un événement déclencheur attachant le camra, puis quoi ?? –