如何解决检查程序是否具有通过wifi的互联网
| 在阅读了一些答案并尝试使用它们后,无论是否通过wifi上网,我仍然无法使我的代码返回正确的状态。 我必须通过WIFI进行“ ping”操作,因为我们可能没有任何互联网连接就已连接到接入点。这是完整的代码。ConnectivityManager CM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo NI = CM.getActiveNetworkInfo();
boolean IC = false;
IC = CM.requestRouteToHost(ConnectivityManager.TYPE_WIFI,FlavaGr.lookupHost(pingyIp));
System.out.println(\"##### IC=\" + IC + \" TYPE = \" + NI.getTypeName());
在这里lookupHost,由另一个用户建议:
public static int lookupHost(String hostname) {
InetAddress inetAddress;
try {
inetAddress = InetAddress.getByName(hostname);
} catch (UnknownHostException e) {
return -1;
}
byte[] addrBytes;
int addr;
addrBytes = inetAddress.getAddress();
addr = ((addrBytes[3] & 0xff) << 24)
| ((addrBytes[2] & 0xff) << 16)
| ((addrBytes[1] & 0xff) << 8)
| (addrBytes[0] & 0xff);
return addr;
}
IC总是假的。
我觉得答案是一步之遥,但仍然不知道该怎么办。
PS对不起,我的英语。
解决方法
这是我使用的代码,没有任何问题:
ConnectivityManager conn;
conn=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// Skip if no connection,or background data disabled
NetworkInfo info = conn.getActiveNetworkInfo();
if (info == null ||
!conn.getBackgroundDataSetting()) {
// No Network detected
return;
} else {
int netType = info.getType();
int netSubtype = info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI) {
//WIFI DETECTED
} else if (netType == ConnectivityManager.TYPE_MOBILE
&& netSubtype >2) {
//Mobile connected that is at least 3G
} else {
//Has connection but i\'m not sure what kind
}
}
和清单中的以下内容:
<uses-permission android:name=\"android.permission.INTERNET\" />
<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />
请注意,在仿真时,检测到的Internet连接可能会表现异常。
, 我的答案是:
ConnectivityManager CM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo NI = CM.getActiveNetworkInfo();
if (NI!=null) {
if (NI.isAvailable()) {
boolean IC = false;
if (NI.getTypeName()==\"WIFI\") {
int response = 0;
try {
URL url = new URL(\"http://www.google.com/\");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
response = in.read();
in.close();
IC = (response != -1) ? true : false;
System.out.println(\"##### IC=\" + IC + \" TYPE = \" + NI.getTypeName() + \" response = \" + response);
if (true){
;
};
} catch (Exception e) {
}}}}}
仅检查当前连接是否为WIFI,然后请求页面,检查第一个字符。
, 我知道了:)
首先,这是不允许的,并且在主线程上执行httprequest也不好!因此,您必须在AsyncTask中完成!
其次,您无需检查是否存在连接...因为您可以连接到本地连接或连接速度太慢!
您需要做的就是http请求并检查是否在准确的时间内有响应。为此,您需要设置超时!但只有超时无法正常工作-您需要检查状态码...这里是:
class ConnectionTask extends AsyncTask<String,String,String> {
/**
* Before starting background thread set flag to false
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
flag = false;
}
boolean flag;
/**
* getting All products from url
* */
protected String doInBackground(String... args) {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
Log.v(\"url\",url);
JSONObject json = jParser.makeHttpRequest(url,\"GET\",params);
/*is json equal to null ?*/
if( json != null )
{
// Check your log cat for JSON response
Log.d(\"json: \",json.toString());
try {
message = json.getString(\"message\");
flag = true;//we succeded so we make the flag to true
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{//if json is null
message = \"not connected to internet connection\";
flag = false;
}
return null;
}
/**
* After completing background task check if there is connection or no
* **/
protected void onPostExecute(String file_url) {
// updating UI from Background Thread
if(flag)
{//flag is tro so there is connection
Log.v(\"connection\",\"conectioOOOOOoooOooooOoooooOOOOoooOOOOOO\");
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into textview
* */
TextView tvTest = (TextView) findViewById(R.id.testTextView);
tvTest.setText(message);
}
});
}
else
{////we catched that there is no connection!
Log.v(\"connection\",\"nooooooo conectioOOOOOoooOooooOoooooOOOOoooOOOOOO\");
runOnUiThread(new Runnable() {
public void run() {
/*update ui thread*/
TextView tvTest = (TextView) findViewById(R.id.testTextView);
tvTest.setText(\"no connection\");
Toast.makeText(getApplicationContext(),\"No internet connection\",Toast.LENGTH_LONG).show();
}
});
}
}
}
所以现在是json解析器:)
public class JSONParser {
private InputStream is = null;
private JSONObject jObj = null;
private String json = \"\";
static int timeoutConnection = 10000;
static int timeoutSocket = 10000;
// constructor
public JSONParser() {
}
// function get json from url
// by making HTTP POST or GET method
public JSONObject makeHttpRequest(String url,String method,List<NameValuePair> params) {
// check for request method
if(method == \"POST\"){
try{
HttpPost request = new HttpPost(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero,that means the timeout is not used.
HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout(httpParameters,timeoutSocket);
// create object of DefaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
request.addHeader(\"Content-Type\",\"application/json\");
HttpResponse response = httpClient.execute(request);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
// convert entity response to string
}
catch (SocketException e)
{
e.printStackTrace();
return null;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}else if(method == \"GET\"){
try{
HttpGet request = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero,\"application/json\");
HttpResponse response = httpClient.execute(request);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
// convert entity response to string
}
catch (SocketException e)
{
e.printStackTrace();
return null;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is,\"iso-8859-1\"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + \"\\n\");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e(\"Buffer Error\",\"Error converting result \" + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e(\"JSON Parser\",\"Error parsing data \" + e.toString());
}
// return JSON String
return jObj;
}
}
效果很好!
, 尝试使用此方法来检查是否存在互联网连接:
public boolean connexionStatus(ConnectivityManager connec)
{
NetworkInfo[] allNetwork = connec.getAllNetworkInfo();
if (allNetwork != null)
{
for (int i = 0; i < allNetwork.length; i++)
{
if (allNetwork[i].getState() == NetworkInfo.State.CONNECTED ||
allNetwork[i].getState() == NetworkInfo.State.CONNECTING )
return true;
}
}
return false;
}
注意:清单中应具有INTERNET的许可
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。