Je développe une application portable pour Android et iOS. Ma fonction actuelle prend une capture d'écran et utilise cette image dans le code. J'ai donc une interface dans la bibliothèque portable.
public interface IFileSystemService
{
string GetAppDataFolder();
}
Je prends également la capture d'écran dans la bibliothèque portable avec le code suivant:
static public bool TakeScreenshot()
{
try
{
byte[] ScreenshotBytes = DependencyService.Get<Interface.IScreenshotManager>().TakeScreenshot();
return true;
}
catch (Exception ex)
{
}
return false;
}
Cela appelle soit la Android ou la version iOS.
Android:
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 question est maintenant d'obtenir l'activité actuelle de mon application.
Depuis la sortie de Xamarin 2.5, Xamarin.Forms.Forms.Context est obsolète . Le contexte peut désormais être obtenu comme suit:
var currentContext = Android.App.Application.Context;
Une meilleure façon serait d'utiliser le Current Activity Plugin . Ensuite, vous pouvez simplement faire CrossCurrentActivity.Current.Activity
.
Si vous ne voulez pas utiliser de plugin et que vous n'avez que 1 Activity
dans votre application, vous pouvez vous en sortir en affectant une variable statique dans MainActivity
et en référençant cela partout où vous en avez besoin comme ceci :
public class MainActivity : FormsApplicationActivity {
public static Context Context;
public MainActivity () {
Context = this;
}
}
Si vous aviez besoin de Context
dans un rendu personnalisé, vous voudriez utiliser le Context
passé dans le constructeur, comme ceci:
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)
}
L'ancienne méthode obsolète serait var view = ((Activity)Xamarin.Forms.Forms.Context).Window.DecorView;
Xamarin affecte automatiquement le Activity
à Forms.Context
.
var activity = (Activity)Forms.Context;
ou si vous utilisez MainActivity
var activity = (MainActivity)Forms.Context;