繁体   English   中英

无法通过USB连接Java桌面应用程序和Android应用程序

[英]Can't connect Java desktop app and Android app by USB

我找不到通过USB连接Android应用程序和桌面应用程序的任何解决方案。

我需要通过USB从桌面软件向Android应用发送数据。 最好的解决方案是让我直接与Android应用程序交谈以发送JSON对象,或者在智能手机上发送文件。

你有什么解决办法吗?

谢谢。

AFAIK仅可通过ADB(Android调试桥)来实现。 您需要在Android设备上启用USB调试,此功能才能正常工作。 此外,台式机上还必须存在android adb可执行文件。 (如果需要,您可能可以将其与桌面应用程序可执行文件一起提供。)

通信本身将通过tcp套接字进行工作。 您的android应用必须在tcp端口上侦听,而您的桌面应用必须在该端口上打开连接。

为此,您必须通过以下adb命令将tcp端口从台式机转发到android设备:

adb forward tcp:6100 tcp:7100

您可以根据需要更改端口。 第一个是台式机上的端口,第二个是通信将在android设备上转发到的端口。

https://developer.android.com/studio/command-line/adb#forwardports

编辑:这样做的好处是,您可以轻松地忽略USB连接,而可以使用本地网络。

太好了,我最终使用ADB,而且效果很好。 我可以直接将对象发送到我的Android应用程序。

桌面类

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import callbacks.MainCallbacks;

public class UsbConnect {
    private Socket socket = null;
    private ObjectOutputStream out = null;
    private ObjectInputStream in = null;

    private boolean logged = false;
    private boolean play = true;

    private MainCallbacks callbacks;

    public UsbConnect(MainCallbacks callbacks) {
        this.callbacks = callbacks;

        new Thread(new Runnable() {
            @Override
            public void run() {
                while(play) {
                    if(!logged) {
                        // Tentative d'ouverture du port 
                        if(!setPort()) {                        
                            continue;
                        }

                        // Tentative de connexion
                        if(connexion()) {
                            callbacks.pdaConnect();
                            logged = true;
                        }
                        else {
                            continue;
                        }
                    }
                    else {
                        if(!testConnexion()) {
                            callbacks.pdaDisconnect();
                            logged = false;
                        }
                    }

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    private void sendData(Object o) {
        try {
            out.writeObject(o);
            out.flush();
        } catch (IOException e) {
            callbacks.pdaDisconnect();
            logged = false;
        }
    }

    private void destroy() {
        play = false;

        try {
            in.close();
            out.close();

            if (socket != null)
            {
                socket.close();
            }
        } catch (IOException e) {
            // NOTHING
        }
    }

    private boolean testConnexion() {
        try{
            in = new ObjectInputStream(socket.getInputStream());
        }
        catch (IOException io){
            return false;
        }
        return true;
    }

    protected boolean connexion() {
        try{
            socket = new Socket("127.0.0.1", 38300);

            try{
                out = new ObjectOutputStream(socket.getOutputStream());
                out.flush();
                in = new ObjectInputStream(socket.getInputStream());

                String message = (String) in.readObject();
                System.out.println("server>" + message);

            }
            catch (IOException io){
                return false;
            }

            return true;
        }
        catch (UnknownHostException e){
            return false;
        }
        catch (IOException e){
            return false;
        }
        catch (Exception e){
            return false;
        }
    }

    private boolean setPort() {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command("cmd.exe", "/c", "C:\\Users\\Code\\Desktop\\adb.exe forward tcp:38300 tcp:38300");
            Process process;

            process = processBuilder.start();

            int exitVal = -12;

            try {
                exitVal=process.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
                return false;
            }

            if (exitVal == 0) {
                return true;
            } else {
                return false;
            }
        } catch (IOException e1) {
            e1.printStackTrace();
            return false;
        }
    }
}

当设备连接到USB端口,设置端口adb,然后尝试与智能手机上的套接字服务器连接时,我的类侦听器。

setPort()方法是设置端口,您需要嵌入adb.exe及其dll

Android类

server = new ServerSocket(38300);
client = server.accept();

out = new ObjectOutputStream(client.getOutputStream());
ois = new ObjectInputStream(client.getInputStream());

来源: https : //github.com/user370305/Android-USB-Communication

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM