Android中怎么打开Wifi的组播功能

时间:2025-03-22 07:56:57
       了解Android的都知道Android的wifi在默认的情况下是不接收组播的,默认情况下,应用是不接收组播信息的,这样要接收处理的报文太多,很快就会把电池用尽。要知道移动设备(特指电话一类的,平板要好得多)目前最重要的因素是电量。下面就看看怎么样打开Android中Wifi的组播功能。主要有以下几个步骤:

在Manifest文件中加入:.CHANGE_WIFI_MULTICAST_STATE,这个权限

获取到MulticastLock对象,这个对象不能直接实例化,要通过WifiManager间接得到,工厂模式

调用MulticastLock对象的acquire方法,获取到组播锁

相应的,用完组播,为了不浪费电力,要调用MulticastLock的release方法释放锁

下面写了个简单示例,通过组播发现服务器。

Activity写的比较简单

public class MulticastDemoActivity extends Activity {

MulticastLock multicastLock;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

(savedInstanceState);

setContentView();

allowMulticast();

try {

();

} catch (IOException e) {

throw new RuntimeException(e);

}

("", "find ip ok.");

();

}

private void allowMulticast(){

WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);

multicastLock=("");

();

}

}

在Activity中打开和释放组播锁。使用组播发送报文和接收ip地址信息的工具类代码:

public class NetUtil {

private static final String TAG="";

private static final int MULTICAST_PORT=5111;

private static final String GROUP_IP="224.5.0.7";

private static byte[] sendData;

static{

sendData=new byte[4];

// 0xEE78F1FB

sendData[3] = (byte) 0xEE;

sendData[2] = (byte) 0×78;

sendData[1] = (byte) 0xF1;

sendData[0] = (byte) 0xFB;

}

public static String findServerIpAddress() throws IOException{

String ip=null;

MulticastSocket multicastSocket=new MulticastSocket(MULTICAST_PORT);

(true);

InetAddress group = (GROUP_IP);

(group);

DatagramPacket packet=new DatagramPacket(sendData, ,group,MULTICAST_PORT);

for(;;){

(packet);

(TAG,">>>send packet ok");

byte[] receiveData=new byte[256];

packet=new DatagramPacket(receiveData, );

(packet);

String packetIpAddress=().toString();

packetIpAddress=(1, ());

(TAG,"packet ip address: "+packetIpAddress);

StringBuilder packetContent=new StringBuilder();

for(int i=0;i<;i++){

if(receiveData[i]==0){

break;

}

((char)receiveData[i]);

}

ip=();

(TAG,"packet content ip is: "+ip);

if((packetIpAddress)){

(TAG,"find server ip address: "+ip);

break;

}else{

(TAG,"not find server ip address, continue …");

try {

(1000);

} catch (InterruptedException e) {

}

}

}

return ip;

}

}