Android_Day04

常用网络

edge中国移动

3g联通

Hsdpa 3.5G网络

完全访问互联网

wap是移动联通的大局域网,通过一个网关,间接的接入 到互联网上,(已经快被淘汰)

 

User_Agent:指定http请求来自什么客户端,常用于开发3G,当android手机访问淘宝时会带一个User-Agent:(webkit android),淘宝接收这个字段就会发送一个手机的客户端

 

网络图片查看器

1访问网络用URL

URL url = new URL(path);

2.打开连接

HttpURLConnection conn = url.openConnection();

3.设置请求方法

Conn.setRequestMehtod("GET");//请求有get跟post

4.设置连接超时时长

Conn.setConnectTimeout();

5.指定http请求的参数

conn.setRequestProperty("头信息","头内容")

6.连接服务器在判断获取响应码:

If(conn.getResponseCode()==200)

上面表示正常

7.如果上面响应码得到是200,那么拿到服务器的数据流

InputStream is = conn.getInputStream();

8.流里的内容转化成文件并写到SD卡

     1)得到文件流

File file = new file(Environment.getExternalStorageDirectory(),fileName);

//(Environment.getExternalStorageDirectory()这个是外存储的目录,fileName可以根据路径去截取path.substring(path.lastIndexof("/")+1);//得到最后个"/"的字符串即文件名

上面的操作还是要还要判断是否SD可以

9.写sd卡是要加权限的

Android.permission.WRITE_EXTERNAL_STORAGE

10.定义一个输出流

得到输入流的内容写到文件里

9.然后下载的文件显示图片到UI上

Iv_image.setImageURI(Uri.fromFile(file));

setImageURI这个是指定图片的路径,路径是URI,可以通过Uri.fromFile(file)这个可以把一个文件对象路径得到,然后设置给上面的方法

10.利用手机访问网络,所以要加权限

Android.permission.INTERNET

 

android系统还为我们操作图片提供了一个方便的方法,位图工厂,在这个类中有一个decodeStream方法可以把一个inputStream流转化成一个bitmap对象,不用写在sd卡上了,直接从网络读取下来存在内存中,如果图片很大 那就消耗很多空间..实际上 会对大的bitmap 进行缩放 ,然后 再显示出来

bitmapFactory申请的内存空间会自动释放..

也可以调用bitmap的recycle的方法释放掉空间.

 

Bitmap bitmap = BitmapFacory.decodeStream(is);//流转成图片

Iv_image.setImagebitmap(bitmap);直接在UI显示图片

 

如果要图片以原来的比例大小显示,可以指定以下属性android:scaleType="center"缩放类型为居中

 

图片的缓存:

1.bitmap有一个压缩的方法

Bitmap.compress(CompressFormat.PNG,压缩的质量,压缩的输出流)

压缩的质量如果是100那就是无损压缩, 1的参数 就会存储这个图片的时候. 按100个像素 ->1 个像素的比例进行压缩.然后我们压缩到那个流中.

 2.文件流写到sd卡中

File file = new file(Environment.getExternalStorageDirectory(),fileName);

//(Environment.getExternalStorageDirectory()这个是外存储的目录,fileName可以根据路径去截取path.substring(path.lastIndexof("/")+1);//得到最后个"/"的字符串即文件名

上面的操作还是要还要判断是否SD可以

3.写sd卡是要加权限的

Android.permission.WRITE_EXTERNAL_STORAGE

4..然后下载的文件显示图片到UI上

Iv_image.setImageURI(Uri.fromFile(file));

setImageURI这个是指定图片的路径,路径是URI,可以通过Uri.fromFile(file)这个可以把一个文件对象路径得到,然后设置给上面的方法

5.通过上面四步就可以把文件缓存到sd卡上了,然后我们判断现在请求到服务器的文件地址是否已经缓冲,如果有缓存就取缓存中的数据,判断方法

If(file.exists()&&file.length()>0)//如果文件存在或者file有数据那么就取缓存文件给ui,然后直接返回return;下面的不执行

 

android下智能源代码查看器

这个可以去试试查看一下京东这些大网站,看看怎么解压数据

 

1.得到path

1).判断path是否为空TextUtils.isEmpty(path)

2.判断格式是否正确,是否以http://开头

Path.startsWith("http://")

2.new 一个URI

3.打开URI连接

4.设置请求方法,默认是get

5.设置连接超时时长

6.获取服务器返回的状态是否是200

Conn.getResponseCode()==200

7.得到服务返回的输入流

8.把流里的数据转成byte[]数组

9.内容转化成String,这里转的编码要跟显示页面的编码一致否则会出现乱码

10.在组件上显示

 

显示会有乱码,因为android下默认的编码集是utf-8,而服务器默认的编码是iso-8859-1

如果<TextView>的显示太小了,显示不下可以在外面套一个<scrollView>这个可以让TextView有滚动的效果

 

上面的乱码问题,我认为可以在web建立一个统一编码过滤器全部设置为utf-8进行传输,如果服务器端没有这个,可用字符串截取<meta http-equiv="Content-Type" content="text/html; charset=gbk">截取这里的gbk就样就可以动态获取编码解决客户端获取数据乱码的问题

 

Netstat -ano这个是查看端口被占用情况

eclipse调试端口8616

toast这个要传一个string,如果传int, 这个方法会去R文件去找对应的值,如果这个值

在R文件中不存在就会报错

 

新闻综合客户端

一.服务器要提供一个web的地址:一般是一个xml文件,这个文件提供了新闻信息:

<news>

<new id="1">

<内容条目>

</new>

……..

</news>

用上面这个文件表示一个新闻客户端的信息.一般在这些条目里还要提供这个信息的链接地址,用于查看这个条目的具体内容

上面这个xml在保存里要注意本地保存的格式跟xml指定的编码格式要一致,这里的xml的文件的内容一般都是从数据库里取得的

 

有了上面服务器提供的信息,然后我们就去编写一个android的客户端去读到这个文件

 

隐藏窗口的标题在main.xml的窗口编辑的窗口,选择系统设置的theme.NoTitleBar的栏目,这个就是隐藏是标题栏,还要在配置栏中去配置才会生效AndroidManifest.xml的文件中的<activity>标签下去配置样式android:theme="@android:style/Theme.NoTitleBar"

 

二.androi客户端连接服务器获取数据

1.定义uri,但这个uri的路径一般不会在文件中定义死的,我们需要在配置文件中配置

在android 工程中的res/values/的目录下建立一个config.xml,我们在这个xml的文件是配置我们需要的信息一般配置信息如下信息

定义一个xml头的

<resources>

<String  name="serverurl">http://这是我们新闻客户端的访问的地址<String>

</resources>

上面我们就定义好一个配置的文件,然后我们在android 中的客户中去读取

2.获取请的新闻地址,这个地址在xml文件中配置了,我们可以用当前文件的上下文的getResources()获取资源目录,然后获取资源文件下的String的字符串传一个R.string.serverurl,这是在xml文件中配置的一个name的属性

String path = getResources().getString(R.string.serverurl);

3.打开一个url的连接

4.设置方法
5.设置超时

6.得到返回的服务状态码

7.判断是否成功,成功返回200

8.获取流

9.解析流中的xml格式内容,这个可以放在一个service的包中,解析的数据放在domain包中

       1).解析xml文件

XmlPullParser parser = Xml.newPullParser();//创建pull解析

Parser.setInput(is,"utf-8");设置流跟编码

 int type = parser.getEventType();获取事件类型

While(type != XmlPullParser.END_DOCUMENT)//判断只要不在文档的末尾就一直解析

 

Switch(type){

Case XmlPullParser.START_TAG://如果是开始结点

If("news".equals(parser.getName()))//表示解析到了news的结点,然后我们就把集合创建出来

Else if("new"….)如果到了new就说明到新闻的开始结点了,那么就创建new的bean,因为上面有属性,那么通过parser.getAttributeValue(0)获取属性值并设置到bean中

Else if(下面的解析就跟上面一样了,解析到什么标签就把解析的内容放在bean中

Break;//每个一个case的结束

Case XmlPullParser.END_TAG://说明到了标签的结束

If 判断是new就把bean放在集合中,然后把bean置空

}

 

Type = parser.next();在循环的末尾就让type到下一个结点

 

最后这个解析xml的程序返回一个news集合

       2).测试test

在这个测试的代码中如果要得到上下文用getContext()

然后得到新闻集合,然后得到集合的数量,就可以判断是否成功取到了数据

                   3).添加权限(访问网络需要权限)

            Android.permission.INTERNET

10.得到新闻的集合

11.如果得到的内容不等于空

12.展现界面创建一个数据适配器

listview的数据适配器创建出来

1)定义一个NewsAdapter extends BaseAdapter

2)getCount()这个显示的数据为news集合的数量news.size()

3).getItem()这个就直接返回news集合的对象news.get(position);

4).getItemId直接返回position

5).getview返回回来每个新闻条目对应的对象

>1.创建一个新闻条目布局的xml

Android:paddingLeft="5dip"距离控制左边5dip 直接打pad按提示就可以了,上面这个是控件里面的内容距离控件的

Android:layout_marginLeft="5dip"  这个是控件与控件之离的距离

一般图片可以放在资源文件(res)的新建文件夹drawable,这里面的文件名不能取default,这个是关键字,取了会找不到R文件

在配置文件中设置默认图片android:src="@drawable/default_icon"这里的src是引用图片drawable是资源文件夹下存放图片的drawable文件夹,后面的default_icon这个是图片文件的文件名

>2.<TextView>这个标签设置在那个控件的相对位置android:layout_toRightOf="@id/iv" 这个说明在@id/iv的右边

Android:textColor="#ccffffff"前面两个是透明度,后面六个表示是颜色

Android:layout_layout_marginLeft与上面控件的距离

Android:maxLines="2"行数最多两行

Android:ellipsize="end"这个指定文件超过那部分省略用…表示

Android:layout_alignParentRight="true"这个是指定父窗体的右边

>3如果想要一个控件在满足条件的情况下情况可以设置一个android:visibility="invisible"这个属性就表示不显示,如果要显示只要去掉这个属性就行了

>4.xml文件创建好以后,就可以用填充去操作了

View.inflate(getApplicationContext(),R.layout.item,null);

>5.寻找控件

ImageView iv = view.findViewById(R.id.iv);这里要指定view里查找,否则找不到

>6.因为图片是在服务器上存储的我们要下载到手机上,在新闻的xml文件中存储了网络地址,用Uri获取流,用BitmapFactory.decodeStream(is)这个方法把流转成图片

判断图片是否为空,如果不为空说明有就iv.setImageBitmap(bitmap);如果为空就设置图片为我们在资源文件中定义的默认的显示图片iv.setImageResource(R.drawable.default_icom)

>7.判断是否要显示的控制设置

在xml文件中设置一个判断值,如果为隐藏我们就tv_comment.setVisibility(View.INVISIBLE);就设置为隐藏 (VISIBLE这个属性是设置可见的)

12.在listview组件中使用这个数据适配器类

Lv.setAdapter(new NeswsAdapter());

13.可以为条目设置点击事件

Lv.setOnItemClickListener(new OnItemClickListener(){

Public  void onItemClick(….)

{

//写点击所产生的事件

}

}

14.一般开发还要设置图片缓存

Bitmap.compress(Compressformant.PNG,100,fos);//设置压缩到fos流中,完成这个后就可以在程序中判断图片是否存在了

在相对布局中可以设置这个布局的背景为一个图片

Android:background="@drawable/small_button_up"

 

连接服务器下载图片的操作一般在线程中操作,这样用户体验会好多了

apk程序可以解压,就可以得到apk的素材

 

数据提交到服务器上:

采用get的方式向服务提交数据

流程:

大概的流程是android客户端有一个用户名跟密码,然后要做的就是用户名跟密码上传到服务器上,然后服务器上的 servlet服务处理数据,然后然后一个消息给android客户端

1.可以web服务器,写一个servlet,实现doGet方法,

 写判断数据处理

Request.getParameter(数据名);//获取传过来的数据值

判断用户是否登入成功,不管成功与否都向客户端写一个信息

Response.getOutputStream().writer("log success".getBytes());

这里的getBytes()默认是取本地默认的编码中国的是"gbk"根据服务的操作系统来指定

2.创建ui布局

用户跟密码文本框,还有一个提交按钮

3.activity里面设置点击的事件

4.事件里组拼地址

例如_"http://192.168.1.5:8080/web/LoginServlet?name="name+"&password="+password;

5.创建uri

6.打开uri的连接

7.设置请求的方法(get)

8.设置超时时间

9.得到服务返回回来的状态

10.判断是不是200,如果是执行下面的,否则就提示网络异常

11.得到输入流

12.把输入流转化成byte[]数组

13.把得到的数据显示在toast上,在这里new String时要注意,tomcat服务传过来的数据是ISO-8859-1的,但是在传过来前编码是本地的默认是gbk,这样数据就已经乱了,可以把数据用ISO-8859-1反编过去,这样就得到传过来前的gbk编码,最后指定gbk打开就行了

14.加入网络访问权限

上面如果用中文要注意乱码问题

response.getOutputStream().write(new String(user.getBytes("ISO-8859-1"),"utf-8").getBytes());

从页面传过的数据tomcat都会用ISO-8859-1这个编码去解析成一个String字符串,我们要反编译调用getBytes("ISO-8859-1")这个得到没有被服务编译的原始的数据,然后直接输出给客户,那么就不会出现乱码了,因为这个原始的数据就是客户端的编码编的.在服务器端如果用getBytes()去输出数据这个默认是服务器端的本地编码数据,数据是中文的就是gkb的编码了

还有一个问题是如果用浏览器去访问服务器,那么如果get提交的时候有中文,浏览器会帮我去url编码,但是如果是android程序我们就需要手工去编码,把中文编码传给服务器,用URLEncoder.encode()

String  newName = URLEncoder.encode(name);//对原来的数据进行URL编码,然后加入到请求地址中,这样创建一个URL提交数据就没有问题了

 

采用post的方式向服务器提交数据

post不用组拼url,直接以流的方式写给服务器

post与get方式不同:

1提交的协议不同post是post,get是get

2.post比get多两个头

Content-Type: application/x-www-form-urlencoded

Content-Length: 14//这个是客户端向服务器端提交的数据长度

 

采用post的方式向服务器提交数据

步骤跟get方法差不多,需要修改的地方是

1.提交的方法

Conn.setRequestMethod("POST");

2.添加两个头

Conn.setRequestProperty(

"Content-Type"," application/x-www-form-urlencoded");

Conn.setRquestProperty("Content-Length","数据的长度");

如果传的数据长度跟原始参数数据不相符解析就会有错误,为什么这个必须指定,服务器不能直接读流吗?

上面的数据可以用httpWatch抓包获取

3.设置允许向服务发送数据(post)

Conn.setDoOutput(true);

不管是get还是post的提交方式,组拼uri的时候如果有中文一定要用URLEncoder.encode()对汉字进行编码;UrlEncode编码/UrlDecode解码

如果有中文数据或者数据里包含/  :   &  等特殊字符必须要对数据进行url的编码

Post 比get好处:

1地址栏上不会显示提交的数据

2还可以防止重复提交

 

httpclient提交数据

是对浏览器的一个封闭,利用java代码实现了绝大数浏览器的功能

 

1.打开一个浏览器-->初始化一个httpclient

2.输入一个地址---->准备一个http的请求

3.敲一下回车--->利用httpclient把http请求发送出去

 

httpclient发送一个get请求

//1.打开浏览器

DefaultHttpClient client = new DefaultHttpClient();

//2.准备一个http的get请求

HttpGet httpGet = new HttpGet(path);//path是请求的地址

//3.敲回车,返回httpRespnse

HttpResponse respnse = Client.execute(httpGet);

//4.返回状态状态行,并进一步得到状态码

Int code = response.getStatusLine().getStatuscode();

//5判断是否是200

//6.返回服务器的数据

InputStream is = Response.getEntity().getContent()   //getEntity()返回请求码的消息实体,getContent()得到了数据所对应的inputStream流

//7.输出数据

//8.处理事件关联按钮

 

httpclient发送一个post请求

 与发送get请求不同点,

//1.打开浏览器

DefaultHttpClient client = new DefaultHttpClient();

21准备一个post请求

HttpPost httpPost = new HttpPost(path);

3.数据提交的内容要设置进来,设置一个数据的实体

httpPost.setEntity(new Httpentity());//一般使用new UrlEncodedFormEntity(parameters,encoding);

Parameters:List<NameValuePair>  parameters = new ArrayList<NameValuePair>();//NameValuePair实际上就是提交到服务器上的键值对

Parameters.add(new BasicNameValuePair(提交的key,提交的value));//这里的BasicNameValuePair是NameValuePair类的包装类

Encoding:提交的数据是什么编码集

//4.敲回车,返回httpRespnse

HttpResponse respnse = Client.execute(httpGet);

//5.返回状态状态行,并进一步得到状态码

Int code = response.getStatusLine().getStatuscode();

//6判断是否是200

//7.返回服务器的数据

InputStream is = Response.getEntity().getContent()   //getEntity()返回请求码的消息实体,getContent()得到了数据所对应的inputStream流

//8.输出数据

//9.处理事件关联按钮

 

采用httpclient上传文件到服务器上

1.创建一个web服务器

1>jsp里如果要实现文件上传在form表单里要指定一个method="post"   enctype="mujltipart/form-data"

2>文件上传serlvet,tomcat给我实现了一个文件上传的工具需要导入两个jar包(commons-fileupload-1.3,commons-io-2.0.1.jar)

3>文件上传代码

//判断post请求是不是包含多个部分的请求

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

 

if (isMultipart) {

String realpath = request.getSession().getServletContext()

.getRealPath("/files");

System.out.println(realpath);

File dir = new File(realpath);

if (!dir.exists())

dir.mkdirs();

//得到磁盘下文件的工厂

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

upload.setHeaderEncoding("UTF-8");

try {

List<FileItem> items = upload.parseRequest(request);

for (FileItem item : items) {

if (item.isFormField()) {

String name1 = item.getFieldName();// 得到请求参数的名称

String value = item.getString("UTF-8");// 得到参数值

System.out.println(name1 + "=" + value);

} else {

item.write(new File(dir, System.currentTimeMillis()

+ item.getName().substring(

item.getName().lastIndexOf("."))));

}

}

} catch (Exception e) {

e.printStackTrace();

}

} else {

doGet(request, response);

}

2.创建android文件上传客户端,定义点击事件

3.得到文件上传的路径并判断是否是正确的文件地址

4.得到正确的文件地址后就可以创建一个文件上传的方法

1>android提交的httpclient里没有包含文件上传的功能

2>引入jar包,可以在当前的工程的目录下建立libs把我们需要的jar包引入

 3>引入的jar包是httpClient3.1的jar 包,里面有3个jar包,(commons-codec,commons-httclient,commos-logging)

4>上传的代码

/**

 * 上传文件到服务器

 *

 * @param file

 */

public static void uploadFile(Context context, File file) {

// 创建一个httppost的请求

PostMethod filePost = new PostMethod(

"_http://192.168.1.250:8080/web/UploadFileServlet");

try {

// 组拼上传的数据

Part[] parts = { new StringPart("source", "695132533"),

new StringPart("status", "lisi"),

new FilePart("file", file) };

filePost.setRequestEntity(new MultipartRequestEntity(parts,

filePost.getParams()));

HttpClient client = new HttpClient();

client.getHttpConnectionManager().getParams()

.setConnectionTimeout(5000);

int status = client.executeMethod(filePost);

if (status == 200) {

Toast.makeText(context, "上传文件成功", 0).show();

}

} catch (Exception e) {

Toast.makeText(context, "上传文件失败", 0).show();

}

 

finally {

filePost.releaseConnection();

}

}

 

调用webservice获取 网络上的信息(手机号_天气)

1.创建查询电话号码的android应用

2.创建一 个path

1>因为path的路径都是估计的可以在资源文件中新建一个配置

 在values下新建一个config.xml的文件,然后在文件的name跟value添加我们值

getResources().getString(R.string.baseurk)这是上面添加的key,这样就拿到了前面的字符了

3.创建一个uri

4.打开uri连接得到httpURlconnection

5.设置超时时间

6得到服务返回的状态

7如果服务器返回码是200那,我们解析json

8.得到流

9.把流的数据转成byte[]数组

10.转成String

11.因为这里是json对象,android给我们提供了一个json对象解析的方法

JSONObject ojb = new JSONObject(result);//这里是话那个字符串转成json对象

然后就可以用json的key跟value进行读取

Obj.get("city");得到city后面的值,这里需要强转成String

12.访问网络需要加权限,否则会有io的异常

上面的查询手机的地址可以在网上提供在线查询的地方进行查找

可以在webService网站去查找

天气预报获取

网址:_www.webxml.com/cn

可以去网上找一些免费数据提供网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值