Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android中怎麼打開Wifi的組播功能

Android中怎麼打開Wifi的組播功能

編輯:Android開發實例

  了解Android的都知道Android的wifi在默認的情況下是不接收組播的,默認情況下,應用是不接收組播信息的,這樣要接收處理的報文太多,很快就會把電池用盡。要知道移動設備(特指電話一類的,平板要好得多)目前最重要的因素是電量。下面就看看怎麼樣打開Android中Wifi的組播功能。主要有以下幾個步驟:

  在Manifest文件中加入:android.permission.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) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  allowMulticast();

  try {

  NetUtil.findServerIpAddress();

  } catch (IOException e) {

  throw new RuntimeException(e);

  }

  Log.d("multicast.demo", "find ip ok.");

  multicastLock.release();

  }

  private void allowMulticast(){

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

  multicastLock=wifiManager.createMulticastLock("multicast.test");

  multicastLock.acquire();

  }

  }

  在Activity中打開和釋放組播鎖。使用組播發送報文和接收ip地址信息的工具類代碼:

  public class NetUtil {

  private static final String TAG="Net.Utils";

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

  multicastSocket.setLoopbackMode(true);

  InetAddress group = InetAddress.getByName(GROUP_IP);

  multicastSocket.joinGroup(group);

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

  for(;;){

  multicastSocket.send(packet);

  Log.d(TAG,">>>send packet ok");

  byte[] receiveData=new byte[256];

  packet=new DatagramPacket(receiveData, receiveData.length);

  multicastSocket.receive(packet);

  String packetIpAddress=packet.getAddress().toString();

  packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length());

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

  StringBuilder packetContent=new StringBuilder();

  for(int i=0;i<receiveData.length;i++){

  if(receiveData[i]==0){

  break;

  }

  packetContent.append((char)receiveData[i]);

  }

  ip=packetContent.toString();

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

  if(ip.equals(packetIpAddress)){

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

  break;

  }else{

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

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  }

  }

  }

  return ip;

  }

  }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved