/* SonyCameraUtil Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.sonycamera.utils; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import org.json.JSONObject; /** * ユーティリティクラス. * * @author NTT DOCOMO, INC. */ public final class SonyCameraUtil { /** * SonyCameraのWiFiのプレフィックス. */ private static final String WIFI_PREFIX = "DIRECT-"; /** * Camera Remote APIに対応したWiFiのSSIDのサフィックスを定義. */ private static final String[] CAMERA_SUFFIX = {"HDR-AS100", "ILCE-6000", "DSC-HC60V", "DSC-HX400", "ILCE-5000", "DSC-QX10", "DSC-QX100", "HDR-AS15", "HDR-AS30", "HDR-MV1", "NEX-5R", "NEX-5T", "NEX-6", "ILCE-7R/B", "ILCE-7/B"}; /** * 撮影画像サイズ20Mの場合のピクセル数. */ private static final int PIXELS_20_M = 20000000; /** * 撮影画像サイズ18Mの場合のピクセル数. */ private static final int PIXELS_18_M = 18000000; /** * 撮影画像サイズ17Mの場合のピクセル数. */ private static final int PIXELS_17_M = 17000000; /** * 撮影画像サイズ13Mの場合のピクセル数. */ private static final int PIXELS_13_M = 13000000; /** * 撮影画像サイズ7.5Mの場合のピクセル数. */ private static final int PIXELS_7_5_M = 7500000; /** * 撮影画像サイズ25Mの場合のピクセル数. */ private static final int PIXELS_5_M = 5000000; /** * 撮影画像サイズ4.2Mの場合のピクセル数. */ private static final int PIXELS_4_2_M = 4200000; /** * 撮影画像サイズ3.7Mの場合のピクセル数. */ private static final int PIXELS_3_7_M = 3700000; /** * 動画撮影モード. */ private static final String SONY_CAMERA_SHOOT_MODE_MOVIE = "movie"; /** * 静止画撮影モード. */ private static final String SONY_CAMERA_SHOOT_MODE_PIC = "still"; /** * 撮影中. */ private static final String SONY_CAMERA_STATUS_RECORDING = "MovieRecording"; /** * 停止中. */ private static final String SONY_CAMERA_STATUS_IDLE = "IDLE"; /** * Sonyカメラの状態を定義します. */ public enum SonyCameraStatus { None(""), Recording(SONY_CAMERA_STATUS_RECORDING), Idle(SONY_CAMERA_STATUS_IDLE); private String mValue; SonyCameraStatus(final String value) { mValue = value; } public String getValue() { return mValue; } public static SonyCameraStatus getStatus(final String status) { for (SonyCameraStatus s : values()) { if (s.mValue.equals(status)) { return s; } } return None; } } /** * Sonyカメラの撮影モードを定義します. */ public enum SonyCameraMode { None(""), Movie(SONY_CAMERA_SHOOT_MODE_MOVIE), Picture(SONY_CAMERA_SHOOT_MODE_PIC); private String mValue; SonyCameraMode(final String value) { mValue = value; } public String getValue() { return mValue; } public static SonyCameraMode getMode(final String mode) { for (SonyCameraMode s : values()) { if (s.mValue.equals(mode)) { return s; } } return None; } } /** * コンストラクタ. ユーティリティクラスなのでprivateにしておく。 */ private SonyCameraUtil() { } /** * 指定されたSSIDがSonyCameraデバイスのWifiのSSIDかチェックする. * * @param ssid SSID * @return SonyCameraデバイスのSSIDの場合はtrue、それ以外はfalse */ public static boolean checkSSID(final String ssid) { if (ssid == null) { return false; } String id = ssid.replace("\"", ""); if (id.startsWith(WIFI_PREFIX)) { for (String aCAMERA_SUFFIX : CAMERA_SUFFIX) { if (id.indexOf(aCAMERA_SUFFIX) > 0) { return true; } } } return false; } /** * ピクセル数計算用メソッド. * * @param widthVal width * @param heightVal height * @param size aspect * @return stillSize */ public static double pixelValueCalculate(final int widthVal, final int heightVal, final String size) { int pixels; double pixelValue = 0; switch (size) { case "20M": pixels = PIXELS_20_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "18M": pixels = PIXELS_18_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "17M": pixels = PIXELS_17_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "13M": pixels = PIXELS_13_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "7.5M": pixels = PIXELS_7_5_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "5M": pixels = PIXELS_5_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "4.2M": pixels = PIXELS_4_2_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; case "3.7M": pixels = PIXELS_3_7_M; pixelValue = Math.sqrt(pixels / (widthVal * heightVal)); break; } return pixelValue; } /** * カメラの状態をDeviceConnectの状態に変換する. * * @param cameraState カメラの状態 * @return DeviceConnectの状態 */ public static String convertCameraState(final String cameraState) { if (cameraState == null) { return "unknown"; } else if (cameraState.equals("Error") || cameraState.equals("NotReady") || cameraState.equals("MovieSaving") || cameraState.equals("AudioSaving") || cameraState.equals("StillSaving") || cameraState.equals("IDLE")) { return "inactive"; } else if (cameraState.equals("StillCapturing") || cameraState.equals("MediaRecording") || cameraState.equals("AudioRecording") || cameraState.equals("IntervalRecording")) { return "recording"; } else if (cameraState.equals("MovieWaitRecStart") || cameraState.equals("MoviewWaitRecStop") || cameraState.equals("AudioWaitRecStart") || cameraState.equals("AudioRecWaitRecStop") || cameraState.equals("IntervalWaitRecStart") || cameraState.equals("IntervalWaitRecStop")) { return "paused"; } else { return "unknown"; } } /** * SonyCameraからの返り値のエラーチェック. * * @param replyJson レスポンスJSON * @return エラーの場合はtrue、それ以外はfalse */ public static boolean isErrorReply(final JSONObject replyJson) { return (replyJson != null && replyJson.has("error")); } /** * SSIDに付いている、"を削除します. * @param ssid WiFiのSSID * @return "を省いたSSID */ public static String ssid(final String ssid) { if (ssid == null) { return null; } else { String a = ssid; if (a.startsWith("\"")) { a = a.substring(1); } if (a.endsWith("\"")) { a = a.substring(0, a.length() - 1); } return a; } } /** * WifiManagerを取得する. * * @return WifiManagerのインスタンス */ private static WifiManager getWifiManager(final Context context) { return (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); } /** * ConnectivityManagerを取得する. * * @return ConnectivityManagerのインスタンス */ private static ConnectivityManager getConnectivityManager(final Context context) { return (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); } /** * 接続中のWiFiのSSIDを取得します. * <p> * WiFi以外に接続されている場合にはnullを返却します。 * </p> * @return SSID */ public static String getSSID(final Context context) { ConnectivityManager connMgr = getConnectivityManager(context); NetworkInfo info = connMgr.getActiveNetworkInfo(); if (info != null && info.getType() == ConnectivityManager.TYPE_WIFI) { WifiManager wifiMgr = getWifiManager(context); WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); if (wifiInfo == null) { return null; } else { return ssid(wifiInfo.getSSID()); } } else { return null; } } }