mnet - crash if no internet connection
Monkey Targets Forums/Android/mnet - crash if no internet connection
| ||
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 |
| ||
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" /> |
| ||
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(); } } |
| ||
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... |
| ||
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... |
| ||
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. |
| ||
Will add that to MNet, thanks guys! :) |
| ||
When and where is the latest version of MNet available? Version at the Google Code page seems old. |
| ||
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. |
| ||
@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. |