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

时间:2019-08-20 17:39:54

标签: java android

我找不到使用USB连接Android应用程序和台式机应用程序的任何解决方案。

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

您有什么解决方案吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

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连接,如果需要的话,可以使用本地网络。

答案 1 :(得分:0)

太好了,我最终使用亚行,而且效果很好。我可以直接将对象发送到我的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