ImaageQ_Unity_App/Assets/Rendering/Scripts/ShareScreenshotButton.cs
Ignacio Gómez Puga 5847d844a5 Removed TOTU 103
2025-03-04 12:04:52 -06:00

197 lines
7.6 KiB
C#

using System;
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Android;
using UnityEngine.UI;
public class ShareScreenshotButton : MonoBehaviour
{
public Button screenshotButton;
private string fileName;
// Start is called before the first frame update
void Start()
{
if (!AndroidVersionIs11OrAbove() && !Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
// Si no tiene permisos, solicitarlos
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
}
// Asignar la función al evento onClick del botón
screenshotButton.onClick.AddListener(TakeScreenshotAndShare);
}
public void CheckPermissions()
{
// Este método puede ser llamado en cualquier momento para verificar permisos
if (Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
Debug.Log("Permiso concedido para escribir en almacenamiento.");
}
else
{
Debug.Log("Permiso denegado para escribir en almacenamiento.");
}
}
public void TakeScreenshotAndShare()
{
fileName = "Screenshot_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".png";
// Iniciar la rutina para capturar y compartir la pantalla
StartCoroutine(CaptureAndShareScreenshot());
}
private IEnumerator CaptureAndShareScreenshot()
{
// Esperar al final del frame para asegurarse de que todo esté dibujado
yield return new WaitForEndOfFrame();
// Tomar la captura de pantalla y guardarla en la carpeta temporal del dispositivo
Texture2D screenshot = new(Screen.width, Screen.height, TextureFormat.RGB24, false);
screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
screenshot.Apply();
byte[] imageBytes = screenshot.EncodeToPNG();
if (AndroidVersionIs11OrAbove())
{
SaveImageToGalleryAndShare(imageBytes, fileName);
}
else
{
SaveImageToExternalStorageAndShare(imageBytes, fileName);
}
}
private bool AndroidVersionIs11OrAbove()
{
return (Application.platform == RuntimePlatform.Android && SystemInfo.operatingSystem.StartsWith("Android OS") && int.Parse(SystemInfo.operatingSystem.Split(' ')[2]) >= 11);
}
// Guardar en MediaStore (Android 11 o superior) y compartir
private void SaveImageToGalleryAndShare(byte[] imageBytes, string fileName)
{
try
{
AndroidJavaClass mediaStoreClass = new("android.provider.MediaStore$Images$Media");
AndroidJavaObject contentResolver = GetContentResolver();
AndroidJavaObject contentValues = new("android.content.ContentValues");
contentValues.Call("put", "title", fileName);
contentValues.Call("put", "mime_type", "image/png");
contentValues.Call("put", "relative_path", "Pictures/Screenshots");
AndroidJavaObject uri = contentResolver.Call<AndroidJavaObject>("insert", mediaStoreClass.GetStatic<AndroidJavaObject>("EXTERNAL_CONTENT_URI"), contentValues);
if (uri != null)
{
AndroidJavaObject outputStream = contentResolver.Call<AndroidJavaObject>("openOutputStream", uri);
outputStream.Call("write", imageBytes);
outputStream.Call("flush");
outputStream.Call("close");
Debug.Log("Captura guardada en la galería.");
ShareScreenshot(uri);
}
else
{
Debug.LogError("No se pudo guardar la imagen en MediaStore.");
}
}
catch (Exception ex)
{
Debug.LogError("Error al guardar la captura en MediaStore: " + ex.Message);
}
}
// Guardar en almacenamiento externo (para Android 8 a 10) y compartir
private void SaveImageToExternalStorageAndShare(byte[] imageBytes, string fileName)
{
try
{
string directory = GetExternalStorageDirectory();
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string filePath = Path.Combine(directory, fileName);
File.WriteAllBytes(filePath, imageBytes);
Debug.Log("Captura guardada en: " + filePath);
ShareScreenshot(new AndroidJavaObject("java.io.File", filePath));
}
catch (Exception ex)
{
Debug.LogError("Error al guardar la captura: " + ex.Message);
}
}
// Método para obtener la ruta del almacenamiento externo
private string GetExternalStorageDirectory()
{
AndroidJavaClass environment = new("android.os.Environment");
string directory = environment.CallStatic<AndroidJavaObject>("getExternalStoragePublicDirectory", environment.GetStatic<string>("DIRECTORY_PICTURES")).Call<string>("getAbsolutePath");
return directory;
}
// Compartir la captura de pantalla
private void ShareScreenshot(AndroidJavaObject fileOrUri)
{
try
{
AndroidJavaClass intentClass = new("android.content.Intent");
AndroidJavaObject intentObject = new("android.content.Intent");
intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
intentObject.Call<AndroidJavaObject>("setType", "image/png");
// Obtener el contexto de Unity
AndroidJavaClass unityPlayer = new("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
// Si es Android 11 o superior, usa el URI; si es anterior, usa FileProvider
if (AndroidVersionIs11OrAbove())
{
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), fileOrUri);
intentObject.Call<AndroidJavaObject>("addFlags", 1 << 1); // FLAG_GRANT_READ_URI_PERMISSION
}
else
{
AndroidJavaClass fileProviderClass = new AndroidJavaClass("androidx.core.content.FileProvider");
AndroidJavaObject uri = fileProviderClass.CallStatic<AndroidJavaObject>(
"getUriForFile",
currentActivity,
currentActivity.Call<string>("getPackageName") + ".fileprovider",
fileOrUri
);
intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uri);
intentObject.Call("addFlags", intentClass.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION"));
//intentObject.Call<AndroidJavaObject>("addFlags", 1 << 1); // FLAG_GRANT_READ_URI_PERMISSION
}
AndroidJavaObject chooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Share Screenshot");
currentActivity.Call("startActivity", chooser);
Debug.Log("Cuadro de diálogo de compartir lanzado.");
}
catch (Exception ex)
{
Debug.LogError("Error al compartir la captura: " + ex.Message);
}
}
// Obtener ContentResolver para Android
private AndroidJavaObject GetContentResolver()
{
AndroidJavaClass unityPlayer = new("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
return currentActivity.Call<AndroidJavaObject>("getContentResolver");
}
}