AccessibilityService का उपयोग करके Android पर ड्रैग (X, Y माउस निर्देशांक में स्थित) कैसे करें?


39

मुझे पता है कि एक्स, वाई माउस निर्देशांक में स्थित एंड्रॉइड पर ड्रैग कैसे करें? दो सरल उदाहरणों पर विचार करें, टीम व्यूअर / क्विकसुपोर्ट क्रमशः रिमोट स्मार्टफोन और विंडोज पेंट की पेन पर "पासवर्ड पैटर्न" ड्राइंग।

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

सब है कि मैं बनाने में सक्षम है स्पर्श स्पर्श (साथ dispatchGesture()भी AccessibilityNodeInfo.ACTION_CLICK) है।

मुझे ये प्रासंगिक लिंक मिले, लेकिन पता नहीं कि वे उपयोगी हो सकते हैं:

नीचे मेरा कार्य कोड है जो माउस निर्देशांक ( PictureBoxनियंत्रण के अंदर ) को रिमोट फोन पर भेजने और स्पर्श का अनुकरण करने के लिए उपयोग किया जाता है ।

Windows प्रपत्र अनुप्रयोग:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        int xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
        int yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
    }
}

संपादित करें:

मेरा आखिरी प्रयास माउस निर्देशांक (C # विंडोज फॉर्म एप्लीकेशन) और एक कस्टम एंड्रॉइड रूटीन (ऊपर लिंक किए गए "स्वाइप स्क्रीन के कोड के संदर्भ में) का उपयोग करके" स्वाइप स्क्रीन "था, क्रमशः:

private Point mdownPoint = new Point();

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
        {
            xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width); 
            yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

            // Saving start position:

            mdownPoint.X = xClick; 
            mdownPoint.Y = yClick; 

            client.sock.Send(Encoding.UTF8.GetBytes("TOUCH" + xClick + "<|>" + yClick + Environment.NewLine));
        }
    }
}

private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    foreach (ListViewItem item in lvConnections.SelectedItems)
    {
        // Remote screen resolution
        string[] tokens = item.SubItems[5].Text.Split('x'); // Ex: 1080x1920

        Client client = (Client)item.Tag;

        if (e.Button == MouseButtons.Left)
        {
            xClick = (e.X * int.Parse(tokens[0].ToString())) / (pictureBox1.Size.Width);
            yClick = (e.Y * int.Parse(tokens[1].ToString())) / (pictureBox1.Size.Height);

            client.sock.Send(Encoding.UTF8.GetBytes("MOUSESWIPESCREEN" + mdownPoint.X + "<|>" + mdownPoint.Y + "<|>" + xClick + "<|>" + yClick + Environment.NewLine));
        }
    }
}

Android पहुँच क्षमता सेवा :

public void Swipe(int x1, int y1, int x2, int y2, int time) {

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    System.out.println(" ======= Swipe =======");

    GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
    Path path = new Path();
    path.moveTo(x1, y1);
    path.lineTo(x2, y2);

    gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 100, time));
    dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
        @Override
        public void onCompleted(GestureDescription gestureDescription) {
            System.out.println("SWIPE Gesture Completed :D");
            super.onCompleted(gestureDescription);
        }
    }, null);
}

}

जो निम्न परिणाम उत्पन्न करता है (लेकिन फिर भी उदाहरण के लिए TeamViewer की तरह "पैटर्न पासवर्ड" नहीं बना सकता है)। लेकिन जैसा कि नीचे टिप्पणी पर कहा गया है, मुझे लगता है कि एक समान दृष्टिकोण के साथ यह संभवतया जारी इशारों का उपयोग करके प्राप्त किया जा सकता है । इस दिशा में किसी भी सुझाव का स्वागत किया जाएगा।

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


2 संपादित करें:

निश्चित रूप से, समाधान को इशारों में जारी रखा गया है जैसे कि पिछले संपादन पर

और नीचे एक निश्चित निश्चित कोड है जो मुझे यहाँ मिला =>

Android पहुँच क्षमता सेवा:

// Simulates an L-shaped drag path: 200 pixels right, then 200 pixels down.
Path path = new Path();
path.moveTo(200,200);
path.lineTo(400,200);

final GestureDescription.StrokeDescription sd = new GestureDescription.StrokeDescription(path, 0, 500, true);

// The starting point of the second path must match
// the ending point of the first path.
Path path2 = new Path();
path2.moveTo(400,200);
path2.lineTo(400,400);

final GestureDescription.StrokeDescription sd2 = sd.continueStroke(path2, 0, 500, false); // 0.5 second

HongBaoService.mService.dispatchGesture(new GestureDescription.Builder().addStroke(sd).build(), new AccessibilityService.GestureResultCallback(){

@Override
public void onCompleted(GestureDescription gestureDescription){
super.onCompleted(gestureDescription);
HongBaoService.mService.dispatchGesture(new GestureDescription.Builder().addStroke(sd2).build(),null,null);
}

@Override
public void onCancelled(GestureDescription gestureDescription){
super.onCancelled(gestureDescription);
}
},null);

फिर, मेरा संदेह है: ऊपर दिए गए कोड के लिए सही ढंग से माउस निर्देशांक कैसे भेजें, किसी भी दिशा में खींचें प्रदर्शन कर सकते हैं? कुछ विचार?


संपादित करें 3:

मुझे दो रूटीन मिले जो ड्रैग करने के लिए उपयोग किए जाते हैं, लेकिन वे यूआईटोमेशन + का उपयोग कर रहे हैं injectInputEvent()। AFAIK, ईवेंट का इंजेक्शन केवल एक सिस्टम ऐप में काम करता है जैसे कि यहाँ और यहाँ कहा गया है और मैं यह नहीं चाहता।

यह रूटीन पाए जाते हैं:

फिर अपने लक्ष्य को प्राप्त करने के लिए, मुझे लगता है कि 2d रूटीन को एडिट 2 पर दिखाए गए कोड के साथ (तर्क का अनुसरण करते हुए, घटना इंजेक्शन को छोड़कर) उपयोग करने के लिए अधिक विनियोजित किया जाता है pictureBox1_MouseDownऔर गतिशील रूप से और भेजने के pictureBox1_MouseMoveलिए क्रमशः (सी # विंडोज फॉर्म एप्लीकेशन) के सभी बिंदुओं Point[]को pictureBox1_MouseUpभेजें। नियमित रूप से निष्पादित करने और भरे हुए इस सरणी का उपयोग करने के लिए cmd। यदि आपके पास 1 दिनचर्या का विचार है, तो मुझे बताएं: डी।

यदि इस संपादन को पढ़ने के बाद आपके पास एक संभावित समाधान है, तो कृपया मुझे एक उत्तर में दिखाएं, जबकि मैं इस विचार का परीक्षण और परीक्षण करूंगा।


1
टीम व्यूअर पहुंच फ्रेमवर्क का उपयोग नहीं कर रहा है, सबसे अधिक संभावना है। उनके पास डिवाइस निर्माताओं के साथ विशेष सौदे हैं, यही वजह है कि उनका उत्पाद सभी उपकरणों के लिए उपलब्ध नहीं है।
कॉमन्सवेयर

@CommonsWare आपको धन्यवाद। लेकिन मुझे लगता है कि StrokeDescription.continueStroke()यह एक संभावित समाधान हो सकता है। यहां अनुभाग जारी इशारों को देखें ।
ब्राउनजेयर

2
अपने पहले aproach के बारे में। pictureBox1_MouseDownनिर्देशांक नहीं भेजना चाहिए। इसे केवल प्रारंभिक निर्देशांक संग्रहीत करना चाहिए, और फिर pictureBox1_MouseUpआप उन्हें भेजते हैं, क्योंकि यह माउस आंदोलन के अंत को चिह्नित करता है
Greggz

जवाबों:


1

यहाँ प्रश्न के संपादन 3 पर आधारित समाधान का एक उदाहरण है ।


सी # विंडोज के अनुप्रयोग " formMain.cs ":

using System.Net.Sockets;

private List<Point> lstPoints;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{
    if (e.Button == MouseButtons.Left)
    {
        lstPoints = new List<Point>();
        lstPoints.Add(new Point(e.X, e.Y));
    }
}

private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        lstPoints.Add(new Point(e.X, e.Y));
    }
}

private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    lstPoints.Add(new Point(e.X, e.Y));

    StringBuilder sb = new StringBuilder();

    foreach (Point obj in lstPoints)
    {
        sb.Append(Convert.ToString(obj) + ":");
    }

    serverSocket.Send("MDRAWEVENT" + sb.ToString() + Environment.NewLine);
}

Android सेवा " सॉकेटबेकग्राउंड। जावा ":

import java.net.Socket;

String xline;

while (clientSocket.isConnected()) {

    BufferedReader xreader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8));

    if (xreader.ready()) {

        while ((xline = xreader.readLine()) != null) {
                xline = xline.trim();

            if (xline != null && !xline.trim().isEmpty()) {

                if (xline.contains("MDRAWEVENT")) {

                    String coordinates = xline.replace("MDRAWEVENT", "");
                    String[] tokens = coordinates.split(Pattern.quote(":"));
                    Point[] moviments = new Point[tokens.length];

                    for (int i = 0; i < tokens.length; i++) {
                       String[] coordinates = tokens[i].replace("{", "").replace("}", "").split(",");

                       int x = Integer.parseInt(coordinates[0].split("=")[1]);
                       int y = Integer.parseInt(coordinates[1].split("=")[1]);

                       moviments[i] = new Point(x, y);
                    }

                    MyAccessibilityService.instance.mouseDraw(moviments, 2000);
                }
            }
        }
    }
}

Android AccessibilityService" MyAccessibilityService.java ":

public void mouseDraw(Point[] segments, int time) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

        Path path = new Path();
        path.moveTo(segments[0].x, segments[0].y);

        for (int i = 1; i < segments.length; i++) {

            path.lineTo(segments[i].x, segments[i].y);

            GestureDescription.StrokeDescription sd = new GestureDescription.StrokeDescription(path, 0, time);

            dispatchGesture(new GestureDescription.Builder().addStroke(sd).build(), new AccessibilityService.GestureResultCallback() {

                @Override
                public void onCompleted(GestureDescription gestureDescription) {
                    super.onCompleted(gestureDescription);
                }

                @Override
                public void onCancelled(GestureDescription gestureDescription) {
                    super.onCancelled(gestureDescription);
                }
            }, null);
        }
    }
}

0

क्या आपने AutoIt स्क्रिप्टिंग का उपयोग करने की कोशिश की है ?

आप विशिष्ट विंडो / स्क्रीन के भीतर निर्देशांक सहेज सकते हैं। आप पैटर्न खींचते समय मूसलीक दबाए रख सकते हैं।

अगर आप उन्हें चाहते हैं तो मेरे पास आपके लिए कुछ उदाहरण कोड / स्क्रिप्ट भी हैं!


संपादित करें:

इस ट्यूटोरियल के अनुसार आप C # पर Auto-IT का उपयोग कर सकते हैं।

इन कदमों का अनुसरण करें:

  1. ऑटो-आईटी स्थापित करें
  2. संदर्भ प्रबंधक में ऑटो-आईटी को संदर्भ के रूप में जोड़ें (AutoItX3.dll)
  3. फिर आपके साथ जोड़ी गई लाइब्रेरी आयात करें: Using AutoItX3Lib;
  4. 'Auto' नामक नई AutoItX3 ऑब्जेक्ट बनाएं: AutoItX3 auto = new AutoItX3();
  5. अब आप Auto It कमांड को निष्पादित कर सकते हैं।

मूसलीक को निष्पादित करने के लिए यह पूरा उदाहरण है:

Using AutoItX3Lib;
AutoItX3 auto = new AutoItX3();
auto.MouseClick("left", 78, 1133, 1, 35)


साथ AutoIt Window Info Toolआप निर्देशांक आप उपयोग करना चाहते देख सकते हैं।

कृपया ध्यान दें कि माउस निर्देशांक मोड के बीच अंतर हैं:

उदाहरण के लिए: auto.AutoItSetOption("MouseCoordMode", 1)निरपेक्ष स्क्रीन निर्देशांक का उपयोग करेगा। स्रोत देखें यहाँ


मूसिक्लिक को नीचे रखने के लिए, आप माउसडाउन फंक्शन देख सकते हैं


1
इससे मदद नहीं मिली। आपका सुझाव वही है जो मेरा सी # विंडोज फॉर्म एप्लीकेशन पहले से ही बनाता है।
२३
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.