Java tutorial
/* * Project MOST - Moving Outcomes to Standard Telemedicine Practice * http://most.crs4.it/ * * Copyright 2014, CRS4 srl. (http://www.crs4.it/) * Dual licensed under the MIT or GPL Version 2 licenses. * See license-GPLv2.txt or license-MIT.txt */ package most.voip.api; import java.io.*; import java.net.*; import java.util.*; import org.apache.http.conn.util.InetAddressUtils; import android.content.Context; import android.content.res.AssetManager; import android.util.Log; public class Utils { private static final String TAG = "VoipLibUtils"; /** * Convert byte array to hex string * @param bytes * @return */ public static String bytesToHex(byte[] bytes) { StringBuilder sbuf = new StringBuilder(); for (int idx = 0; idx < bytes.length; idx++) { int intVal = bytes[idx] & 0xff; if (intVal < 0x10) sbuf.append("0"); sbuf.append(Integer.toHexString(intVal).toUpperCase()); } return sbuf.toString(); } /** * Get utf8 byte array. * @param str * @return array of NULL if error was found */ public static byte[] getUTF8Bytes(String str) { try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; } } /** * Load UTF8withBOM or any ansi text file. * @param filename * @return * @throws java.io.IOException */ public static String loadFileAsString(String filename) throws java.io.IOException { final int BUFLEN = 1024; BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN); byte[] bytes = new byte[BUFLEN]; boolean isUTF8 = false; int read, count = 0; while ((read = is.read(bytes)) != -1) { if (count == 0 && bytes[0] == (byte) 0xEF && bytes[1] == (byte) 0xBB && bytes[2] == (byte) 0xBF) { isUTF8 = true; baos.write(bytes, 3, read - 3); // drop UTF8 bom marker } else { baos.write(bytes, 0, read); } count += read; } return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray()); } finally { try { is.close(); } catch (Exception ex) { } } } /** * Returns MAC address of the given interface name. * @param interfaceName eth0, wlan0 or NULL=use first interface * @return mac address or empty string */ public static String getMACAddress(String interfaceName) { try { List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { if (interfaceName != null) { if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; } byte[] mac = intf.getHardwareAddress(); if (mac == null) return ""; StringBuilder buf = new StringBuilder(); for (int idx = 0; idx < mac.length; idx++) buf.append(String.format("%02X:", mac[idx])); if (buf.length() > 0) buf.deleteCharAt(buf.length() - 1); return buf.toString(); } } catch (Exception ex) { } // for now eat exceptions return ""; /*try { // this is so Linux hack return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim(); } catch (IOException ex) { return null; }*/ } /** * Get IP address from first non-localhost interface * @param ipv4 true=return ipv4, false=return ipv6 * @return address or empty string */ public static String getIPAddress(boolean useIPv4) { try { List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); for (InetAddress addr : addrs) { if (!addr.isLoopbackAddress()) { String sAddr = addr.getHostAddress().toUpperCase(); boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); if (useIPv4) { if (isIPv4) return sAddr; } else { if (!isIPv4) { int delim = sAddr.indexOf('%'); // drop ip6 port suffix return delim < 0 ? sAddr : sAddr.substring(0, delim); } } } } } } catch (Exception ex) { } // for now eat exceptions return ""; } static void copyAssets(Context ctx) { AssetManager assetManager = ctx.getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e) { Log.e(TAG, "Failed to get asset file list.", e); } for (String filename : files) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(filename); File outFile = new File(ctx.getExternalFilesDir(null), filename); Log.d(TAG, "Copying asset to " + outFile.getAbsolutePath()); out = new FileOutputStream(outFile); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch (IOException e) { Log.e("tag", "Failed to copy asset file: " + filename, e); } } } /** * Copy the specified resource file from the assets folder into the "files dir" of this application, so that this resource * can be opened by the Voip Lib by providing it the absolute path of the copied resource * @param ctx The application context * @param assetPath The path of the resource (e.g on_hold.wav or sounds/on_hold.wav) * @return the absolute path of the copied resource, or null if no file was copied. */ public static String getResourcePathByAssetCopy(Context ctx, String assetSubFolder, String fileToCopy) { Log.d(TAG, "getResourcePathByAssetCopy on folder *" + assetSubFolder + "* for file:" + fileToCopy); AssetManager assetManager = ctx.getAssets(); String[] files = null; String filename = null; try { files = assetManager.list(assetSubFolder); Log.d(TAG, "Found " + files.length + " files"); if (files.length > 0) { for (String f : files) { Log.d(TAG, "Found resource:" + f); if (f == null) continue; if (f.equals(fileToCopy)) { filename = f; break; } } Log.d(TAG, "Found:" + filename); if (filename == null) return null; InputStream in = null; OutputStream out = null; try { in = assetManager.open(filename); File outFile = new File(ctx.getExternalFilesDir(null), filename); Log.d(TAG, "Copying asset to " + outFile.getAbsolutePath()); out = new FileOutputStream(outFile); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; return outFile.getAbsolutePath(); } catch (IOException e) { Log.e(TAG, "Failed to copy asset file: " + filename, e); } } } catch (IOException e) { Log.e(TAG, "Failed to get asset file list.", e); } return null; } private static void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } } }