androidandroid-10.0theta360networkspecifierricoh-theta

Android: Ricoh Theta connection issue using Android API 29


Using an Android device I connect to the Theta camera to shoot 360 photos. Till API level 28, our existing code works fine, but with the new API 29, wifi(hotspot) connection functions are deprecated and with the new NetworkSpecifier function, I can connect to the device; but I can't not make any API request to the Theta camera.

Like GET http://192.168.1.1/osc/info request always fail, even in mobile web-browser. Error Message:

Caused by: java.net.ConnectException: failed to connect to /192.168.1.1 (port 80) from /:: (port 0) after 10000ms: connect failed: ENETUNREACH (Network is unreachable)

Here is my code snap to connect to the Theta camera.

final WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
             //.setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX))
               .setSsid(ssid)
               .setWpa2Passphrase(passPhrase)
               .setBssid(MacAddress.fromString(i.BSSID))
               .build();
               
final NetworkRequest request = new NetworkRequest.Builder()
                        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                        .setNetworkSpecifier(specifier)
                        .build();

final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(@NonNull android.net.Network network) {super.onAvailable(network);}
            @Override
            public void onUnavailable() { super.onUnavailable();}
            @Override
            public void onLost(@NonNull android.net.Network network) { super.onLost(network);}
        };
//connectivityManager.registerNetworkCallback(request, networkCallback);
connectivityManager.requestNetwork(request, networkCallback);
                            
                            

As I said, i can connect to the Theta camera and my Android device wifi connection shows, 'Connected via MyApp'. But the API's to communicate with the device always fail. NOW, if I manually connect the device by going into my device wifi settings and select the Theta camera.


Solution

  • I was able to figure out the issue and solve the problem. I need to bind the new network(Theta Camera) for all the outgoing traffic. It’s not mentioned in Android developer forum. So on network availability we need to do that. below is the code -

    private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    
    @Override
    public void onAvailable(@NonNull android.net.Network network) {
        super.onAvailable(network);
        connectivityManager.bindProcessToNetwork(network);
        Timber.d("++++++ network connected - %s", network.toString());
    }};