編輯:關於Android編程
DatagramSocket socket = new DatagramSocket(8000); socket.setBroadcast(true); InetAddress addr = InetAddress.getByName("255.255.255.255"); byte[] buffer = "Hello World".getBytes(); DatagramPacket packet = new DatagramPacket(buffer,buffer.length); packet.setAddress(addr); packet.setPort(8086); socket.send(packet);
下面分析其中需要注意的地方: 1. 不要在主線程中發送廣播包 當然,這個做Android開發的人應該都知道,不能在UI線程中執行任何網絡訪問相關的操作,由於廣播包的發送也屬於網絡操作,因此必須放到單獨的線程中執行。 2. 廣播地址不建議使用“255.255.255.255” 上述代碼中,廣播包的目標地址設置為了“255.255.255.255”,其實,這並不是一種推薦的做法。 “255.255.255.255” 是一種受限的廣播地址,常用於在計算機不知道自己IP地址的時候發送,比如設備啟動時向DHCP服務器索要地址等等,一般情況下,路由器不會轉發目標為受限廣播地址的廣播包。 而且,有些路由器/Wi-Fi熱點不支持該廣播地址(例如:用Android手機做Wi-Fi熱點的時候),因此在程序中會出現“ENETUNREACH (Network is unreachable)”的異常,因此,為了保證程序成功發送廣播包,建議使用直接廣播地址,例如:當前IP地址是 192.168.1.100,子網掩碼是 255.255.255.0 的情況下,廣播地址為:192.168.1.255,(具體的推算方法這裡就不展開了,可以參考計算機網絡相關書籍)。 那麼,如何得到本網段的直接廣播地址呢,下面是stackoverflow上面有位大牛分享的代碼:
public static InetAddress getBroadcastAddress(Context context) throws UnknownHostException { WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); DhcpInfo dhcp = wifi.getDhcpInfo(); if(dhcp==null) { return InetAddress.getByName("255.255.255.255"); } int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; byte[] quads = new byte[4]; for (int k = 0; k < 4; k++) quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); return InetAddress.getByAddress(quads); }
直接使用該函數即可得到正確的“廣播地址”,通過setAddress函數設置到DatagramPacket對象中即可。 3. Android設置為Wi-Fi熱點時的廣播地址 這是個比較大的坑,當Android設備被設置為Wi-Fi熱點的時候,上面的函數得到的地址是"0.0.0.0",因此,我們需要探究當Android設備被設置為Wi-Fi熱點的時候,它的IP地址究竟是多少? 有人研究了Android底層源碼發現,當Android設備被設置為Wi-Fi熱點的時候,其IP地址是hardcode寫死在源碼中的,地址是:“192.168.43.1”,對應的廣播地址是:"192.168.43.255" 為此,我們需要寫個函數來判斷一下當前Android手機是否處於Wi-Fi熱點模式下,如果是,則應該使用上面給出的這個廣播地址,這裡給出代碼示例:
protected static Boolean isWifiApEnabled(Context context) { try { WifiManager manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); Method method = manager.getClass().getMethod("isWifiApEnabled"); return (Boolean)method.invoke(manager); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } return false; }
Android SDK並沒有開放判斷是否處於熱點模式的API,因此,我們需要通過反射的方式來得到,另外,注意添加權限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
4. 小結
因為在framework中想添加這個功能,所以寫了個appliction來實現一下獲取正在運行的應用程序: 還是先看圖吧: 這個app主要是簡單的實現了獲取非系統的應用程
其實清除緩存是有兩種的,一種是清除手機rom裡面的緩存,一種是清除手機sd卡裡面的緩存,我們今天主要講的就是第一種 ps:這裡來一個知識掃盲,就是手機裡面的rom和r
經常我們會在應用中看到一個可以自動滾動,並且無限滾動的一個ViewPager,百度谷歌上面也有很多關於這方面的教程,但是感覺都略顯麻煩,而且封裝的都不是很徹底。所以試著封
本文分享自己在視頻錄制播放過程中遇到的一些問題,主要包括: 視頻錄制流程 視頻預覽及SurfaceHolder 視頻清晰度及文件大小 視頻文件旋轉 一、視頻錄制