OSDN Git Service

WIFIの接続が切れていたのを少し変更する。
authorMRSa <mrsa@myad.jp>
Mon, 18 Jan 2021 15:16:48 +0000 (00:16 +0900)
committerMRSa <mrsa@myad.jp>
Mon, 18 Jan 2021 15:16:48 +0000 (00:16 +0900)
.idea/caches/build_file_checksums.ser
app/build.gradle
wear/src/main/java/jp/sfjp/gokigen/a01c/IWifiConnection.java [new file with mode: 0644]
wear/src/main/java/jp/sfjp/gokigen/a01c/MainActivity.java
wear/src/main/java/jp/sfjp/gokigen/a01c/WifiConnection.kt [new file with mode: 0644]
wear/src/main/java/jp/sfjp/gokigen/a01c/olycamerawrapper/OlyCameraConnection.java
wear/src/main/res/layout-notround/activity_main.xml

index c12665b..f420ffa 100644 (file)
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
index 33c3ff4..8738d0b 100644 (file)
@@ -46,5 +46,4 @@ dependencies {
     implementation 'com.google.android.material:material:1.2.1'
     implementation "androidx.core:core-ktx:1.3.2"
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-
 }
diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/IWifiConnection.java b/wear/src/main/java/jp/sfjp/gokigen/a01c/IWifiConnection.java
new file mode 100644 (file)
index 0000000..2ad2b22
--- /dev/null
@@ -0,0 +1,6 @@
+package jp.sfjp.gokigen.a01c;
+
+public interface IWifiConnection
+{
+    void onConnectedToWifi();
+}
index b2c6ed9..7873ba5 100644 (file)
@@ -37,7 +37,7 @@ import jp.sfjp.gokigen.a01c.thetacamerawrapper.ThetaCameraController;
  *   メインのActivity
  *
  */
-public class MainActivity extends AppCompatActivity implements  IChangeScene, IShowInformation, ICameraStatusReceiver, IDialogDismissedNotifier
+public class MainActivity extends AppCompatActivity implements  IChangeScene, IShowInformation, ICameraStatusReceiver, IDialogDismissedNotifier, IWifiConnection
 {
     private final String TAG = toString();
     static final int REQUEST_NEED_PERMISSIONS = 1010;
@@ -54,6 +54,7 @@ public class MainActivity extends AppCompatActivity implements  IChangeScene, IS
     private FavoriteSettingSelectionDialog selectionDialog = null;
     private Vibrator vibrator = null;
     private boolean cameraDisconnectedHappened = false;
+    private WifiConnection wifiConnection = null;
     //private boolean ambientMode = false;
 
     /**
@@ -113,6 +114,8 @@ public class MainActivity extends AppCompatActivity implements  IChangeScene, IS
             setupCameraCoordinator();
             setupInitialButtonIcons();
             setupActionListener();
+
+            wifiConnection = new WifiConnection(this, this);
         }
         catch (Exception e)
         {
@@ -128,6 +131,12 @@ public class MainActivity extends AppCompatActivity implements  IChangeScene, IS
     {
         super.onResume();
         Log.v(TAG, "onResume()");
+        if (wifiConnection != null)
+        {
+            // ネットワークを要求する!
+            wifiConnection.requestNetwork();
+            wifiConnection.startWatchWifiStatus();
+        }
     }
 
     /**
@@ -993,4 +1002,17 @@ public class MainActivity extends AppCompatActivity implements  IChangeScene, IS
             }
         });
     }
+
+    @Override
+    public void onConnectedToWifi()
+    {
+        try
+        {
+            Log.v(TAG, "onConnectedToWifi()");
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
 }
diff --git a/wear/src/main/java/jp/sfjp/gokigen/a01c/WifiConnection.kt b/wear/src/main/java/jp/sfjp/gokigen/a01c/WifiConnection.kt
new file mode 100644 (file)
index 0000000..9103772
--- /dev/null
@@ -0,0 +1,245 @@
+package jp.sfjp.gokigen.a01c
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.net.ConnectivityManager
+import android.net.ConnectivityManager.NetworkCallback
+import android.net.Network
+import android.net.NetworkCapabilities
+import android.net.NetworkRequest
+import android.net.wifi.WifiManager
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.util.Log
+import androidx.appcompat.app.AppCompatActivity
+import java.util.concurrent.TimeUnit
+
+class WifiConnection(private val context: AppCompatActivity, private val callback : IWifiConnection)
+{
+    private var isWatchingWifiStatus = false
+
+    private val connectivityManager: ConnectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+    private val connectionReceiver: BroadcastReceiver = object : BroadcastReceiver()
+    {
+        override fun onReceive(context: Context, intent: Intent)
+        {
+            onReceiveBroadcastOfConnection(context, intent)
+        }
+    }
+
+    private val networkConnectionTimeoutHandler = object : Handler(Looper.getMainLooper())
+    {
+        override fun handleMessage(msg: Message)
+        {
+            when (msg.what) {
+                MESSAGE_CONNECTIVITY_TIMEOUT -> {
+                    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)
+    }
+}
index 9daeffa..413cf73 100644 (file)
@@ -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)
index 8649117..2ae93a8 100644 (file)
@@ -10,7 +10,7 @@
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:padding="1dp"
+        android:padding="0dp"
         app:layout_box="all">
 
         <jp.sfjp.gokigen.a01c.liveview.CameraLiveImageView