Removed TOTU 103
This commit is contained in:
		
							
								
								
									
										196
									
								
								Assets/Rendering/Scripts/ShareScreenshotButton.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								Assets/Rendering/Scripts/ShareScreenshotButton.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | ||||
| 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<63>n al evento onClick del bot<6F>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<73> 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<65>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<64>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"); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Ignacio Gómez Puga
					Ignacio Gómez Puga