MAUI Android端应用开发实现自动点击屏幕指定位置

我想用MAUI通过Android通道搭建一个操作自己手机的应用程序。
应用场景是这样的:我想给它指定一个坐标,如何它通过我指定的坐标进行点击、滑动……以实现对移动端的操作。
但问题来了 由于我并不是很熟练MAUI,我也翻阅了micsroft 文档 ,但是并没有得到有效的解决方案。
并且Android是否事先需要获得该自动点击活动的权限,我也没得到有效的答案。
我把问题分划为2个。
1.MAUI中Android应用开发,是否需要获得该自动点击活动的权限,如果需要,如何进行配置.
2.MAUI Android端,如何调用并且实现对指定坐标位置的动作操作

机器人勿扰 直接从ChatGPT上面复制下来的无实践依据的也勿扰

你好!将 VxWorks 固化到 i.MX6Q SDB 的 eMMC 或 SD 卡中,以便在开发阶段通过网络下载,产品阶段通过存储卡启动是可行的。这个过程涉及到配置 U-Boot 以支持网络启动和存储设备启动。在回答你的问题之前,我需要澄清一下我的知识截止日期是2021年9月,所以我无法提供截至此日期之后的版本信息。在那个时候,一些常用的步骤可能如下所示:

编译 VxWorks 镜像:首先,你需要将 VxWorks 编译为适用于 i.MX6Q SDB 的目标。通常,Wind River 提供了针对不同平台的编译工具链和相关文档。

配置 U-Boot:进入 U-Boot 的配置,确保启用 TFTP 和支持存储设备启动。你可能需要编辑 include/configs/.h 文件(在这里 是你的开发板型号),以及可能的其他配置文件,以使其启用这些功能。

启用 TFTP 支持:确保以下选项被启用(根据实际情况):


#define CONFIG_CMD_TFTPPUT
#define CONFIG_CMD_TFTPPUT

启用存储设备支持:如果需要从存储设备(如 SD 卡或 eMMC)启动 VxWorks,确保以下选项被启用:


#define CONFIG_CMD_MMC
#define CONFIG_CMD_EXT2

配置网络设置:编辑 U-Boot 的环境变量以配置网络设置,使其能够进行 TFTP 下载。你可以通过串口连接到开发板,在 U-Boot 提示符下输入以下命令,或者将这些命令添加到 U-Boot 脚本中。


setenv ipaddr <your_ip_address>
setenv serverip <tftp_server_ip>

TFTP 下载 VxWorks 镜像:在 U-Boot 提示符下,通过 TFTP 从你的 TFTP 服务器下载 VxWorks 镜像文件。例如:



tftpboot <load_address> vxworks.img

启动 VxWorks 镜像:根据下载的 VxWorks 镜像的内存加载地址,启动 VxWorks。例如:



bootvx <load_address>

请注意,上述步骤仅提供了一个大致的指导,具体的步骤可能因 U-Boot 版本、VxWorks 版本、i.MX6Q SDB 的硬件配置等因素而有所不同。在进行这些操作之前,务必仔细阅读 VxWorks 和 U-Boot 的文档,以确保你按照正确的流程进行配置和操作。

另外,请注意,随着时间的推移,软件和硬件的更新可能会导致某些步骤和设置发生变化。最好参考最新的官方文档或社区支持来获取准确的信息。

1.该应用可以做成悬浮窗口
2.模拟touch事件,指定position和坐标就可以(模拟点击区域可以使用画框的方式)
3.将touch事件透传到桌面
4.需要悬浮窗口的权限

在Android应用中,实现自动点击、滑动等操作可能需要特定的权限
创建一个Java类,用于调用UiAutomator:

import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.uiautomator.UiDevice;

public class UiAutomatorHelper {
    public static void performClick(int x, int y) {
        Context context = InstrumentationRegistry.getInstrumentation().getContext();
        UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
        device.click(x, y);
    }
}


执行自动化操作

using System;
using Java.Interop;
using Android.Runtime;

[Register("com.example.uiautomator.UiAutomatorHelper")]
public class UiAutomatorHelper : Java.Lang.Object
{
    public static void PerformClick(int x, int y)
    {
        using (var cls = new JavaClass("com.example.uiautomator.UiAutomatorHelper"))
        {
            cls.CallStatic("performClick", x, y);
        }
    }
}


使用UiAutomatorHelper 类在MAUI应用中调用自动化操作:

UiAutomatorHelper.PerformClick(100, 200); // 替换为你的坐标


Android 实现自动点击屏幕的方法

//新建一个实体类
import android.app.Activity;

import java.io.IOException;

/**
 * Created by cxf on 2020/9/29
 * 自动点击屏幕
 */
public class AutoTouch {
    public int width = 0;
    public int height = 0;

    /**
     * 传入在屏幕中的比例位置,坐标左上角为基准
     *
     * @param act    传入Activity对象
     * @param ratioX 需要点击的x坐标在屏幕中的比例位置
     * @param ratioY 需要点击的y坐标在屏幕中的比例位置
     */
    public void autoClickRatio(Activity act, final double ratioX, final double ratioY) {
        width = act.getWindowManager().getDefaultDisplay().getWidth();
        height = act.getWindowManager().getDefaultDisplay().getHeight();
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 线程睡眠0.1s
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 生成点击坐标
                int x = (int) (width * ratioX);
                int y = (int) (height * ratioY);

                // 利用ProcessBuilder执行shell命令
                String[] order = {"input", "tap", "" + x, "" + y};
                try {
                    new ProcessBuilder(order).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 传入在屏幕中的坐标,坐标左上角为基准
     *
     * @param act 传入Activity对象
     * @param x   需要点击的x坐标
     * @param y   需要点击的x坐标
     */
    public void autoClickPos(Activity act, final double x, final double y) {
        width = act.getWindowManager().getDefaultDisplay().getWidth();
        height = act.getWindowManager().getDefaultDisplay().getHeight();
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 线程睡眠0.1s
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // 利用ProcessBuilder执行shell命令
                String[] order = {"input", "tap", "" + x, "" + y};
                try {
                    new ProcessBuilder(order).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}


在你的Android设备的设置中开启该辅助功能服务。在「设置」-> 「辅助功能」-> 「服务」中找到你创建的辅助功能服务,并开启它,demo代码如下

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityNodeInfo rootNode = getRootInActiveWindow();
    if (rootNode == null) {
        return;
    }

    // 在rootNode中查找指定控件
    List<AccessibilityNodeInfo> targetNodes = rootNode.findAccessibilityNodeInfosByViewId("com.example.app:id/myButton");
    if (targetNodes.isEmpty()) {
        return;
    }

    AccessibilityNodeInfo targetNode = targetNodes.get(0);
    // 模拟点击操作
    targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

AndroidManifest.xml 文件中添加网络等相应的权限,或者在代码中使用 ActivityCompat.requestPermissions() 方法请求权限。
然后在 MAUI 中实现自动点击或者模拟用户点击的操作,可以使用 Android 的 InputManager 和 InputRouter 类来实现。

结合GPT给出回答如下请题主参考
您可以通过以下步骤实现您的应用程序:

  1. 在Visual Studio 2019中创建一个MAUI项目,并选择Android作为目标平台。

  2. 使用Android ADB工具获取设备的屏幕尺寸和分辨率。

  3. 创建一个按钮或文本框控件来接收用户输入的坐标。

  4. 在代码中使用Android的Java层API来模拟屏幕操作,例如:

using Android.AccessibilityServices;
using Android.Graphics;
using Android.Util;

// 获取设备屏幕信息
var displayMetrics = new DisplayMetrics();
var windowManager = this.GetSystemService(WindowService).JavaCast<IWindowManager>();
windowManager.DefaultDisplay.GetMetrics(displayMetrics);
var screenWidth = displayMetrics.WidthPixels;
var screenHeight = displayMetrics.HeightPixels;

// 模拟点击操作
var service = new AccessibilityService();
var accessibilityNodeInfo = service.RootInActiveWindow;
if (accessibilityNodeInfo != null)
{
    var rect = new Rect(x, y, x + 1, y + 1); // x, y为用户输入的坐标
    var perform = new AccessibilityNodeInfo.PerformActionResult(
        accessibilityNodeInfo.PerformAction(AccessibilityNodeInfo.ActionClick, rect),
        accessibilityNodeInfo);
    if (!perform.Succeeded)
    {
        Log.Error("AccessibilityService", "Failed to perform click action.");
    }
}
  1. 部署应用程序并在设备上测试。

请注意,这个例子只是为了帮助您了解如何使用MAUI和Android API来实现您的应用程序。在实际开发中,您需要考虑一些其他因素,例如用户体验、异常处理和安全性等。

http://www.taodudu.cc/news/show-5613934.html
看看此链接里的代码,应该能对你有启发

要先获取网络权限

参考gpt
对于您的问题,我可以提供一些基本的指导。请注意,MAUI(Multi-platform App UI)是一个跨平台的应用程序开发框架,用于创建移动端和桌面端应用程序。目前,MAUI还处于预览阶段,可能还没有完全支持所有功能。以下是一些可能的解决方案:

  1. 获得自动点击权限:
    在Android上,实现自动点击或模拟用户输入通常需要特定的权限。您可以在AndroidManifest.xml文件中添加相应的权限声明。例如,如果您需要模拟触摸事件,您可以添加以下权限声明:

    <uses-permission android:name="android.permission.INJECT_EVENTS" />
    

    请注意,这些权限可能需要在应用程序安装时获得用户的授权。

  2. 实现对指定坐标位置的动作操作:
    在MAUI中,您可以使用Android平台特定的API来实现对指定坐标位置的操作。以下是一些可能的解决方案:

    • 使用Android的MotionEvent类模拟触摸事件。您可以创建一个MotionEvent对象,并使用dispatchTouchEvent方法将其分派到指定的视图上。这样可以模拟点击、滑动等操作。例如:
      MotionEvent motionEvent = MotionEvent.Obtain(
          downTime: SystemClock.UptimeMillis(),
          eventTime: SystemClock.UptimeMillis(),
          action: MotionEventActions.Down,
          x: xCoordinate,
          y: yCoordinate,
          pressure: 1.0f,
          size: 1.0f,
          metaState: MetaKeyStates.None,
          xPrecision: 1.0f,
          yPrecision: 1.0f,
          deviceId: 0,
          edgeFlags: MotionEventEdgeFlags.None
      );
      view.DispatchTouchEvent(motionEvent);
      
    • 使用GestureDetector类实现手势操作。您可以创建一个GestureDetector对象,并实现相应的手势监听器。然后,您可以将该手势监听器附加到指定的视图上,以便捕获和处理手势事件。例如:
      GestureDetector gestureDetector = new GestureDetector(this, new MyGestureListener());
      view.Touch += (sender, e) => gestureDetector.OnTouchEvent(e.Event);
      

请注意,上述代码示例仅为参考,并可能需要根据您的具体需求进行调整。此外,MAUI还在不断发展和改进中,因此某些功能可能尚未完全支持或可能发生变化。建议您查阅MAUI的官方文档和示例代码,以获取更详细和最新的信息。

先获取权限,再进行操作

ChatGPT:在 MAUI 中开发 Android 应用并实现自动点击、滑动等操作需要考虑到多个方面,包括权限、UI测试库以及与 Android 系统交互等。下面是一些指导步骤:

1. 权限配置:
在 Android 应用中,要进行自动点击、滑动等操作,通常需要获取 WRITE_SECURE_SETTINGS 权限,这是一个敏感权限,需要在 AndroidManifest.xml 文件中进行声明。但需要注意,这个权限在 Android 11 及以上版本中可能无法直接获取。

在 MAUI 中,你可以在 MainApplication.cs 文件中配置权限:

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;

namespace YourNamespace
{
    [Activity(Label = "YourApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());

            // Request necessary permissions here
            // For example:
            // Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, Android.Manifest.Permission.WriteSecureSettings);
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

2. 自动操作实现:
为了实现自动点击、滑动等操作,你可以使用 Android 提供的 UI 测试库,如 UiAutomatorEspresso。这些库可以模拟用户在应用中的操作,但需要编写测试代码。

在 MAUI 中使用 UI 测试库需要编写 Android 特定的代码,比较复杂。你可以考虑使用 C# 的 UI 测试框架,如 Xamarin.UITestXamarin.UITest 可以跨平台运行 UI 测试,包括 Android。

具体实现流程涉及编写测试代码、在 MAUI 应用中嵌入测试逻辑等。你需要在测试项目中编写相应的测试脚本,通过 app.Tapapp.DragAndDrop 等方法实现点击、滑动操作。

3. 自动点击权限:
自动点击等行为涉及模拟用户交互,可能会触发系统的安全机制。根据 Android 版本和设备制造商,可能需要开启特定的权限,如辅助功能服务。在 Android 6.0 及以上版本,应用需要请求用户授权以使用辅助功能服务。这些具体细节需要你针对具体设备和 Android 版本进行测试和验证。

总之,实现自动点击、滑动等操作需要进行深入的研究和开发。你需要在 MAUI 中集成相应的测试框架,并编写测试代码来实现你的需求。同时,需要关注权限配置和设备适配等问题。建议你参考相关的 Android UI 测试文档和 Xamarin.UITest 文档进行进一步的学习和实践。

参考gpt:
结合自己分析给你如下建议:
如果您想用MAUI通过Android通道搭建一个操作自己手机的应用程序,您可以参考以下的建议:
MAUI中Android应用开发,是否需要获得该自动点击活动的权限,如果需要,如何进行配置.
根据我搜索到的结果,如果您想让您的应用程序能够在Android设备上实现自动点击或滑动等操作,您需要获得一种叫做无障碍服务(Accessibility Service)的权限。无障碍服务是一种为残障用户提供辅助功能的服务,它可以访问屏幕内容和控制设备的行为。
为了获得无障碍服务的权限,您需要在您的应用程序中声明一个继承自AccessibilityService类的服务,并在AndroidManifest.xml文件中注册该服务,并指定一个配置文件。配置文件是一个XML文件,它定义了您的服务所需的能力和属性,例如反馈类型、事件类型、过滤器等。
在注册服务时,您还需要指定一个android:permission属性,将其值设置为android.permission.BIND_ACCESSIBILITY_SERVICE。这样可以确保只有系统才能绑定到您的服务,并防止其他应用程序滥用您的服务。
在用户安装并启动您的应用程序后,系统会提示用户授予无障碍服务的权限,并引导用户到设备的无障碍设置页面。用户必须在那里手动启用您的服务才能使其生效。
MAUI Android端,如何调用并且实现对指定坐标位置的动作操作
根据我搜索到的结果,如果您想在Android设备上模拟点击或滑动等操作,您可以使用AccessibilityService类中提供的performGlobalAction方法或dispatchGesture方法。
performGlobalAction方法可以执行一些预定义的全局操作,例如返回、主页、最近任务等。您只需要传递一个表示操作类型的整数常量作为参数即可。例如:

// Perform a back action performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);

dispatchGesture方法可以执行一些自定义的手势操作,例如点击、长按、滑动等。您需要传递一个表示手势路径和持续时间的GestureDescription对象作为参数。GestureDescription对象可以通过GestureDescription.Builder类来构建。例如:
// Create a gesture builder GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();

// Create a path for a single tap at (100, 200) Path clickPath = new Path(); clickPath.moveTo(100, 200);

// Add the tap to the gesture builder gestureBuilder.addStroke(new GestureDescription.StrokeDescription(clickPath, 0, 50));

// Build the gesture description GestureDescription gesture = gestureBuilder.build();

// Dispatch the gesture dispatchGesture(gesture, null, null);

引用chatgpt内容作答:
针对你的问题,让我逐步回答:

一、 MAUI中Android应用开发权限配置
在Android中,访问和模拟用户的触摸事件通常需要特定的权限。如果你的应用需要模拟点击、滑动等操作,你需要在AndroidManifest.xml文件中声明适当的权限。在 MAUI 中,你可以通过以下步骤添加权限:

1、打开你的 MAUI 项目的 Android 项目文件,一般是 YourProject.Android.csproj。
2、在文件中添加类似以下代码的权限声明:

<ItemGroup>
  <AndroidPackageReference Include="Xamarin.Essentials" Version="x.y.z" />
</ItemGroup>

其中,x.y.z 是 Xamarin.Essentials 的版本号。

在 AndroidManifest.xml 文件中添加所需的权限。例如,以下代码会添加模拟触摸事件所需的权限:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

确保根据你的需求添加适当的权限。请注意,一些权限可能需要用户同意。

二、 在MAUI中实现对指定坐标位置的动作操作
要在 MAUI 中实现对指定坐标位置的动作操作,你可以通过使用 Xamarin.Essentials 库来模拟触摸事件。以下是一个简单的示例,展示了如何在 MAUI 中模拟点击屏幕上的指定坐标位置:

using System;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace YourNamespace
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            Button simulateButton = new Button
            {
                Text = "Simulate Click",
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand
            };
            simulateButton.Clicked += SimulateButton_Clicked;

            Content = simulateButton;
        }

        private async void SimulateButton_Clicked(object sender, EventArgs e)
        {
            // Replace these coordinates with the desired ones
            double x = 100;
            double y = 200;

            await Device.InvokeOnMainThreadAsync(() =>
            {
                try
                {
                    // Simulate a touch gesture at the specified coordinates
                    Touch.Perform(new TouchAction[]
                    {
                        new TouchAction(TouchActionType.Pressed, x, y),
                        new TouchAction(TouchActionType.Released, x, y)
                    });
                }
                catch (Exception ex)
                {
                    // Handle exceptions
                }
            });
        }
    }
}

这个示例中,我们创建了一个按钮,点击按钮时会触发模拟点击事件。在 SimulateButton_Clicked 方法中,我们使用 Touch.Perform 来模拟在指定坐标位置执行触摸动作。

模拟触摸事件可能会受到设备和系统的限制,并且在不同的 Android 版本和设备上表现可能会有所不同。你可能需要根据实际情况进行调整和测试。

【相关推荐】



  • 这篇博客: MAUI 框架安卓入门开发04 内容模板加载中的  2.1 绑定好数据源后,需要通过数据模板,使用数据模板就是让不同的子项显示不同的数据和控件样式 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

MAUI 中开发 Android 应用,并实现对指定坐标位置的自动点击和滑动操作,您可以按照以下步骤进行操作:
1 获取自动点击权限:
   在 Android 中,实现对屏幕的自动点击和滑动操作需要获取系统的辅助功能权限这是因为这种操作涉及模拟用户交互,需要辅助功能权限才能访问屏幕内容并执行操作MAUI 中,您可以使用 Xamarin.Essentials 包来请求权限确保在 Android 项目中引用了 Xamarin.Essentials然后,您可以使用以下代码请求辅助功能权限:

   using Xamarin.Essentials;

   ...

   if (!AccessibilityUtils.IsAccessibilityServiceEnabled())
   {
       await Permissions.RequestAsync<Permissions.AccessibilityService>();
   }

   这将弹出一个权限请求对话框,允许用户在应用中开启辅助功能权限

2 实现对指定坐标位置的动作操作:
   一旦您获得了辅助功能权限,您可以使用 AndroidUI 自动化框架(如 UI AutomatorEspresso)来实现对指定坐标位置的动作操作MAUI 中,您可以使用 Xamarin.UITest 包来进行 UI 自动化测试确保在 Android 项目中引用了 Xamarin.UITest然后,您可以使用 Xamarin.UITest 提供的 API 来模拟点击滑动等操作
   以下是一个示例代码,演示如何使用 Xamarin.UITestMAUI 中实现对指定坐标位置的点击操作:

   using Xamarin.UITest.Android;
   using Xamarin.UITest.Queries;

   ...

   // 获取 AndroidApp 实例
   AndroidApp app = ConfigureApp.Android.StartApp();

   // 模拟点击指定坐标位置
   app.TapCoordinates(x, y);
 
   在上述示例中,x 和 y 分别表示要点击的坐标位置的横坐标和纵坐标
请注意,对于滑动等更复杂的操作,您需要使用适当的 API 和手势来实现

总结起来,您需要获取辅助功能权限以进行自动点击和滑动操作,并使用 Xamarin.UITest 或其他 UI 自动化框架来实现这些操作确保在 MAUI 项目中引用了 Xamarin.EssentialsXamarin.UITest 包,并按照示例代码进行操作

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢