我找不到使用USB连接Android应用程序和台式机应用程序的任何解决方案。
我需要通过USB从桌面软件向Android应用发送数据。 最好的解决方案是让我直接与Android应用通信以发送JSON对象,或者在智能手机上发送文件。
您有什么解决方案吗?
谢谢。
答案 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());