获取当前活动- Xamarin Android

wz1wpwve  于 2023-03-10  发布在  Android
关注(0)|答案(5)|浏览(156)

我正在开发一个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。

zqdjd7g9

zqdjd7g91#

一个更好的方法是使用Xamarin Essentials插件中的Standalone Current Activity Plugin或Current Activity属性,然后您可以执行以下操作:

  • 单机版:CrossCurrentActivity.Current.Activity
  • Xamarin基本要素:Platform.CurrentActivity

如果您不想使用插件,并且您的应用中只有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)
}

不建议使用的旧方法为Context view = (Activity)Xamarin.Forms.Forms.Context
Xamarin会自动将Activity赋值为Forms.Context

jvlzgdj9

jvlzgdj92#

自Xamarin 2.5发布以来,Xamarin.Forms.Forms.Context是obsolete。现在可以通过以下方式获得上下文:

var currentContext = Android.App.Application.Context;
6yjfywim

6yjfywim3#

var activity = (Activity)Forms.Context;

或者如果您正在使用主活动

var activity = (MainActivity)Forms.Context;
ut6juiuv

ut6juiuv4#

如果你使用的是Xamarin Essentials 1.5或更高版本,那么你可以使用Platform.CurrentActivity,这基本上等同于使用CurrentActivity插件。
确保按照说明正确初始化,即在MainActivityOnCreate中添加以下行

Xamarin.Essentials.Platform.Init(this, savedInstanceState);
nwo49xxi

nwo49xxi5#

我试图在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);
        }
    }
}

相关问题