mnet - crash if no internet connection

Monkey Targets Forums/Android/mnet - crash if no internet connection

matty(Posted 2011) [#1]
Hi all,

I've had a look at mnet for the purpose of using the httpget command, it works fine apart from one problem I'm having.

If I turn off the internet connection (airplane mode/mobile network off) on my phone then I simply get a crash / force close on my phone.

Is there some way of checking for a valid internet connection beforehand or at least returning a 'no internet connection' response of some sort.

Thanks,
Matt


therevills(Posted 2011) [#2]
Something like this:

  public static boolean isNetworkConnected( Context c )
  {
    boolean wifiConnected = false;
    boolean mobileConnected = false;

    ConnectivityManager cm = (ConnectivityManager)c.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo)
    {
      if ("WIFI".equalsIgnoreCase(ni.getTypeName()))
        if (ni.isConnected())
          wifiConnected = true;
      if ("MOBILE".equalsIgnoreCase(ni.getTypeName()))
        if (ni.isConnected())
          mobileConnected = true;
    }
    return wifiConnected || mobileConnected;
  }


And you need these permissions in the manifest:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />



Volker(Posted 2011) [#3]
I ran in the same problem here:
http://www.monkeycoder.co.nz/Community/posts.php?topic=1294&
No one answered, so I changed the mnet.android.java,
that it returns a "failed" string, if no connection is possible.
I can give no guarantee, but for my purposes it works so far.


// Android MNet runtime.
//
// Copyright 2011 Martin Leidel, all rights reserved.
//
// This software is provided 'as-is', without any express or implied
// warranty.  In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

class mnet
{
  public static String HttpGet( String url, int timeoutConnection, int timeoutSocket )
  {
    HttpURLConnection con = null;
    InputStream is = null;
    try 
    {
      URL connectToURL = new URL( url );
      con = ( HttpURLConnection )connectToURL.openConnection();
      con.setReadTimeout( timeoutSocket );
      con.setConnectTimeout( timeoutConnection );
      con.setRequestMethod( "GET" );
      con.setDoInput( true );
      // Start the query
      con.connect();
      is = con.getInputStream();
    }
    catch( IOException e ){
    return "failed"; ' changed by myself! *******************************
      }
    {
    }
    return convertStreamToString( is );
  }

  public static String convertStreamToString( InputStream is )
  {
    StringBuilder sb = new StringBuilder();
    try
    {
      BufferedReader reader = new BufferedReader( new InputStreamReader( is ) );
      String line = null;
      while( ( line = reader.readLine() ) != null )
      {
        sb.append( line + "\n" );
      }
      is.close();
    }
    catch( IOException e )
    {
    }
    return sb.toString();
  }
}



matty(Posted 2011) [#4]
Thanks all,

I added the following code to the mnet module:

(with the other import statements:)
import android.net.ConnectivityManager;

(inside mnet itself)
public static boolean isOnline()
	{
    	boolean var = false;
	    ConnectivityManager cm = (ConnectivityManager)MonkeyGame.activity.getSystemService(Context.CONNECTIVITY_SERVICE);
	    if ( cm.getActiveNetworkInfo() != null )
		{
	        var = true;
	    }
	    return var;
	} 
  

then use an 'if IsOnline' statement inside the HttpGet method.

Thanks therevills - I almost had it right - I kept getting an 'cannot find symobl' error because I was not using "MonkeyGame.activity." before getSystemService... this is a method I found on slashdot but it didn't work if I pasted it just as found...


matty(Posted 2011) [#5]
Interesting...it works if I'm using my mobile network, it also works if there is no internet connection (airplane mode or mobile network switched off) - I am able to handle the error and continue.

If I connect to my work's WiFi network it still force closes...not sure why...but when I'm connected to my work's WiFi network I have a connection according to my phone but I cannot browse the internet through the browser that comes with the phone either...

Hmmm - I wonder if I restrict the internet connectivity to only when the active connection is a mobile network if that would be acceptable? I'm not sure at which point it is falling over though - I think it establishes that there is a connection, and therefore "IsOnline" returns true, but for some reason it is unable to connect to the url with the httpget command...


matty(Posted 2011) [#6]
Actually - using Volker's method above as well seems to solve the problem.

So now I check for an internet connection first, and then output a response in the catch section if it fails.


Xaron(Posted 2011) [#7]
Will add that to MNet, thanks guys! :)


TueHald(Posted 2012) [#8]
When and where is the latest version of MNet available? Version at the Google Code page seems old.


Xaron(Posted 2012) [#9]
The download version is a bit old, I'll create a new one. I'll refactore the whole lib as well and I'm still in the process to add sockets.


Midimaster(Posted 2012) [#10]
@Xaron

Thank you for this nice tool...

did you meanwhile update your mnet? I still get this error, when connection runs out of time...

Tested with android smartphone and LAN and Xampp Server:
When I access "http://192.168.2.105/VoteServer/index.php" it workes fine, when I access "http://192.168.2.105" it crashes!


Or Is there any chance to do a (Monkey-sided) workaround to the returned empty string? It looks like Monkey cannot handle or check such strings:


[monkeycode]Result=Server.Get( Adress, 3000 )
If Result=NULL[/monkeycode]
gives...
"Cannot convert von {NULL} to String"

and this....
[monkeycode]Result=Server.Get( Adress, 3000 )
If Result=""[/monkeycode]
gives a crash...
"Monkey Runtime Error : Attempt to acess null object"

And I have the feeling, that this code does not wait for 3sec until it crashs...

Third: I try to access from my smartphone via LAN to Xampp Apache on 192.168.2.100. With the smartphone browser it works and I get the Xampp "root" warning, with the code above I get immediately a crash.