我正在开发一个Android和iOS的便携式应用程序。我目前的功能是采取屏幕截图,并在代码中使用该图像。因此,我有一个接口的便携式图书馆。
public interface IFileSystemService
{
string GetAppDataFolder();
}
我采取的截图也在便携式图书馆与以下代码:
static public bool TakeScreenshot()
{
try
{
byte[] ScreenshotBytes = DependencyService.Get<Interface.IScreenshotManager>().TakeScreenshot();
return true;
}
catch (Exception ex)
{
}
return false;
}
这可以调用Android或iOS版本。
安卓系统:
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;
}
现在的问题是从我的应用获取当前Activity。
5条答案
按热度按时间zqdjd7g91#
一个更好的方法是使用Xamarin Essentials插件中的Standalone Current Activity Plugin或Current Activity属性,然后您可以执行以下操作:
CrossCurrentActivity.Current.Activity
Platform.CurrentActivity
如果您不想使用插件,并且您的应用中只有1个
Activity
,您可以在MainActivity
中分配一个静态变量,并在需要时引用该变量,如下所示:如果您需要在自定义渲染器中使用
Context
,则需要使用传递到构造函数中的Context
,如下所示:不建议使用的旧方法为
Context view = (Activity)Xamarin.Forms.Forms.Context
Xamarin会自动将
Activity
赋值为Forms.Context
。jvlzgdj92#
自Xamarin 2.5发布以来,Xamarin.Forms.Forms.Context是obsolete。现在可以通过以下方式获得上下文:
6yjfywim3#
或者如果您正在使用主活动
ut6juiuv4#
如果你使用的是Xamarin Essentials 1.5或更高版本,那么你可以使用
Platform.CurrentActivity
,这基本上等同于使用CurrentActivity插件。确保按照说明正确初始化,即在
MainActivity
OnCreate
中添加以下行nwo49xxi5#
我试图在Xamarin 5中做一些类似的事情,我在我的Android和iOS版本中都有一些运气,使用
因此,当屏幕截图或登录时,该方法(无论是什么)可以触发静态事件,以便任何感兴趣的活动都可以查找自己,无论它是否是活动视图,如果是,则使用事件传输的数据(字节数组等)。