android 在不同的设备中通信两个应用程序

标签 android communication

这里的所有问题都指向相同应用程序的类或不同进程中但在同一设备中的不同应用程序。我想在两个单独的设备中向两个单独的应用程序发送数据或从两个单独的应用程序发送数据。我尝试使用 broadcastreceiver 但它没有用。这是我发送数据的代码段。

addressstring = String.valueOf(acrilocation.getText());
            if (addressstring != null && addressstring.length() > 0){
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_SEND);
            intent.putExtra(Constants.LOCATION_DATA_EXTRA, addressstring);
            intent.setType("text/plain");
            sendBroadcast(intent);
            } else{
                Toast.makeText(getApplicationContext(), "Enter valid location address", Toast.LENGTH_SHORT).show();
            }

但是当我使用以下代码 fragment 在我的其他应用程序中接收数据时,它失败了。当我调试应用程序时,出现空异常。

Intent intent = getIntent();
        String action = intent.getAction();
        String data = intent.getStringExtra(Intent.EXTRA_INTENT);
        String type = intent.getType();
        useraddress.setText(data);
           startActivity(intent);

还有其他方法可以实现吗?我的意思是向安装在另一台设备上的另一应用发送数据或从另一应用发送数据?

最佳答案

通过接受传入套接字连接的网络进行连接

在 Android 设备之间(或任何对等设备之间)执行此操作的常用方法是使用套接字。

您将一个或两个设备设置为“监听”套接字上的连接,然后在它们想要通信时接受来自另一个设备的连接(或者您可以拥有专用的客户端和服务器,并且客户端始终启动连接) .

建立连接后,您可以来回发送消息。

有很多 Android 客户端服务器套接字应用程序的示例,但我发现一个有用的示例是:

请注意,您可能需要在此之上添加您自己的“协议(protocol)”——例如,如果您发送的文件长度未知且没有任何特殊的“结束”字符,您可能需要添加一个字节(或多个字节)在开始时表示一个 int,long 等)以指示传输的长度,以便接收方知道它何时收到了所有内容(或者在出现错误时它还没有收到所有内容)。

通过不允许传入连接的网络进行连接(例如大多数 3G/4G)

在这些情况下,虽然理论上没有什么可以阻止套接字工作,但实际上许多移动运营商将不允许传入套接字连接。此外,您还需要找到移动设备的公共(public) IP 地址,这是可能的,但非常复杂。如果您的解决方案只能在单个运营商网络上运行,您可以试验并查看它是否有效,但如果不能,您可能会发现在“中间”使用服务器更好更容易:

  • 设备A连接到服务器
  • 设备B连接到服务器
  • 设备 A 向服务器请求连接设备的地址并“发现”设备 B
  • 设备 A 为设备 B 发送消息。它实际上将消息发送到服务器,并指示要将其发送到设备 B
  • 服务器通知设备 B 有一条消息可供它使用(例如使用某种消息通知,例如 Google Cloud Messaging,或者只是通过设备定期轮询以查看它们是否有任何消息)。
  • 设备B从服务器获取消息

以上内容几乎适用于任何允许连接到 Internet 的网络。它确实有需要服务器的缺点,但它可能是大多数移动网络的必要方法。

关于android 在不同的设备中通信两个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040319/

相关文章:

android - 的意思 { *; } 在混淆器中

java - 使用 PHP 与桌面应用程序通信

c# - SerialPort RS-485 和通信限制

architecture - 去中心化推特的设计

android - 使用哪个java jdk?

android - 长时间运行的服务会消耗大量电池

java - 单击android中的按钮时如何验证recyclerView项目

java - 需要为所有 http 请求设置默认 header

c# - 串口传输时数据损坏

c++ - Qt 串行写入函数的输出错误/太少