2

我有一些在Android上工作了幾年的網絡代碼。現在,運行Android 6.0的設備只能部分工作。我還從用戶那裏得到了關於在三星Tab S2上運行時可能由相同問題導致的問題的報告,但我不知道他們正在運行的操作系統版本。基本上,這些設備似乎傳輸得很好,但實際上並沒有收到任何數據。同一網絡上的其他設備可以毫無問題地發送和接收數據。但有些警告(請參閱下文),但設置正常。Android多播工作非常不可靠

我猜目前爲止,我的Android 6.0設備沒有正確加入多播組。但是這並不能解釋爲什麼一臺路由器似乎工作正常。任何想法如何解決它,以便所有有效的多播地址正常工作?如果沒有修復,那麼爲非路由消息使用保留的224.0.0.251地址有多糟?

設備:
A - 注5運行的是Android 5.1.1
乙 - NVIDIA SHIELD平板運行Android 6.0

路由器:
X - WIFI的Linksys EA4500路由器
Ÿ - WIFI的Windows 10的PC主機網絡

發現:
1 - UDP/TCP單播似乎工作兩個設備和路由器上細
2 - UDP多播工作機智h路由器X上的224.0.0.251(未嘗試路由器Y)
3 - UDP多播在路由器Y上工作,地址爲239.2.3.1
4 - 地址爲239.2.3.1的UDP多播或任何其他有效地址我試過,部分在路由器X上工作。設備A可以tx/rx,設備B只能tx。

我有關清單的權限:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 

這裏是簡化代碼,已經爲所有其他設備的工作我用過:

try 
{ 
    mRxSocket = new MulticastSocket(APort); 

    mRxSocket.joinGroup(AMulticastAddress); 

    mRxSocket.setSoTimeout(0); 

    final WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 

    mMyMulticastLock = wm.createMulticastLock("WAKELOCK_STRING"); 
    mMyMulticastLock.acquire(); 

    int maxPacketSize = 1024*64; 
    final byte packetBuffer[] = new byte[maxPacketSize]; 
    final DatagramPacket packet = new DatagramPacket(packetBuffer, maxPacketSize); 

    mRxSocket.receive(packet); 

    // it never gets past the receive call. No data is ever received by this thread... 
} 
catch(final IOException e) 
{ 
    mRxSocket = null; 

    //connection failed 

    //never gets here unless the network is disconnected 
} 
+0

你更新你的應用程序要求對運行時的權限? http://developer.android.com/intl/es/training/permissions/requesting.html – AndroidRuntimeException

回答

-1

多播是在5.0和增長被禁用默認...不知道爲什麼谷歌會做這樣的事情。但唯一的解決辦法,我能找到的與閃播定製的內核啓用

您也可以嘗試將多播到單播

+0

這需要引文 – pfn