2015-03-13 74 views
0

所有這些問題都指向同一個應用程序或不同應用程序在同一個設備中的不同應用程序中的類別。我想通過兩個獨立的設備向兩個獨立的應用程序發送數據。我嘗試使用broadcastreceiver,但它沒有奏效。這是我發送數據的片段。android在不同設備中通信兩個應用程序

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(); 
      } 

但是當我使用下面的代碼段收到我的其他應用程序中的數據時,它會失敗。當我調試應用程序時,我得到空異常。

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

是否有另一種方法來實現這一目標?我的意思是將數據發送到另一個設備上安裝的另一個應用程序和從另一個應用程序安裝?

+0

這甚至工作怎麼樣?廣播用於系統通信。一個應用程序如何瞭解其他設備上的其他應用程序?您必須使用網絡或藍牙或類似的數據傳輸。 – PaMaDo 2015-03-13 19:40:51

回答

0

連接在接受傳入的套接字連接

通常的方法來執行此Android設備之間(或任何對等設備之間)是使用套接字網絡。

您將一臺或兩臺設備設置爲'監聽'套接字上的連接,然後在他們想要進行通信時接受另一臺設備的連接(或者您可以擁有專用客戶端和服務器,並且客戶端始終啓動連接)。

連接建立後,您可以來回發送消息。

還有的Android客戶端服務器socket應用的例子很多,但一個我發現有用的是:

請注意,您可能必須在其上添加自己的「協議」 - 例如,如果您發送的文件長度未知,沒有任何特殊的「結束」字符,則可能需要添加一個字節(或幾個字節來表示一個int,long等),以指示傳輸的長度,以便接收sid e知道它什麼時候收到了所有的東西(或者在發生錯誤時它沒有收到所有東西)。

連接在網絡上不容許傳入的連接(例如,大多數3G/4G)

在這些情況下,雖然沒有什麼理論上停止插座的工作,在實踐中,許多移動運營商將不會允許傳入的套接字連接。此外,您需要查找移動的公共IP地址,這是可能的,但額外的複雜性。如果您的解決方案將只在單個運營商的網絡上運行,你可以實驗,看看它的工作原理,但如果沒有你可能會更好,更容易發現它在「中間」使用服務器:

  • 設備A connectes到服務器
  • 設備B connectes到服務器
  • 設備A請求連接的設備的地址的服務器和「發現的」設備B
  • 設備A發送消息給設備B.它實際上將消息發送到服務器並指示它將被髮送到設備B
  • 服務器通知設備B一條消息可用於它(使用某種類型的消息通知,例如Google Cloud Messaging或只需通過設備定期輪詢,看看他們是否有任何消息)。
  • 設備B從服務器

以上將工作在幾乎任何網絡,允許連接到互聯網獲取信息。它的缺點是需要服務器,但它可能是大多數移動網絡的必要方法。

+0

我很感謝你的回答。但是,我的問題是設備不會在同一個Wi-Fi網絡上。他們將比彼此更遠。此解決方案是否有效? – 2015-03-16 05:27:40

+0

是的,只要您知道每個設備(或URL)的公共IP地址就行。您還需要了解任何防火牆問題。 – Mick 2015-03-16 09:05:46

+0

這聽起來像解決我的問題,因此我會接受它作爲答案。我想弄清楚在通信之前獲取服務器的IP地址,以便客戶端可以發送數據並接收響應。先生,謝謝你。 – 2015-03-18 23:49:06

相關問題