【问题标题】:How to take a screenshot of what the user can see xamarin forms如何截取用户可以看到的 xamarin 表单的屏幕截图
【发布时间】:2022-01-19 17:00:49
【问题描述】:

我看过许多其他使用 Xamarin.Essentials.Screenshot.CaptureAsync() 的帖子。这样做的问题是它会截取最顶层视图的屏幕截图,而不是用户可以看到的屏幕截图。

我的问题是,是否可以截取用户可以看到的内容,如果可以,如何截屏?

编辑:

我还不是很清楚我想要达到的目标,所以这里是:

我正在尝试截取手机默认屏幕(所有应用程序所在的位置等)以及其他应用程序的屏幕截图。所以为此我使用前台服务。它可以工作,除了屏幕截图之外的所有内容仍然只是应用程序的视图

【问题讨论】:

  • 用户不能只使用手机的截图功能吗?
  • 是的,但我想要做的是我需要应用程序自动截取屏幕截图
  • This java thread 可能有一些有用的想法可以适应c#。

标签: c# xamarin xamarin.forms xamarin.android


【解决方案1】:

下面的代码可以通过bitmap获取activity的view,然后可以将bitmap作为图片文件保存到设备中。

    private void takeScreenShot(Activity activity)
    {
        View view = activity.Window.DecorView;
        view.DrawingCacheEnabled = true;
        view.BuildDrawingCache();
        Bitmap bitmap = view.DrawingCache;
        Rect rect = new Rect();
        activity.Window.DecorView.GetWindowVisibleDisplayFrame(rect);
        int statusBarHeight = rect.Top;
        int width = activity.WindowManager.DefaultDisplay.Width;
        int height = activity.WindowManager.DefaultDisplay.Height;
        Bitmap screenShotBitmap = Bitmap.CreateBitmap(bitmap, 0, statusBarHeight, width,
         height - statusBarHeight);
        view.DestroyDrawingCache();
        string uri = System.IO.Path.Combine("/sdcard/Download", "screen.jpg");
        using (System.IO.FileStream os = new System.IO.FileStream(uri, System.IO.FileMode.Create))
        {
            screenShotBitmap.Compress(Bitmap.CompressFormat.Png, 100, os);
            os.Close();
        }
    }

【讨论】:

  • 请看编辑,谢谢
  • 首先,您可以使用 Android 原生命令来执行此操作,例如 'Java.Lang.Runtime.GetRuntime().Exec("screencap -p /sdcard/screen.png");'另外,您可以使用MediaProjection类进行截图。建议在使用前阅读有关它们的官方文档。还有一个MediaProjection类的例子。link@Snapper
猜你喜欢
  • 2017-10-09
  • 2021-07-12
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多