Android23_网络存储之HttpClient
HttpClient网络访问
一、HttpClient网络访问: (一)、简介: 1、Apache组织提供了HttpClient项目,可以实现网络访问。在Android中,成功集成了HttpClient,所以在Android中可以直接使用HttpClient访问网络。
2、与HttpURLConnection相比,HttpClient将前者中的输入、输出流操作,统一封装成HttpGet、HttpPost、HttpRequest类。
- HttpClient:网络连接对象;
- HttpGet:代表发送GET请求;
- HttpPost:代表发送POST请求;
- HttpResponse:代表处理服务器响应的对象。
- HttpEntity对象:该对象中包含了服务器所有的返回内容。
- 创建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
* @return byte[]
*/
public static byte[] doPostSubmit(String url, List
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
* @return byte[]
*/
public static byte[] doPostSubmit(String url, Map
HttpClient httpClient = new DefaultHttpClient();
HttpPost requestPost = new HttpPost(url);
List
try {
if (params != null) {
for (Map.Entry
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;
}
}
【复习:】POST和GET在表单提交时的区别:【重点】 Post传递必须依赖于表单,传值的内容没有大小限制,传值内容不会在地址栏显示,比 Get 传值安全; Get传值的内容会通过地址栏显示,而地址栏长度有最大长度限制,因为 Get 传参内容不可以过长,当超过某个长度后会自动裁切掉多余内容。比起 Post 传参, Get 传参不够安全。但是 Get 传参可以通过表单,也可以不通过表单,直接通过地址栏传参。因此 Get 传参更灵活。
二、SoundPool声音池: (一)、使用步骤: 1、创建SoundPool对象; SoundPool pool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 2、加载音效; pool.load(this, R.raw.音频文件名, 1); 3、播放音效。 pool.play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) ;
(二)、示例代码:
public class MainActivity extends Activity {
private SoundPool pool = null;
private HashMappoolMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 调用初始化声音池
initSoundPool();
}
/*
* 初始化声音池 pool = new SoundPool(5, // maxStreams参数,该参数为设置同时能够播放多少音效
* AudioManager.STREAM_MUSIC, //
* streamType参数,该参数设置音频类型,在游戏中通常设置为:STREAM_MUSIC //
* srcQuality参数,该参数设置音频文件的质量,0为默认值。
*/
public void initSoundPool() {
pool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
poolMap = new HashMap() ;
poolMap.put(1, pool.load(this, R.raw.ding, 1));
poolMap.put(2, pool.load(this, R.raw.ringin, 1));
}
/*
* 播放声音,参数sound是播放音效的id,参数number是播放音效的次数 pool.play(poolMap.get(sound), //
* 播放的音乐id volumnRatio, // 左声道音量 volumnRatio, // 右声道音量 1, // 优先级,0为最低
* number, // 循环次数,0无不循环,-1无永远循环 1 // 回放速度 ,该值在0.5-2.0之间,1为正常速度
*/
public void playSound(int sound, int number) {
// 实例化AudioManager对象
AudioManager manager = (AudioManager) this
.getSystemService(this.AUDIO_SERVICE);
// 返回当前AudioManager对象的最大音量值
float audioMaxVolumn = manager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// 返回当前AudioManager对象的音量值
float audioCurrentVolumn = manager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float volumnRatio = audioCurrentVolumn / audioMaxVolumn;
pool.play(poolMap.get(sound), // 播放的音乐id
volumnRatio, // 左声道音量
volumnRatio, // 右声道音量
1, // 优先级,0为最低
number, // 循环次数,0:不循环,-1:永远循环
1 // 回放速度 ,该值在0.5-2.0之间,1为正常速度
);
}
public void clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_play1:
playSound(1, 0);
break;
case R.id.button_main_play2:
playSound(2, 0);
default:
break;
}
}
}
三、学习Android的软件Android manual的思考: (一)、解压android_manual.apk,发现res目录下有个目录raw,其中存放的就是该应用的数据库文件。 1、raw目录是什么? 2、如何访问raw目录下的数据库呢?
(二)、回顾资源访问:
- 字符串资源文件:string
- 颜色资源、尺寸资源文件 :color、dimen
- 布局资源: layout
- 数组资源: string-array 、 integer-array
- 图片资源: drawable
- 样式和主题资源:style、theme
- 菜单资源: menu
- 原始XML资源: xml
- 原生文件资源: raw
【备注:】 Android manual这个app中将数据库放在raw中,那么该数据库将如何访问?我们发现,当安装完该apk后,会看到在sdcard中产生一个androidmanual目录,该目录下存放着该app的数据库。虽然raw中的数据库是没有办法让SQLiteDatabase访问,而如果放在sdcard上,只要知道路径,则可以访问。所以如果我们要模仿制作一个Android manual 项目,那么就可以借助getResources().openRawResource(R.raw.文件名)产生的输入流,将文件保存在sdcard的某个目录下。这样SQLiteDatabase就可以调用openDatabase()方法来访问数据库了。特别提醒的是:要注意openDatabase()方法的第三个参数flag。如果选择不正确,则无法正常访问数据库。(应该是哪个常量值呢?请同学们先查看API,自己寻找答案。)
四、assets目录中的图片如何访问? (一)、运用场景: 当使用WebView控件的时候,可以比较方便地访问assets目录中的文件了。文件目录是: file:///android_asset/文件名.文件后缀
(二)、示例代码:(WebView中载入html字符串,显示assests目录下的图片)
public class MainActivity extends Activity {
private WebView webView_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView_main = (WebView) findViewById(R.id.webView_main);
// 设置浏览器支持。这样webview可以处理各种通知和请求事件。
// 如果不使用该句代码,在点击超链地址后,会跳出程序,而弹出浏览器访问网页。
webView_main.setWebChromeClient(new WebChromeClient());
webView_main.setWebViewClient(new WebViewClient());
WebSettings webSetting = webView_main.getSettings();
webSetting.setJavaScriptEnabled(true); // 设置支持javascript脚本
webSetting.setAllowFileAccess(true); // 允许访问文件
webSetting.setBuiltInZoomControls(true); // 设置显示缩放按钮
webSetting.setSupportZoom(true); // 支持缩放
String data = "";
StringBuilder sb = new StringBuilder();
sb.append("
sb.append("用户名:
");
sb.append("密码:
");
sb.append("");
sb.append("");
sb.append("file:///android_asset/android.jpg' width='300dp'>");
// webview组件能加载包含html代码的字符串,并且能执行html。为了防止乱码,使用loadDataWithBaseURL()方法。而不用loadData()方法。
// loadDataWithBaseURL()方法中的第二个参数时MIME,详见当天的课堂笔记。
webView_main.loadDataWithBaseURL(null, sb.toString(), "text/html",
"utf-8", null);
}
}
(三)、示例代码2:(ImageView中加载assets目录下的图片) private ImageView imageView_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main = (ImageView) findViewById(R.id.imageView_main);
try {
InputStream is = this.getAssets().open("abc.jpg");
imageView_main.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (IOException e) {
e.printStackTrace();
}
}
良心的公众号,更多精品文章,不要忘记关注哈
《Android和Java技术栈》
更多相关文章
- Android(安卓)打包, 不同渠道使用 不同的资源文件
- android 常见面试题(三)
- android中图形图像处理之drawable用法分析
- android:内存优化总结
- 新博andorid 初中级考试评测以及答案-------小林老师出的试卷
- Android文件、内存、SDCard管理常用工具类、方法
- Android(安卓)GreenDao数据库—基础详解
- android APK签名过程之MANIFEST.MF分析
- Android(安卓)App的签名打包(晋级篇)