Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to receive Multicast packets on Android

Tags:

android

I'm trying to receive data from a multicast address, but the call to MulticastSocket.receive() blocks until a timeout takes place. I did some network sniffing and found out that my device (and the emulator) never send a MulticastSocket.joinGroup request. I tried running the same Java code from my PC as a standalone application and it worked well. Could it be that the Android platform blocks IGMP join requests? Has anyone succeeded with Multicast on Android before?

My manifest file contains the following permission:

I am running my application on 2.1 (Both emulator & device).

Any ideas anyone?

Thanks,

like image 300
Eyal Avatar asked Jul 05 '10 13:07

Eyal


2 Answers

Lukas gives the best explanation and examples that I've seen on his blog: http://codeisland.org/2012/udp-multicast-on-android

In summary:
1. You need the permissions:

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


2. You need a lock:

    WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
    if (wifi != null){
        WifiManager.MulticastLock lock = wifi.createMulticastLock("mylock");
        lock.acquire();
    }


3. You have to have a device that supports receiving multicast. Or you can follow his work around for rooted devices.

like image 96
Paul Gregoire Avatar answered Oct 18 '22 14:10

Paul Gregoire


As it seems, there is no proper multicast support in the emulator.

Here's a bug report and related thread. It is being fixed for froyo.

like image 27
Milan Avatar answered Oct 18 '22 13:10

Milan