Android
This presentation is the property of its rightful owner.
Sponsored Links
1 / 60

第八章 Android 网络通信 PowerPoint PPT Presentation


  • 97 Views
  • Uploaded on
  • Presentation posted in: General

第八章 Android 网络通信. 本章主要内容. 网络的重要性. 网络化信息化的世界 短信、电话 无线上网 移动 , 自由 ,随时随地. Android 支持的通信模式. GSM EDGE 3G ……. WIFI BLUETOOTH NFC. Android 网络通信基础. GSM. 全球移动通信系统 ( Global System for Mobile Communications ). 当前应用最为广泛的移动电话标准。全球超过 200 个国家和地区超过 10 亿人正在使用 GSM 电话。. Android 网络通信基础. GSM.

Download Presentation

第八章 Android 网络通信

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Android

第八章 Android网络通信


Android

本章主要内容


Android

网络的重要性

  • 网络化信息化的世界

  • 短信、电话

  • 无线上网

  • 移动,自由,随时随地


Android

Android 支持的通信模式

  • GSM

  • EDGE

  • 3G

  • ……

  • WIFI

  • BLUETOOTH

  • NFC


Android

Android 网络通信基础

GSM

全球移动通信系统

(Global System for Mobile Communications)

当前应用最为广泛的移动电话标准。全球超过200个国家和地区超过10亿人正在使用GSM电话。


Android

Android 网络通信基础

GSM

  • GSM标准的广泛使用使得在移动电话运营商之间签署“漫游协定”后用户的国际漫游变得很平常。

  • GSM较之它以前的标准最大的不同是他的信令和语音信道都是数字的,因此GSM被看作是第二代(2G)移动电话系统。GSM标准当前由3GPP组织负责制定和维护。


Android

Android 网络通信基础

EDGE

增强型数据速率GSM演进技术

Enhanced Data Rate for GSM Evolution

  • 从GSM到3G的过渡技术

  • 能够充分利用现有的GSM资源

  • 弹性优势

  • 工作在TDMA和GSM网络

  • 提高了GPRS信道编码效率及其高速移动数据标准


Android

Android 网络通信基础

3G

第三代移动通信技术(3rd-generation,3G)

3G就是指IMT-2000(International Mobile Telecommunications-2000),是国际电信联盟(ITU)定义的第三代无线通信的全球标准。

IMT-2000规定移动终端的连接速度:

  • 以车速移动时 ——144Kbps

  • 室外静止或步行时——384Kbps

  • 室内 ——2Mbps


Android

Android 网络通信基础

3G

目前存在的几种标准:

  • WCDMA(Wideband CDMA)——欧洲

  • CDMA2000 —— 美国高通北美公司

  • TD-SCDMA(时分同步CDMA) —— 中国大陆

  • WiMAX —— 微波存取全球互通(07年提出)

  • (Worldwide Interoperability for Microwave Access)


Android

Android 网络通信基础

3G——应用

3G目前广泛地运用在:

  • 宽带上网

  • 视频通话

  • 手机电视

  • 无线搜索

  • 手机音乐

  • 手机购物

  • 手机网游


Android

Android 网络通信基础

WiFi

Wireless Fidelity,中文译为“无线兼容认证”

  • 实质——一种商业认证

  • 技术——短程无线传输

  • 现状——带WiFi的便携式设备是潮流


Android

Android 网络通信基础

WiFi

常见的WiFi使用形式——无线路由器

  • 覆盖范围——70至120米

  • 使用场合——公司、家庭、公共场所

  • 优点——方便的建立局域网、低成本、使用简单


Android

Android 网络通信基础

WiFi——应用

WiFi相比其他技术有如下一些特点:

  • 无线电波的覆盖范围广

  • 传输速度高

  • 使用门槛比较低

  • 消除布线的麻烦

  • 发射功率低,健康安全


Android

Android 网络通信基础

Bluetooth

定义:

蓝牙的标志

  • 开放式无线通讯标准

  • 设备短距离互联解决方案

优势:

  • 无需驱动程序——独特的配置文件

  • 小型化无线电

  • 低功率、低成本、安全性、稳固

  • 易于使用、即时连接


Android

Android 网络通信基础

Bluetooth

蓝牙协议栈:

  • 核心协议层(HCI、LMP、L2CAP、SDP)

  • 线缆替换协议层(RFCOMM)

  • 电话控制协议层(TCS-BIN)

  • 选用协议层(PPP、TCP、IP、UDP、OBEX、IrMC、WAP、WAE)


Android

Android 网络通信基础

Bluetooth

蓝牙规范(profile)——为了保证蓝牙设备的互通性而制定的一系列规范:

  • 蓝牙立体声音频传输规范(A2DP)

  • 基本图像规范(BIP)

  • 基本打印规范(BPP)

  • 无线电话规范(CTP)

  • 蓝牙耳机规范(HP)

  • 文件传输规范(FTP)

  • ……


Android

Android 网络通信基础

NFC

Near Field Communication(近场通讯)

技术起源:

NFC由非接触式射频识别(RFID)及互联互通技术整合演变而来,在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。


Android

Android 网络通信基础

NFC

技术优势:

  • 轻松、安全、迅速的通信

  • 传输范围小——独特的信号衰减技术

  • 带宽高、能耗低

应用场合:

  • 门禁、公交

  • 手机支付


Android

Android 网络通信基础

Andrion提供的网络接口

Android平台提供了三种网络接口,它们分别是:

  • java.net.*

  • org.apache.*

  • android.net.*

开发人员可以使用这些接口方便的进行Android网络编程。


Android

Android Http通信

Http 简介

Http(Hypertext Transfer Protocol)即超文本传输协议,它是Web的基础协议,是建立在TCP上的一种应用。

Http连接特点:

客户端发送的每次请求都需要服务器返回响应,并在请求结束后释放连接,这个建立连接到关闭连接的过程称为“一次连接”。

由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”、“无状态”的连接。


Android

Android Http通信

Http 的特点

支持客户/服务器模式;

简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。

灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记;

无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。


Android

Android Http通信

使用HttpClient接口通信示例

Http请求数据通常使用GET和POST向服务器提交表单而获取响应的方式获得数据。主要有以下几种区别:

1. GET方法是将参数数据队列附加到URL的ACTION属性中,值和表单内各个字段一一对应,以明文的方式存在于URL中。而POST方法则是将数值内容放置在HTML HEADER内一起传送至ACTION属性所指的URL地址;

2. 对于GET方法,服务端采用Request.QueryString获取变量的值,而对于POST方法,服务端采用Request.Form获取提交的数据。

3. 一般来说GET方法项服务器传送的数据量较小。而POST方法传送的数据量较大。


Android

Android Http通信

使用HttpClient接口通信示例

1 初始状态

2 使用GET方法

3 使用POST方法


Android

Android Http通信

使用GET方法请求数据的代码段如下:

使用HttpClient接口通信示例

protectedvoidhttpClientGet() {

//GET请求的url,可以看到url中weather的值为chengdu

String googleWeatherUrl = "http://www.google.com/ig/api?hl=zh-cn&weather=chengdu";

//DefaultHttpClient,默认的HttpClient类

DefaultHttpClienthttpclient = newDefaultHttpClient();

//HttpGet

HttpGethttpget = newHttpGet(googleWeatherUrl);

//ResponseHandler,用于处理服务端返回的响应

ResponseHandler<String> responseHandler = newBasicResponseHandler();

try {

String content = httpclient.execute(httpget, responseHandler);

Toast.makeText(getApplicationContext(), "连接成功!",

Toast.LENGTH_SHORT).show();

//设置TextView,显示获取的网页内容

tv.setText(content);

} catch (Exception e) {

Toast.makeText(getApplicationContext(), "连接失败", Toast.LENGTH_SHORT)

.show();

e.printStackTrace();

}

httpclient.getConnectionManager().shutdown();//关闭连接

}


Android

Android Http通信

protectedvoidhttpClientPost()

{

try

{// 定义需要获取的内容来源地址

final String SERVER_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather";

// 根据内容来源地址创建一个Http请求

HttpPost request = newHttpPost(SERVER_URL);

// 添加参数

List params = newArrayList();

params.add(newBasicNameValuePair("theCityCode", "成都"));

params.add(newBasicNameValuePair("theUserID", ""));

// 设置参数的编码

request.setEntity(newUrlEncodedFormEntity(params, HTTP.UTF_8));

// 发送请求并获取反馈, 解析返回的内容

HttpResponsehttpResponse = newDefaultHttpClient().execute(request);

//如果返回状态码不为404,即URL无误则显示获取的内容

if (httpResponse.getStatusLine().getStatusCode() != 404)

{

String result = EntityUtils.toString(httpResponse.getEntity());

tv.setText(result.toString());

}

}catch (Exception e) {

}

}

使用HttpClient接口通信示例

使用POST方法请求数据的代码如下:


Android

Android Http通信

使用HttpUrlConnection接口通信示例

  • HttpURLConnection继承自URLConnection。要获取HttpURLConnection类的实例,需要使用openConnection()方法来获取,代码如下:

String Url = "http://www.google.com/ig/api?weather=chengdu";

URL url = new URL(googleWeatherUrl);

HttpURLConnectionhttpconn = (HttpURLConnection) url.openConnection();


Android

Android Http通信

使用HttpUrlConnection接口通信示例

4 初始状态

5 使用GET方法

6 使用POST方法


Android

Android Http通信

使用HttpUrlConnection接口通信示例

HttpURLConnection使用GET方法获取数据的关键代码如下:

// 获取HttpURLConnection实例

HttpURLConnectionhttpconn = (HttpURLConnection) url.openConnection();

if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {

Toast.makeText(getApplicationContext(), "连接Google Weather API成功!",

Toast.LENGTH_SHORT).show();

// InputStreamReader,用于读取网页内容

InputStreamReaderisr = newInputStreamReader(httpconn.getInputStream(), "utf-8");

inti;

String content = "";

// 从流中读取数据

while ((i = isr.read()) != -1) {

content = content + (char) i;

}

isr.close();

//设置TextView

tv.setText(content);

}

//disconnect

httpconn.disconnect();


Android

Android Http通信

使用HttpUrlConnection接口通信示例

//使用HttpURLConnection打开连接

HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();

//因为要求使用Post方式提交数据,需要设置为true

urlConn.setDoOutput(true);

urlConn.setDoInput(true);

//设置以Post方式,注意此处的“POST”必须大写

urlConn.setRequestMethod("POST");

//Post 请求不能使用缓存

urlConn.setUseCaches(false);

urlConn.setInstanceFollowRedirects(true);

//配置本次连接的Content-Type,配置为application/x-www-form-urlencoded

urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

//连接,从postUrl.openConnection()至此的配置必须在connect之前完成

//要注意的事connection.getOutputStream会隐含地进行connect。

urlConn.connect();

//DataOutputStream流上传数据

DataOutputStream out=newDataOutputStream(urlConn.getOutputStream());

//要上传的参数

String content="par="+ URLEncoder.encode("POSTTransferData", "gb2312");

//将要上传的内容写入流中

out.writeBytes(content);

//刷新,关闭

out.flush();

out.close();

HttpURLConnection使用POST方法请求数据需要改变的主要有两处,一是需要使用setRequestMethod()方法,二是使用DataOutputStream向服务器写入参数值。

代码如下:


Android

Android WiFi

开发

Android SDK提供的相关包:android.net.wifi


Android

Android WiFi

相关类介绍


Android

Android WiFi

相关类介绍


Android

Android WiFi

重要类

Android 操作WiFi的重要类——WifiManager

这个类提供了最主要的用于管理wifi连接的API。

通过调用Context.getSystemService(Context.WIFI_SERVICE)

方法来得到系统提供的WifiManager,代码如下:

WifiManagermWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);


Android

Android WiFi

WifiManager主要用于处理的事务

  • 已经配置好的网络连接列表。

  • 如果当前有连接存在的话,可以得到当前正处于活动状态的wifi连接的控制权,可以通过它建立或者断开连接,并且可以查询该网络连接的动态信息;

  • 通过对已经扫描到的接入点的足够信息来进行判断,得出一个最好的接入点进行连接。

  • 定义了很多用于系统广播通知的常量,它们分别代表了WiFi状态的改变。


Android

Android WiFi

WiFi的开发补充

Android网络连接管理类——ConnectivityManager

该类用于管理抽象意义上的“网络连接”

它完成的主要任务是:

  • 监控网络连接(包括WiFi,GPRS,UMTS等等);

  • 当网络连接发生改变时,向系统广播这一改变;

  • 当失去了当前的网络连接时,尝试切换到另外一个连接;

  • 提供了允许其他应用程序调用的API让应用程序可以方便地查询当前的网络状态。


Android

Android WiFi

WiFi的权限获取

要在应用程序中对Android系统的WiFi设备进行相关操作,需要在项目中的AndroidManifest.xml中选择性地添加如下几句用于声明权限的语句:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">

</uses-permission>

<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES">

</uses-permission>

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">

</uses-permission>


Android

Android WiFi

WiFi开发——代码示例

//取得WifiManager对象

mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

//取得WifiInfo对象

mWifiInfo = mWifiManager.getConnectionInfo();

//打开WIFI

public void openWifi()

{

if (!mWifiManager.isWifiEnabled())

{

mWifiManager.setWifiEnabled(true);

}

}


Android

Android WiFi

WiFi开发——代码示例

//关闭WIFI

publicvoidcloseWifi()

{

if (!mWifiManager.isWifiEnabled())

{

mWifiManager.setWifiEnabled(false);

}

}

//得到WifiLock,以便应用程序保持wifi连接

publicvoidacquireWifiLock()

{

mWifiLock.acquire();

}


Android

Android WiFi

WiFi开发——代码示例

//解锁WifiLock

publicvoidreleaseWifiLock()

{

if (mWifiLock.isHeld()) //判断是否被锁定

{

mWifiLock.acquire();

}

}

//创建WifiLock

publicvoidcreatWifiLock()

{

mWifiLock = WifiManager.createWifiLock("Lock");

}


Android

Android WiFi

WiFi开发——代码示例

//得到已经配置好的网络列表

public List<WifiConfiguration> getConfiguration()

{

returnmWifiConfiguration;

}

//选择一个已配置好的网络进行连接

publicvoidconnectConfiguration(int index)

{

//索引大于配置好的网络索引返回

if(index > mWifiConfiguration.size())

{

return;

}

//连接配置好的指定ID的网络

mWifiManager.enableNetwork(mWifiConfiguration.get(index)

.networkId, true);

}


Android

Android 蓝牙

Android 蓝牙开发

Android SDK提供的相关包:android.bluetooth

  • API主要为应用程序提供如下几个功能:

  • 1. 搜寻有效范围内的蓝牙设备;

  • 2. 通过本地的蓝牙适配器来查询到与之配对的蓝牙设备;

  • 3. 在配对的蓝牙设备之间建立RFCOMM信道;

  • 4. 连接到其他设备的指定端口;

  • 5. 在设备之间传输数据。


Android

Android 蓝牙

Android 蓝牙API

android.bluetooth包括了以下两个接口:


Android

Android 蓝牙

Android 蓝牙API

android.bluetooth包括了以下一些类:


Android

Android 蓝牙

Android 蓝牙API


Android

Android 蓝牙

Android 蓝牙API

android.bluetooth中用于建立连接的类:

类似于Java API中的ServerSocket和Socket类


Android

Android 蓝牙

Android 蓝牙权限获取

要在应用程序中对Android系统的蓝牙设备进行相关操作,需要在项目中的AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.BLUETOOTH"/>

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />


Android

Android 蓝牙

Android蓝牙示例——TestBluetooth

运行截图:

(项目文件保存在/workspace目录,项目名称TestBluetooth)

程序初始化

打开蓝牙

允许搜索

正在搜索


Android

Android 蓝牙

Android蓝牙示例——TestBluetooth

TestBluetooth项目文件结构:

源码包名:com.bluetooth

主Activity:BluetoothActivity

查找蓝牙Activity:DiscoveryActivity

工具类(对话框功能):SamplesUtils

执行查找界面的布局:discovery.xml

主界面布局:main.xml


Android

Android 蓝牙

Android蓝牙示例——TestBluetooth

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

android:versionCode="1"

android:versionName="1.0" package="com.bluetooth">

<application android:icon="@drawable/icon"

android:label="@string/app_name">

<activity android:name="BluetoothActivity"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category

android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

接下页


Android

Android 蓝牙

Android蓝牙示例——TestBluetooth

AndroidManifest.xml(续):

<activity android:name="DiscoveryActivity"

android:theme="@style/Theme.Transparent">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

</application>

<!-- SDK的版本至少要高于5 -->

<uses-sdkandroid:minSdkVersion="5" />

<!-- 声明需要使用蓝牙的权限 -->

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

</manifest>


Android

Android 蓝牙

Android蓝牙示例——TestBluetooth

BluetoothActivity.java:

==代码较多,见书本

DiscoveryActivity.java:

==代码较多,见书本


Android

Android 蓝牙

Android蓝牙——建立连接

1. 本机作为服务端参与连接的建立

通过listenUsingRfcommWithServiceRecord(String, UUID)方法来得到一个BluetoothServerSocket对象,方法中的String参数代表了本机的名称,UUID是用于蓝牙设备之间相互识别的唯一识别码。

mServerSocket=mAdapter.listenUsingRfcommWithServiceRecord(NAME, UUID);

然后通过mServerSocket的accept()方法开始监听连接到这个端口的请求。

mServerSocket.accept();

该监听线程会一直阻塞直到有新的请求到来,除非在程序中人为的调用mServerSocket的close()方法。完整代码见书本。


Android

Android 蓝牙

Android蓝牙——建立连接

2. 本机作为客户端参与连接的建立

通过使用BluetoothDevice类来得到BluetoothSocket,这样将会得到一个用于连接到远程蓝牙设备的BlueSocket对象。

mSocket= device.createRfcommSocketToServiceRecord(MY_UUID);

得到了BluetoothSocket对象后,通过调用它的connect()方法,建立起到服务器的一条专用的蓝牙连接。完整代码见书本。


Android

Android 蓝牙

Android蓝牙——实例:手机联系人(contacts)交换的实现

这个程序实现的功能主要是:

将手机内的名片信息(包括姓名,电话,邮箱,备注以及联系人头像等等)备份到手机的SD卡中;

可以解析由步骤1备份生成的备份文件并且导入到手机中;

实现不同的手机用户之间相互发送名片信息的功能,支持wifi和蓝牙。


Android

1 启动界面

2 发送界面

3 正在连接

Android 蓝牙

Android蓝牙——实例:手机联系人(contacts)交换的实现

实例截图(通过WiFi发送手机联系人)


Android

Android 蓝牙

Android蓝牙——实例:手机联系人(contacts)交换的实现

发送文件的业务流程如图:


Android

Android 蓝牙

Android蓝牙——实例:手机联系人(contacts)交换的实现

发送文件步骤:

① 在A设备即发送方的客户端上输入设备B即接收方的IP地址和控制端口B,建立起到设备B的控制连接;

② 通过由第①步所建立的连接发送一条表示“请求发送文件”的命令,其中携带了设备A的数据端口A的值,同时设备A开始监听是否有请求连接到数据端口A;

③ 设备B在接收到设备A所发出的消息后,解析该命令的作用,发现是以SEND开头的“请求发送”命令,获取设备A的数据端口,尝试进行连接,若连接成功则发送一条“准备好”的消息;

④ 设备A接收到设备B所发出的准备好消息,开始通过数据端口连接发送文件,知道发送完成,释放端口。


Android

Android 蓝牙

通过蓝牙发送和接收名片文件

  • 蓝牙是通过以下的代码得到BluetoothServerSocket实例的:

BluetoothServerSocketbss =

mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

  • 蓝牙通过如下方式得到BluetoothSocket实例:

BluetoothSocketbs =

device.createRfcommSocketToServiceRecord(MY_UUID);


Android

本章小结

本章主要学习了Android平台下的网络通信基础知识,并且通过一组示例说明了如何在实际开发中来使用Android网络相关的API,着重介绍了WIFI和蓝牙开发的典型方法。


Android

The end


  • Login