Estoy desarrollando una aplicación portátil para Android e iOS. Mi función actual es tomar una captura de pantalla y usar esa imagen en el código. Por lo tanto, tengo una interfaz en la biblioteca portátil.
public interface IFileSystemService { string GetAppDataFolder(); }Estoy tomando la captura de pantalla también en la biblioteca portátil con el siguiente código:
static public bool TakeScreenshot() { try { byte[] ScreenshotBytes = DependencyService.Get<Interface.IScreenshotManager>().TakeScreenshot(); return true; } catch (Exception ex) { } return false; }Esto llama a la versión de Android o iOS.
Androide:
class ScreenshotManagerAndroid : IScreenshotManager { public static Activity Activity { get; set; } public byte[] TakeScreenshot() { if (Activity == null) { throw new Exception("You have to set ScreenshotManager.Activity in your Android project"); } var view = Activity.Window.DecorView; view.DrawingCacheEnabled = true; Bitmap bitmap = view.GetDrawingCache(true); byte[] bitmapData; using (var stream = new MemoryStream()) { bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream); bitmapData = stream.ToArray(); } return bitmapData; }La pregunta ahora es obtener la actividad actual de mi aplicación.
Una mejor manera sería usar el complemento de actividad actual independiente o la propiedad de actividad actual en el complemento de Xamarin Essentials . Entonces podrías simplemente hacer:
CrossCurrentActivity.Current.ActivityPlatform.CurrentActivity Si no desea usar un complemento y solo tiene 1 Activity en su aplicación, puede salirse con la suya asignando una variable estática en MainActivity y haciendo referencia a eso donde sea que lo necesite de esta manera:
public class MainActivity : FormsApplicationActivity { public static Context Context; public MainActivity () { Context = this; } } Si necesita Context dentro de un renderizador personalizado, querrá usar el Context pasado al constructor, así:
public class MyEntryRenderer : EntryRenderer { private readonly Context _context; public MyEntryRenderer(Context context) : base(context) { _context = context; } // Now use _context or ((Activity)_context) any where you need to (just make sure you pass it into the base constructor) } La antigua forma en desuso sería Context view = (Activity)Xamarin.Forms.Forms.Context
Xamarin asigna automáticamente la Activity a Forms.Context .
var activity = (Activity)Forms.Context;o si está utilizando MainActivity
var activity = (MainActivity)Forms.Context;