android開發網路
❶ Android開發中,如何測當前網速
原理: 到網上找個可以下載的apk 的URL,記住apk不要過大一般1M足夠了.然後通過記錄下載這個apk的時間和大小,算出當前網速.當然一個URL並不是很准確,要求精確的可以多下載幾個
URL求平均值</span>.
package com.panodic.settings.net;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import com.panodic.settings.util.LogUtil;
import com.panodic.settings.util.NetUtil;
import com.panodic.settings.util.Util;
import com.panodic.settings.view.PatchItem;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.panodic.settings.R;
public class MesureSpeed extends Activity implements OnClickListener {
private static final int LOADING = 0x111;
private static final int STOP = 0x112;
private ProgressBar mBar;
private int mProgressState;
private TextView mSpeed;
private Button mMeasureSpeed;
private PatchItem mBack;
private float mSpeedContent;
private String mAddr = "http://cdn.market.hiapk.com/data/upload/2012/12_09/22/cn.lgx.phoneexpert_221804.apk";
private String mAddr2 = "http://gdown..com/data/wisegame/6f9153d4a8d1f7d8/QQ.apk";
private String mAddr3 = "http://gdown..com/data/wisegame/search_Android_10189_1399k.apk";
private Handler mHandler = new Handler(Util.sTaskRunner.getLooper());
private int testCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_mesure_speed);
mSpeed = (TextView) findViewById(R.id.speed_content);
mMeasureSpeed = (Button) findViewById(R.id.mesure_speed);
mBack = (PatchItem) findViewById(R.id.patch_settings_net_speed);
mBar = (ProgressBar) findViewById(R.id.bar);
mMeasureSpeed.setOnClickListener(this);
mBack.setOnClickListener(this);
testCount = 0;
}
@Override
public void onClick(View v) {
if (mBack.isMyChild(v)) {
Util.finish(this);
} else if (v == mMeasureSpeed) {
mMeasureSpeed.setEnabled(false);
mBar.setVisibility(View.VISIBLE);
mProgressState = 0;
testCount = 0;
mBar.setProgress(mProgressState);
mHandler.removeCallbacks(null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
measureSpeed(mAddr);
}
}, 0);
}
}
private Handler mProgressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LOADING:
mBar.setProgress(mProgressState);
break;
case STOP:
mBar.setVisibility(View.GONE);
setSpeed();
mMeasureSpeed.setEnabled(true);
break;
default:
break;
}
}
};
private void setSpeed() {
if (mSpeedContent >= 1024) {
mSpeedContent = (float) ((mSpeedContent) / (1024 + 0.0));
mSpeedContent = (float) (((int) (mSpeedContent * 10) % 10 + 0.0) / 10 + (int) mSpeedContent);
mSpeed.setText(mSpeedContent + getString(R.string.m));
} else {
mSpeed.setText((int) mSpeedContent + getString(R.string.kb));
}
}
private void measureSpeed(String httpUrl) {
if (!NetUtil.isWifiConnected(this) && !NetUtil.isWireConnected(this)) {
Toast.makeText(this, getString(R.string.no_net), Toast.LENGTH_SHORT)
.show();
mProgressHandler.sendEmptyMessage(STOP);
return;
}
int fileLen = 0;
long startTime = 0;
long endTime = 0;
final String fileName = "tmp.apk";
HttpURLConnection conn = null;
InputStream is = null;
FileOutputStream fos = null;
File tmpFile = new File("/sdcard/temp");
if (!tmpFile.exists()) {
tmpFile.mkdir();
}
final File file = new File("/sdcard/temp/" + fileName);
try {
URL url = new URL(httpUrl);
try {
conn = (HttpURLConnection) url.openConnection();
LogUtil.d("lening");
fileLen = conn.getContentLength();
LogUtil.d("len=" + fileLen);
if (fileLen <= 0) {
mSpeedContent = 0;
mProgressHandler.sendEmptyMessage(STOP);
Toast.makeText(this, getString(R.string.conn_fail),
Toast.LENGTH_SHORT).show();
return;
}
startTime = System.currentTimeMillis();
is = conn.getInputStream();
fos = new FileOutputStream(file);
byte[] buf = new byte[256];
conn.connect();
if (conn.getResponseCode() >= 400) {
Toast.makeText(this, getString(R.string.no_time),
Toast.LENGTH_SHORT).show();
mProgressHandler.sendEmptyMessage(STOP);
return;
} else {
while (true) {
if (is != null) {
int numRead = is.read(buf);
if (numRead <= 0) {
break;
} else {
fos.write(buf, 0, numRead);
}
mProgressState += (int) (((numRead + 0.0) / (fileLen + 0.0)) * 1000000);
mProgressHandler.sendEmptyMessage(LOADING);
// LogUtil.d("numRead=" + numRead + " fileLen="
// + fileLen);
} else {
break;
}
}
}
endTime = System.currentTimeMillis();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, getString(R.string.no_permission),
Toast.LENGTH_SHORT).show();
} finally {
if (conn != null) {
conn.disconnect();
}
try {
if (fos != null) {
fos.close();
}
if (is != null) {
is.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
mSpeedContent = fileLen / (endTime - startTime);
mProgressHandler.sendEmptyMessage(STOP);
}
}
❷ android 開發的socket程序的網路問題
1、用wlan的時候,你的手機與pc相同於同一個區域網,所以肯定能通信的。
2、手機用gprs後,由於是兩個不同的網路,而你的伺服器IP地址如果是接上路由(包括無線)的
上的,那麼你的IP不是對外的IP,只是對路由的IP,這只是一個不行的原因
3、你可以網路ip地址查詢,就可以看到你的真正的IP,即對外的IP,即便你用的是對外的IP,這里還是不得,原因是你這個IP的路由下可能還有其他機子,這種情況從外面連的通信就不知道要發往哪台伺服器
4、要解決這個問題,你可以嘗試下花生殼綁定你的主機,具體做法你可以網上搜索下。
歡迎有問題繼續提問,滿意請採納,謝謝!
❸ Android開發如何使用代碼配置手機wifi的pac地址
這里用到的手機型號為魅族M6120,其中的具體步驟如下:
1、打開手機的設置界面,需要選擇無線網路這一項。
❹ 如何在Android開發中用HttpClient連接網路數據
HttpClient網路訪問
一、HttpClient網路訪問:
(一)、簡介:
1、Apache組織提供了HttpClient項目,可以實現網路訪問。在Android中,成功集成了HttpClient,所以在Android中可以直接使用HttpClient訪問網路。
2、與HttpURLConnection相比,HttpClient將前者中的輸入、輸出流操作,統一封裝成HttpGet、HttpPost、HttpRequest類。
HttpClient:網路連接對象;
HttpGet:代表發送GET請求;
HttpPost:代表發送POST請求;
HttpResponse:代表處理伺服器響應的對象。
HttpEntity對象:該對象中包含了伺服器所有的返回內容。
3、使用步驟:(六部曲)【重點】
創建HttpClient對象:通過實例化DefaultHttpClient獲得;
創建HttpGet或HttpPost對象:通過實例化 HttpGet或HttpPost 獲得,而構造方法的參數是urlstring(即需要訪問的網路url地址)。也可以通過調用setParams()方法來添加請求參數;
調用HttpClient對象的execute()方法,參數是剛才創建的 HttpGet或HttpPost對象 ,返回值是HttpResponse對象;
通過response對象中的getStatusLine()方法和getStatusCode()方法獲取伺服器響應狀態是否是200。
調用 HttpResponse對象的getEntity()方法,返回HttpEntity對象。而該對象中包含了伺服器所有的返回內容。
藉助EntityUtils的toString()方法或toByteArray()對 HttpEntity對象進行處理,也可以通過IO流對 HttpEntity對象進行操作。
(二)、封裝HttpClientHelper工具類:
public class HttpClientHelper {
public static HttpClient checkNetwork(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(request);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
return httpClient;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 作用:實現網路訪問文件,將獲取到數據儲存在文件流中
*
* @param url
* :訪問網路的url地址
* @return inputstream
*/
public static InputStream loadFileFromURL(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url);
HttpResponse httpResponse;
try {
httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
return entity.getContent();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 作用:實現網路訪問文件,將獲取到的數據存在位元組數組中
*
* @param url
* :訪問網路的url地址
* @return byte[]
*/
public static byte[] loadByteFromURL(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url);
try {
HttpResponse httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("====>" + e.toString());
}
return null;
}
/**
* 作用:實現網路訪問文件,返回字元串
*
* @param url
* :訪問網路的url地址
* @return String
*/
public static String loadTextFromURL(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url);
try {
HttpResponse httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toString(httpEntity, "utf-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 作用:實現網路訪問文件,先給伺服器通過「GET」方式提交數據,再返回相應的數據
*
* @param url
* :訪問網路的url地址
* @param params
* String url:訪問url時,需要傳遞給伺服器的參數。
* 第二個參數格式為:username=wangxiangjun&password=123456
* @return byte[]
*/
public static byte[] doGetSubmit(String url, String params) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url + "?" + params);
try {
HttpResponse httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 作用:實現網路訪問文件,先給伺服器通過「POST」方式提交數據,再返回相應的數據
*
* @param url
* :訪問網路的url地址
* @param params
* String url:訪問url時,需要傳遞給伺服器的參數。 第二個參數為:List<NameValuePair>
* @return byte[]
*/
public static byte[] doPostSubmit(String url, List<NameValuePair> params) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost requestPost = new HttpPost(url);
try {
requestPost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
HttpResponse httpResponse = httpClient.execute(requestPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 作用:實現網路訪問文件,先給伺服器通過「POST」方式提交數據,再返回相應的數據
*
* @param url
* :訪問網路的url地址
* @param params
* String url:訪問url時,需要傳遞給伺服器的參數。 Map<String , Object>
* @return byte[]
*/
public static byte[] doPostSubmit(String url, Map<String, Object> params) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost requestPost = new HttpPost(url);
List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
try {
if (params != null) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().toString();
BasicNameValuePair nameValuePair = new BasicNameValuePair(
key, value);
parameters.add(nameValuePair);
}
}
requestPost
.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));
HttpResponse httpResponse = httpClient.execute(requestPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
❺ 如何在Android開發中用HttpClient連接網路數據
1.構造完整的URL
❻ Android網路 | URL和URLConnection詳解及其實戰案例
URL和URLConnection是Android網路編程中的兩個核心概念。URL,全稱為統一資源定位符,是一種標記網路資源的字元串。它可以描述文件、目錄、資料庫查詢結果等各種資源的位置。例如,`http://www.onee.cn/Index.htm`是一個典型的URL,由協議、主機、埠和資源路徑組成。
URLConnection和HTTPURLConnection是實現與URL資源通信的兩個類。URLConnection是一個抽象類,提供了一種與URL所指向的遠程對象建立連接的方法。HTTPURLConnection是URLConnection的一個子類,專用於處理HTTP協議的請求和響應。
URL類提供了創建URL對象的多個構造器,並允許執行多種操作來訪問該URL對應的資源。例如,調用`openConnection()`方法可以獲取一個URLConnection對象,該對象表示到URL所引用資源的連接。通過URLConnection,應用程序可以發送HTTP請求,讀取響應數據,或訪問響應頭欄位。
在實踐案例中,我們可以通過URL類來獲取網路資源,比如使用InetAddress的簡單用法來解析域名。此外,URL類還支持字元和MIME字元的轉換,確保編碼和解碼的一致性,以防止數據丟失或錯誤。
HTTPURLConnection提供了實現網路通信的四個主要功能:創建URL、獲取網頁數據、設置超時、判斷響應碼、讀取輸入流以及輸出文件流。這些操作使得HTTP請求的發送和接收更加靈活和高效。例如,在發送POST請求時,需要使用URLConnection的輸出流來發送參數。通過設置連接的特性,如超時、緩存、連接方式、文件編碼、長度和類型,可以優化網路請求的性能和可靠性。
在實際應用中,Android開發者通常會利用第三方庫(如OkHttp)來處理HTTP請求,以簡化網路操作並提高性能。然而,直接使用Android提供的HttpURLConnection進行網路操作時,需要注意一些特定的注意事項,例如避免在有外部域名跳轉的場景中使用自動跟隨跳轉功能,以防止域名解析異常等問題。
最後,通過使用HttpURLConnection,我們可以在Android應用中實現網路圖片的載入與顯示。在子線程中執行網路請求,獲取圖片數據,將其轉換為Bitmap格式,並在主線程中更新UI界面,實現流暢的圖片顯示效果。
通過這些實例和詳細說明,可以深入理解URL和URLConnection在Android網路編程中的應用,以及如何在實際項目中實現高效、可靠的網路請求和響應處理。