将 Android 手机连接到 WiFly 开发板

发布于 2024-09-30 07:51:10 字数 197 浏览 2 评论 0原文

我和我的团队正在尝试将 Android 手机连接到 WiFly 板。我们无法连接此设备。是否某些手机不支持此功能或支持此功能?我们必须做什么才能执行此连接?

我们已经尝试了一些方法,但仍然不起作用。如果您需要更多信息,请告诉我。

My team and I are trying to connect an Android phone to the WiFly board. We are having trouble getting this to connect. Is it that certain phones that do not support this or do support this functionality and what must we do to be able to perform this connection?

We have tried a few things, and it is still not working. If you need further information let me know.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

凉薄对峙 2024-10-07 07:51:10

我有一个基于 WiFly 模块的项目,并成功开发了一个应用程序,该应用程序通过 wifi 网络与模块建立 tcp 和 udp 连接。不,我不需要将手机创建为接入点。我可以使用无线路由器作为接入点,从手机与 WiFly 进行通信。我还可以让它进入命令模式,以便我可以编辑其配置。如果您仍在寻找可行的解决方案,我很乐意为您提供我的代码。

编辑:下面是我制作的应用程序的完整代码。它已用于在家庭自动化项目中连接到 WiFly。

MainActivity

public class MainActivity extends Activity {

    private ToggleButton toggleButton1;
    private TcpClient mTcpClient;
    private Spinner spinner1, spinner2,spinner3,spinner4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        addItemsOnSpinner2();
        addItemsOnSpinner3();
        addItemsOnSpinner4();

        new connectTask().execute("");
        spinner1 = (Spinner) findViewById(R.id.spinner1);
        spinner2 = (Spinner) findViewById(R.id.spinner2);
        Button button_send = (Button) findViewById(R.id.button_send);
        button_send.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view) {

                String message = String.valueOf(spinner1.getSelectedItem()) + " " + String.valueOf(spinner2.getSelectedItem()) + " " + "ON";

                //sends the message to the server
                if (mTcpClient != null) {
                    mTcpClient.sendMessage(message);
                }
            }
            });
            Button button_send1 = (Button) findViewById(R.id.button_send1);
            button_send1.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner1.getSelectedItem()) + " " + String.valueOf(spinner2.getSelectedItem()) + " " + "OFF";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_intensity = (Button) findViewById(R.id.button_intensity);
            button_intensity.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner1.getSelectedItem()) + " " + String.valueOf(spinner2.getSelectedItem()) + " " + String.valueOf(spinner3.getSelectedItem());

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_turnon = (Button) findViewById(R.id.button_turnon);
            button_turnon.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner4.getSelectedItem()) + " ON";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_turnoff = (Button) findViewById(R.id.button_turnoff);
            button_turnoff.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner4.getSelectedItem()) + " OFF";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
            toggleButton1.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {
                    // Is the toggle on?
                    boolean on = ((ToggleButton) view).isChecked();

                    if (on) {
                        String message = "$$";

                        //sends the message to the server
                        if (mTcpClient != null) {
                            mTcpClient.sendMessage(message);
                        }
                    } else {
                        String message = "exit\r";

                        //sends the message to the server
                        if (mTcpClient != null) {
                            mTcpClient.sendMessage(message);
                        }
                    }
                }
                });
            Button button_led1 = (Button) findViewById(R.id.button_led1);
            button_led1.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x1\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_led2 = (Button) findViewById(R.id.button_led2);
            button_led2.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x2\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_led3 = (Button) findViewById(R.id.button_led3);
            button_led3.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x4\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_reset = (Button) findViewById(R.id.button_reset);
            button_reset.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x0\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_save = (Button) findViewById(R.id.button_save);
            button_save.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "save\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_reboot = (Button) findViewById(R.id.button_reboot);
            button_reboot.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "reboot\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
    }


         // add items into spinner dynamically
            public void addItemsOnSpinner2() {

            spinner2 = (Spinner) findViewById(R.id.spinner2);
            List<String> list = new ArrayList<String>();
            list.add("load1");
            list.add("load2");
            list.add("load3");
            list.add("load4");
            list.add("load5");
            list.add("load6");
            list.add("load7");
            list.add("load8");
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, list);
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner2.setAdapter(dataAdapter);
            }

            public void addItemsOnSpinner3() {

                spinner3 = (Spinner) findViewById(R.id.spinner3);
                List<String> list = new ArrayList<String>();
                list.add("Default");
                list.add("10");
                list.add("20");
                list.add("30");
                list.add("40");
                list.add("50");
                list.add("60");
                list.add("70");
                list.add("80");
                list.add("90");
                list.add("100");
                ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list);
                dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner3.setAdapter(dataAdapter);
                }

            public void addItemsOnSpinner4() {

                spinner4 = (Spinner) findViewById(R.id.spinner4);
                List<String> list = new ArrayList<String>();
                list.add("s1");
                list.add("s2");
                list.add("s3");
                list.add("s4");
                ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list);
                dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner4.setAdapter(dataAdapter);
                }

            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }   

            public class connectTask extends AsyncTask<String,String,TcpClient> {

                @Override
                protected TcpClient doInBackground(String... message) {

                    //we create a TcpClient object and
                    mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
                        @Override
                        //here the messageReceived method is implemented
                        public void messageReceived(String message) {
                            //this method calls the onProgressUpdate
                            publishProgress(message);
                        }
                    });
                    mTcpClient.run();

                    return null;
                }

            }
}

这是创建一个 tcp 客户端与 WiFly 通信的类,

    package com.example.homauto;

import android.util.Log;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;


public class TcpClient {

    public static final String SERVERIP = "192.168.1.5";
    public static final int SERVERPORT = 2000;
    // message to send to the server
    private String mServerMessage;
    // sends message received notifications
    private OnMessageReceived mMessageListener = null;
    // while this is true, the server will continue running
    private boolean mRun = false;
    // used to send messages
    private PrintWriter mBufferOut;
    // used to read messages from the server
    private BufferedReader mBufferIn;

    /**
     * Constructor of the class. OnMessagedReceived listens for the messages received from server
     */
    public TcpClient(OnMessageReceived listener) {
        mMessageListener = listener;
    }

    /**
     * Sends the message entered by client to the server
     *
     * @param message text entered by client
     */


    public void sendMessage(String message) {
        if (mBufferOut != null && !mBufferOut.checkError()) {
            mBufferOut.println(message);
            mBufferOut.flush();
        }
    }

    /**
     * Close the connection and release the members
     */
    public void stopClient() {



        mRun = false;

        if (mBufferOut != null) {
            mBufferOut.flush();
            mBufferOut.close();
        }

        mMessageListener = null;
        mBufferIn = null;
        mBufferOut = null;
        mServerMessage = null;
    }

    public void run() {

        mRun = true;

        try {
            //here you must put your computer's IP address.
            InetAddress serverAddr = InetAddress.getByName(SERVERIP);

            Log.e("TCP Client", "C: Connecting...");

            //create a socket to make the connection with the server
            Socket socket = new Socket(serverAddr, SERVERPORT);

            try {

                //sends the message to the server
                mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                //receives the message which the server sends back
                mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));


                //in this while the client listens for the messages sent by the server
                while (mRun) {

                    mServerMessage = mBufferIn.readLine();

                    if (mServerMessage != null && mMessageListener != null) {
                        //call the method messageReceived from MyActivity class
                        mMessageListener.messageReceived(mServerMessage);
                    }

                }

                Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");

            } catch (Exception e) {

                Log.e("TCP", "S: Error", e);

            } finally {
                //the socket must be closed. It is not possible to reconnect to this socket
                // after it is closed, which means a new socket instance has to be created.
                socket.close();
            }

        } catch (Exception e) {

            Log.e("TCP", "C: Error", e);

        }

    }

    //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity
    //class at on asynckTask doInBackground
    public interface OnMessageReceived {
        public void messageReceived(String message);
    }
}

希望这对将来的人有帮助。该代码适用于所有 TCP 服务器,而不仅仅是 WiFly。

I've had a project based on WiFly module and have successfully developed an app that makes a tcp as well as udp connections with the module over the wifi network. No, i didn't need to create my phone as an access point. I can communicate from my phone to WiFly with a wireless router as access point. I could also make it enter command mode so that I can edit its configuration. If you are still searching for a viable solution, I would be happy to provide you with my code.

EDIT: Below is the entire code for the app i made. It has been used to connect to WiFly in a Home Automation project.

The MainActivity

public class MainActivity extends Activity {

    private ToggleButton toggleButton1;
    private TcpClient mTcpClient;
    private Spinner spinner1, spinner2,spinner3,spinner4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        addItemsOnSpinner2();
        addItemsOnSpinner3();
        addItemsOnSpinner4();

        new connectTask().execute("");
        spinner1 = (Spinner) findViewById(R.id.spinner1);
        spinner2 = (Spinner) findViewById(R.id.spinner2);
        Button button_send = (Button) findViewById(R.id.button_send);
        button_send.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view) {

                String message = String.valueOf(spinner1.getSelectedItem()) + " " + String.valueOf(spinner2.getSelectedItem()) + " " + "ON";

                //sends the message to the server
                if (mTcpClient != null) {
                    mTcpClient.sendMessage(message);
                }
            }
            });
            Button button_send1 = (Button) findViewById(R.id.button_send1);
            button_send1.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner1.getSelectedItem()) + " " + String.valueOf(spinner2.getSelectedItem()) + " " + "OFF";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_intensity = (Button) findViewById(R.id.button_intensity);
            button_intensity.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner1.getSelectedItem()) + " " + String.valueOf(spinner2.getSelectedItem()) + " " + String.valueOf(spinner3.getSelectedItem());

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_turnon = (Button) findViewById(R.id.button_turnon);
            button_turnon.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner4.getSelectedItem()) + " ON";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_turnoff = (Button) findViewById(R.id.button_turnoff);
            button_turnoff.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = String.valueOf(spinner4.getSelectedItem()) + " OFF";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
            toggleButton1.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {
                    // Is the toggle on?
                    boolean on = ((ToggleButton) view).isChecked();

                    if (on) {
                        String message = "$$";

                        //sends the message to the server
                        if (mTcpClient != null) {
                            mTcpClient.sendMessage(message);
                        }
                    } else {
                        String message = "exit\r";

                        //sends the message to the server
                        if (mTcpClient != null) {
                            mTcpClient.sendMessage(message);
                        }
                    }
                }
                });
            Button button_led1 = (Button) findViewById(R.id.button_led1);
            button_led1.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x1\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_led2 = (Button) findViewById(R.id.button_led2);
            button_led2.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x2\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_led3 = (Button) findViewById(R.id.button_led3);
            button_led3.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x4\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_reset = (Button) findViewById(R.id.button_reset);
            button_reset.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "set sys iofunc 0x0\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_save = (Button) findViewById(R.id.button_save);
            button_save.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "save\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
            Button button_reboot = (Button) findViewById(R.id.button_reboot);
            button_reboot.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view) {

                    String message = "reboot\r";

                    //sends the message to the server
                    if (mTcpClient != null) {
                        mTcpClient.sendMessage(message);
                    }
                }
            });
    }


         // add items into spinner dynamically
            public void addItemsOnSpinner2() {

            spinner2 = (Spinner) findViewById(R.id.spinner2);
            List<String> list = new ArrayList<String>();
            list.add("load1");
            list.add("load2");
            list.add("load3");
            list.add("load4");
            list.add("load5");
            list.add("load6");
            list.add("load7");
            list.add("load8");
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, list);
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner2.setAdapter(dataAdapter);
            }

            public void addItemsOnSpinner3() {

                spinner3 = (Spinner) findViewById(R.id.spinner3);
                List<String> list = new ArrayList<String>();
                list.add("Default");
                list.add("10");
                list.add("20");
                list.add("30");
                list.add("40");
                list.add("50");
                list.add("60");
                list.add("70");
                list.add("80");
                list.add("90");
                list.add("100");
                ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list);
                dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner3.setAdapter(dataAdapter);
                }

            public void addItemsOnSpinner4() {

                spinner4 = (Spinner) findViewById(R.id.spinner4);
                List<String> list = new ArrayList<String>();
                list.add("s1");
                list.add("s2");
                list.add("s3");
                list.add("s4");
                ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list);
                dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner4.setAdapter(dataAdapter);
                }

            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }   

            public class connectTask extends AsyncTask<String,String,TcpClient> {

                @Override
                protected TcpClient doInBackground(String... message) {

                    //we create a TcpClient object and
                    mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
                        @Override
                        //here the messageReceived method is implemented
                        public void messageReceived(String message) {
                            //this method calls the onProgressUpdate
                            publishProgress(message);
                        }
                    });
                    mTcpClient.run();

                    return null;
                }

            }
}

And this is the class the creates a tcp client to communicate with WiFly

    package com.example.homauto;

import android.util.Log;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;


public class TcpClient {

    public static final String SERVERIP = "192.168.1.5";
    public static final int SERVERPORT = 2000;
    // message to send to the server
    private String mServerMessage;
    // sends message received notifications
    private OnMessageReceived mMessageListener = null;
    // while this is true, the server will continue running
    private boolean mRun = false;
    // used to send messages
    private PrintWriter mBufferOut;
    // used to read messages from the server
    private BufferedReader mBufferIn;

    /**
     * Constructor of the class. OnMessagedReceived listens for the messages received from server
     */
    public TcpClient(OnMessageReceived listener) {
        mMessageListener = listener;
    }

    /**
     * Sends the message entered by client to the server
     *
     * @param message text entered by client
     */


    public void sendMessage(String message) {
        if (mBufferOut != null && !mBufferOut.checkError()) {
            mBufferOut.println(message);
            mBufferOut.flush();
        }
    }

    /**
     * Close the connection and release the members
     */
    public void stopClient() {



        mRun = false;

        if (mBufferOut != null) {
            mBufferOut.flush();
            mBufferOut.close();
        }

        mMessageListener = null;
        mBufferIn = null;
        mBufferOut = null;
        mServerMessage = null;
    }

    public void run() {

        mRun = true;

        try {
            //here you must put your computer's IP address.
            InetAddress serverAddr = InetAddress.getByName(SERVERIP);

            Log.e("TCP Client", "C: Connecting...");

            //create a socket to make the connection with the server
            Socket socket = new Socket(serverAddr, SERVERPORT);

            try {

                //sends the message to the server
                mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                //receives the message which the server sends back
                mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));


                //in this while the client listens for the messages sent by the server
                while (mRun) {

                    mServerMessage = mBufferIn.readLine();

                    if (mServerMessage != null && mMessageListener != null) {
                        //call the method messageReceived from MyActivity class
                        mMessageListener.messageReceived(mServerMessage);
                    }

                }

                Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");

            } catch (Exception e) {

                Log.e("TCP", "S: Error", e);

            } finally {
                //the socket must be closed. It is not possible to reconnect to this socket
                // after it is closed, which means a new socket instance has to be created.
                socket.close();
            }

        } catch (Exception e) {

            Log.e("TCP", "C: Error", e);

        }

    }

    //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity
    //class at on asynckTask doInBackground
    public interface OnMessageReceived {
        public void messageReceived(String message);
    }
}

Hope this help somebody in future. The code is applicable to all tcp servers and not just WiFly in particular.

就此别过 2024-10-07 07:51:10

如果问题出在基础设施(接入点的客户端)与临时(点对点)无线网络模式之间,我不会感到惊讶。

最简单的方法是如果您有两个设备都可以连接的接入点。直接连接它们可能会有点困难,因为您必须让两者都在临时模式下工作,或者必须愿意使用接入点。

I wouldn't be surprised if the problem is with infrastructure (clients of an access point) vs. ad-hoc (peer-to-peer) wireless networking modes.

The easiest would be if you have an access point that both devices can connect to. Directly connecting them may be a bit harder, as you have to either get both working in ad-hoc mode or one has to be willing to play access point.

醉南桥 2024-10-07 07:51:10

我们已经找到了这个问题的解决方案。我们让手机充当接入点,并将 WiFly 板连接到手机。我们通过将 WiFly 板连接到手机并将笔记本电脑连接到手机来对此进行测试。然后我们导航到 WiFly 板上的默认网页,我们能够看到该页面。这看起来效果很好,可以解决我们的问题。但是,这会更快地耗尽手机电池。

We have found a solution for this issue. We are making the phone act as an access point and having the WiFly board connect to the phone. We tested this by having the WiFly board connected to the phone and had a laptop connect to the phone. We then navigated to the default webpage that is on the WiFly board and we were able to see the page. This seems to be working well and will solve our problem. However, this will drain the phones battery quicker.

墟烟 2024-10-07 07:51:10

有关不需要 root 的替代解决方案,请参阅 这个

For an alternate solution not requiring root, see this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文