From 943d75149a120b4e9dd3c5e44143cda335e45815 Mon Sep 17 00:00:00 2001 From: MRSa Date: Tue, 19 Jan 2021 00:16:48 +0900 Subject: [PATCH 1/1] =?utf8?q?WIFI=E3=81=AE=E6=8E=A5=E7=B6=9A=E3=81=8C?= =?utf8?q?=E5=88=87=E3=82=8C=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?utf8?q?=E5=B0=91=E3=81=97=E5=A4=89=E6=9B=B4=E3=81=99=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .idea/caches/build_file_checksums.ser | Bin 582 -> 582 bytes app/build.gradle | 1 - .../java/jp/sfjp/gokigen/a01c/IWifiConnection.java | 6 + .../java/jp/sfjp/gokigen/a01c/MainActivity.java | 24 +- .../java/jp/sfjp/gokigen/a01c/WifiConnection.kt | 245 +++++++++++++++++++++ .../a01c/olycamerawrapper/OlyCameraConnection.java | 4 +- .../src/main/res/layout-notround/activity_main.xml | 2 +- 7 files changed, 277 insertions(+), 5 deletions(-) create mode 100644 wear/src/main/java/jp/sfjp/gokigen/a01c/IWifiConnection.java create mode 100644 wear/src/main/java/jp/sfjp/gokigen/a01c/WifiConnection.kt diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index c12665b4b5504c4286b2c48c8a465f022524a008..f420ffa89548b31f846e4069694e7766dc71e883 100644 GIT binary patch delta 37 vcmV+=0NVe?1jYoAmj!ng3m(XkoOclRawH4SeP5BGRB0XNHSzzmBLO1;Ao~wT delta 37 tcmX@ca*Sodbk?%7+B?rooKr3k_DMb`CBs{On%|7_*1IJ^o0S=r838 { + Log.d(TAG, "Network connection timeout") + unregisterNetworkCallback() + } + } + } + } + + private val networkCallback = object : NetworkCallback() + { + override fun onAvailable(network: Network) { + networkConnectionTimeoutHandler.removeMessages(MESSAGE_CONNECTIVITY_TIMEOUT) + context.runOnUiThread { + if (!connectivityManager.bindProcessToNetwork(network)) + { + Log.e(TAG, "ConnectivityManager.bindProcessToNetwork() requires android.permission.INTERNET") + } + else + { + Log.d(TAG, "Network available") + } + } + } + + override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) + { + context.runOnUiThread { Log.d(TAG, "Network capabilities changed") } + } + + override fun onLost(network: Network) + { + Log.d(TAG, "Network lost") + } + } + + + init + { + Log.v(TAG, "WifiConnection()") + requestHighBandwidthNetwork() +/* + Network activeNetwork = connectivityManager.getActiveNetwork(); + if (activeNetwork != null) + { + int bandwidth = connectivityManager.getNetworkCapabilities(activeNetwork).getLinkDownstreamBandwidthKbps(); + if (bandwidth < MIN_BANDWIDTH_KBPS) + { + // Request a high-bandwidth network + } + } + else + { + // You already are on a high-bandwidth network, so start your network request + } +*/ + +/* + Network activeNetwork = connectivityManager.getActiveNetwork(); + if (activeNetwork != null) + { + int bandwidth = connectivityManager.getNetworkCapabilities(activeNetwork).getLinkDownstreamBandwidthKbps(); + if (bandwidth < MIN_BANDWIDTH_KBPS) + { + // Request a high-bandwidth network + } + } + else + { + // You already are on a high-bandwidth network, so start your network request + } +*/ + } + + // Determine if there is a high-bandwidth network exists. Checks both the active + // and bound networks. Returns false if no network is available (low or high-bandwidth). + private fun isNetworkHighBandwidth(): Boolean + { + var network: Network? = connectivityManager.boundNetworkForProcess + network = network ?: connectivityManager.activeNetwork + if (network == null) + { + return (false) + } + val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return (false) + return (networkCapabilities.linkDownstreamBandwidthKbps >= MIN_NETWORK_BANDWIDTH_KBPS) + } + + + private fun unregisterNetworkCallback() + { + Log.d(TAG, "Unregistering network callback") + connectivityManager.unregisterNetworkCallback(networkCallback) + } + + private fun releaseHighBandwidthNetwork() + { + connectivityManager.bindProcessToNetwork(null) + unregisterNetworkCallback() + } + + private fun addWifiNetwork() + { + // requires android.permission.CHANGE_WIFI_STATE + context.applicationContext.startActivity(Intent(ACTION_ADD_NETWORK_SETTINGS)) + } + + /** + * Wifiが使える状態だったら、カメラと接続して動作するよ + * + */ + @Suppress("DEPRECATION") + private fun onReceiveBroadcastOfConnection(context: Context, intent: Intent) + { + Log.v(TAG, context.getString(R.string.connect_check_wifi)) + try + { + val action = intent.action + if (action == ConnectivityManager.CONNECTIVITY_ACTION) + { + val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + val info = wifiManager.connectionInfo + if (wifiManager.isWifiEnabled) + { + if ((info != null)&&(info.networkId != -1)) + { + Log.v(TAG, " READY TO CONNECT CAMERA. " + info.networkId) + } + callback.onConnectedToWifi() + } + } + } + catch (e : Exception) + { + e.printStackTrace() + } + } + + fun requestNetwork() + { + Log.v(TAG, " requestNetwork()") + requestHighBandwidthNetwork() + } + + /** + * Wifi接続状態の監視 + * (接続の実処理は onReceiveBroadcastOfConnection() で実施) + */ + @Suppress("DEPRECATION") + fun startWatchWifiStatus() + { + Log.v(TAG, "startWatchWifiStatus()") + val filter = IntentFilter() + filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION) + filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION) + context.registerReceiver(connectionReceiver, filter) + isWatchingWifiStatus = true + } + + /** + * Wifi接続状態の監視終了 + */ + fun stopWatchWifiStatus() + { + Log.v(TAG, "stopWatchWifiStatus()") + context.unregisterReceiver(connectionReceiver) + isWatchingWifiStatus = false + } + + /** + * Wifi接続状態の監視処理を行っているかどうか + * + * @return true : 監視中 / false : 停止中 + */ + fun isWatchWifiStatus(): Boolean + { + return isWatchingWifiStatus + } + + private fun requestHighBandwidthNetwork() + { + // Before requesting a high-bandwidth network, ensure prior requests are invalidated. + unregisterNetworkCallback() + Log.d(TAG, "requestHighBandwidthNetwork(): Requesting high-bandwidth network") + + // Requesting an unmetered network may prevent you from connecting to the cellular + // network on the user's watch or phone; however, unless you explicitly ask for permission + // to a access the user's cellular network, you should request an unmetered network. + val request = NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .build() + + // requires android.permission.CHANGE_NETWORK_STATE + connectivityManager.requestNetwork(request, networkCallback) + networkConnectionTimeoutHandler.sendMessageDelayed(networkConnectionTimeoutHandler.obtainMessage(MESSAGE_CONNECTIVITY_TIMEOUT), NETWORK_CONNECTIVITY_TIMEOUT_MS) + } + + companion object + { + private val TAG = WifiConnection::class.java.simpleName + private const val MESSAGE_CONNECTIVITY_TIMEOUT = 1 + private const val MIN_NETWORK_BANDWIDTH_KBPS = 10000 + private const val ACTION_ADD_NETWORK_SETTINGS = "com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS" + private val NETWORK_CONNECTIVITY_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(2000) + } +} diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraConnection.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraConnection.java index 9daeffa..413cf73 100644 --- a/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraConnection.java +++ b/wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraConnection.java @@ -12,6 +12,7 @@ import android.net.NetworkRequest; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.util.Log; @@ -52,7 +53,6 @@ class OlyCameraConnection implements ICameraConnection, OLYCameraConnectionListe // Handler for dealing with network connection timeouts. private final Handler networkConnectionTimeoutHandler; - // Message to notify the network request timout handler that too much time has passed. private static final int MESSAGE_CONNECTIVITY_TIMEOUT = 1; @@ -86,7 +86,7 @@ class OlyCameraConnection implements ICameraConnection, OLYCameraConnectionListe this.context = context; this.camera = camera; this.connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); - this.networkConnectionTimeoutHandler = new Handler() + this.networkConnectionTimeoutHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) diff --git a/wear/src/main/res/layout-notround/activity_main.xml b/wear/src/main/res/layout-notround/activity_main.xml index 8649117..2ae93a8 100644 --- a/wear/src/main/res/layout-notround/activity_main.xml +++ b/wear/src/main/res/layout-notround/activity_main.xml @@ -10,7 +10,7 @@