我正在为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;
}
现在的问题是从我的应用程序中获取当前活动。
答案 0 :(得分:25)
更好的方法是使用Current Activity Plugin。然后你就可以CrossCurrentActivity.Current.Activity
。
如果您不想使用插件并且应用中只有1 Activity
,那么您可以在MainActivity
中分配一个静态变量,并在需要的时候引用它这样:
public class MainActivity : FormsApplicationActivity {
public static Context Context;
public MainActivity () {
Context = this;
}
}
如果您在自定义渲染器中需要Context
,则需要使用传递给构造函数的Context
,如下所示:
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)
}
旧的弃用方式为var view = ((Activity)Xamarin.Forms.Forms.Context).Window.DecorView;
Xamarin自动将Activity
分配给Forms.Context
。
答案 1 :(得分:14)
var activity = (Activity)Forms.Context;
或者如果您使用的是MainActivity
var activity = (MainActivity)Forms.Context;
答案 2 :(得分:9)
如果您使用Xamarin Essentials 1.5或更高版本,则可以使用Platform.CurrentActivity
。这基本上等同于使用CurrentActivity插件。
确保您按照说明正确初始化,即。在MainActivity
OnCreate
中添加以下行
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
答案 3 :(得分:7)
自Xamarin 2.5发行以来,Xamarin.Forms.Forms.Context为obsolete。现在可以按以下方式获取上下文:
var currentContext = Android.App.Application.Context;
答案 4 :(得分:0)
我试图在 Xamarin 5 中做类似的事情,并且在我的 Android 和 iOS 版本中使用
Shell.Current.CurrentPage
所以一些事情会发生,比如屏幕截图或登录,并且该方法(无论它是什么)可以触发一个静态事件,以便任何感兴趣的活动都可以寻找自己,无论它是否是活动视图,如果是,则消耗数据(字节数组等)由事件传输。
class FileChooserPage : ContentPage
{
public FileChooserPage()
{
InitializeComponent();
GoogleDriveService.Authenticated += GoogleDriveService_Authenticated;
}
private void GoogleDriveService_Authenticated(object sender, EventArgs e)
{
if (ReferenceEquals(this, Shell.Current.CurrentPage))
{
Populate(e);
}
}
}