第八章 android 网络通信
DESCRIPTION
第八章 Android 网络通信. 本章主要内容. 网络的重要性. 网络化信息化的世界 短信、电话 无线上网 移动 , 自由 ,随时随地. Android 支持的通信模式. GSM EDGE 3G ……. WIFI BLUETOOTH NFC. Android 网络通信基础. GSM. 全球移动通信系统 ( Global System for Mobile Communications ). 当前应用最为广泛的移动电话标准。全球超过 200 个国家和地区超过 10 亿人正在使用 GSM 电话。. Android 网络通信基础. GSM. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/1.jpg)
第八章 Android 网络通信
![Page 2: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/2.jpg)
本章主要内容
Android 网络通信基础
Android Http 通信
WIFI
蓝牙
![Page 3: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/3.jpg)
网络化信息化的世界短信、电话无线上网移动,自由,随时随地
网络的重要性
![Page 4: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/4.jpg)
Android 支持的通信模式
GSM
EDGE
3G
……
WIFI
BLUETOOTH
NFC
![Page 5: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/5.jpg)
Android 网络通信基础
GSM
全球移动通信系统( Global System for Mobile Communications )
当前应用最为广泛的移动电话标准。全球超过200 个国家和地区超过 10 亿人正在使用 GSM 电话。
![Page 6: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/6.jpg)
Android 网络通信基础
GSM
GSM 标准的广泛使用使得在移动电话运营商之间签署“漫游协定”后用户的国际漫游变得很平常。
GSM 较之它以前的标准最大的不同是他的信令和语音信道都是数字的,因此 GSM 被看作是第二代( 2G )移动电话系统。 GSM 标准当前由 3GPP 组织负责制定和维护。
![Page 7: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/7.jpg)
Android 网络通信基础
EDGE
增强型数据速率 GSM 演进技术Enhanced Data Rate for GSM Evolution
从 GSM 到 3G 的过渡技术能够充分利用现有的 GSM 资源弹性优势工作在 TDMA 和 GSM 网络提高了 GPRS 信道编码效率及其高速移动数据标准
![Page 8: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/8.jpg)
Android 网络通信基础
3G
第三代移动通信技术( 3rd-generation , 3G ) 3G 就是指 IMT-2000 ( International Mobile Telecommunications-
2000 ),是国际电信联盟( ITU )定义的第三代无线通信的全球标准。
IMT-2000 规定移动终端的连接速度:
以车速移动时 —— 144Kbps
室外静止或步行时—— 384Kbps
室内 —— 2Mbps
![Page 9: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/9.jpg)
Android 网络通信基础
3G
目前存在的几种标准: WCDMA ( Wideband CDMA )——欧洲 CDMA2000 —— 美国高通北美公司 TD-SCDMA (时分同步 CDMA ) —— 中国大陆 WiMAX —— 微波存取全球互通( 07 年提出) (Worldwide Interoperability for Microwave Access)
![Page 10: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/10.jpg)
Android 网络通信基础
3G—— 应用
宽带上网 视频通话 手机电视 无线搜索
3G 目前广泛地运用在:
手机音乐 手机购物 手机网游
![Page 11: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/11.jpg)
Android 网络通信基础
WiFi
Wireless Fidelity ,中文译为“无线兼容认证”
实质——一种商业认证 技术——短程无线传输 现状——带 WiFi 的便携式设备是潮流
![Page 12: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/12.jpg)
Android 网络通信基础
WiFi
常见的 WiFi 使用形式——无线路由器
覆盖范围—— 70 至 120 米 使用场合——公司、家庭、公共场所 优点——方便的建立局域网、低成本、使用简单
![Page 13: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/13.jpg)
Android 网络通信基础
WiFi—— 应用
无线电波的覆盖范围广 传输速度高 使用门槛比较低 消除布线的麻烦 发射功率低,健康安全
WiFi 相比其他技术有如下一些特点:
![Page 14: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/14.jpg)
Android 网络通信基础
Bluetooth
蓝牙的标志 开放式无线通讯标准 设备短距离互联解决方案
定义:
优势: 无需驱动程序——独特的配置文件 小型化无线电 低功率、低成本、安全性、稳固 易于使用、即时连接
![Page 15: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/15.jpg)
Android 网络通信基础
Bluetooth
蓝牙协议栈:
核心协议层( HCI 、 LMP 、 L2CAP 、 SDP ) 线缆替换协议层( RFCOMM ) 电话控制协议层( TCS-BIN ) 选用协议层
( PPP 、 TCP 、 IP 、 UDP 、 OBEX 、 IrMC 、 WAP
、 WAE )
![Page 16: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/16.jpg)
Android 网络通信基础
Bluetooth
蓝牙规范( profile )——为了保证蓝牙设备的互通性而制定的一系列规范:
蓝牙立体声音频传输规范( A2DP ) 基本图像规范( BIP ) 基本打印规范( BPP ) 无线电话规范( CTP ) 蓝牙耳机规范( HP ) 文件传输规范( FTP ) ……
![Page 17: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/17.jpg)
Android 网络通信基础
NFC
Near Field Communication (近场通讯)技术起源:
NFC 由非接触式射频识别 (RFID)及互联互通技术整合演变而来 , 在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。
![Page 18: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/18.jpg)
Android 网络通信基础
NFC
轻松、安全、迅速的通信 传输范围小——独特的信号衰减技术 带宽高、能耗低
技术优势:
应用场合:
门禁、公交 手机支付
![Page 19: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/19.jpg)
Android 网络通信基础
Andrion 提供的网络接口
Android 平台提供了三种网络接口,它们分别是:
java.net.*
org.apache.*
android.net.*
开发人员可以使用这些接口方便的进行 Android 网络编程。
![Page 20: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/20.jpg)
Android Http 通信
Http 简介
Http ( Hypertext Transfer Protocol )即超文本传输协议,它是Web 的基础协议,是建立在 TCP 上的一种应用。
Http 连接特点: 客户端发送的每次请求都需要服务器返回响应,并在请求结束后释放连接,这个建立连接到关闭连接的过程称为“一次连接”。由于 HTTP 在每次请求结束后都会主动释放连接,因此 HTTP 连接是一种“短连接”、“无状态”的连接。
![Page 21: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/21.jpg)
Android Http 通信
Http 的特点
1. 支持客户 /服务器模式;2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常
用的有 GET 、 POST 。3. 灵活: HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-
Type 加以标记;4. 无状态: HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
![Page 22: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/22.jpg)
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 方法传送的数据量较大。
![Page 23: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/23.jpg)
Android Http 通信
使用 HttpClient 接口通信示例
2 使用 GET 方法1 初始状态 3 使用 POST 方法
![Page 24: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/24.jpg)
Android Http 通信
使用 HttpClient 接口通信示例
使用 GET 方法请求数据的代码段如下:protected void httpClientGet() { //GET 请求的 url ,可以看到 url 中 weather 的值为 chengdu String googleWeatherUrl = "http://www.google.com/ig/api?hl=zh-
cn&weather=chengdu";//DefaultHttpClient ,默认的 HttpClient 类DefaultHttpClient httpclient = new DefaultHttpClient();//HttpGetHttpGet httpget = new HttpGet(googleWeatherUrl);//ResponseHandler ,用于处理服务端返回的响应ResponseHandler<String> responseHandler = new BasicResponseHandler();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();// 关闭连接
}
![Page 25: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/25.jpg)
Android Http 通信
使用 HttpClient 接口通信示例
使用 POST 方法请求数据的代码如下:protected void httpClientPost() {
try{ // 定义需要获取的内容来源地址
final String SERVER_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather";
// 根据内容来源地址创建一个 Http 请求HttpPost request = new HttpPost(SERVER_URL); // 添加参数List params = new ArrayList();params.add(new BasicNameValuePair("theCityCode", " 成都 "));params.add(new BasicNameValuePair("theUserID", "")); // 设置参数的编码request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));// 发送请求并获取反馈, 解析返回的内容HttpResponse httpResponse = new
DefaultHttpClient().execute(request);// 如果返回状态码不为 404 ,即 URL 无误则显示获取的内容if (httpResponse.getStatusLine().getStatusCode() != 404){
String result = EntityUtils.toString(httpResponse.getEntity());
tv.setText(result.toString());}
}catch (Exception e) {}
}
![Page 26: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/26.jpg)
String Url = "http://www.google.com/ig/api?weather=chengdu";URL url = new URL(googleWeatherUrl);HttpURLConnection httpconn = (HttpURLConnection)
url.openConnection();
Android Http 通信
使用 HttpUrlConnection 接口通信示例
HttpURLConnection继承自 URLConnection 。要获取HttpURLConnection类的实例,需要使用 openConnection() 方法来获取,代码如下:
![Page 27: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/27.jpg)
Android Http 通信
使用 HttpUrlConnection 接口通信示例
5 使用 GET 方法4 初始状态 6 使用 POST 方法
![Page 28: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/28.jpg)
HttpURLConnection 使用 GET 方法获取数据的关键代码如下:
Android Http 通信
使用 HttpUrlConnection 接口通信示例
// 获取 HttpURLConnection 实例HttpURLConnection httpconn = (HttpURLConnection)
url.openConnection();if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
Toast.makeText(getApplicationContext(), " 连接 Google Weather API 成功 !", Toast.LENGTH_SHORT).show();
// InputStreamReader ,用于读取网页内容InputStreamReader isr = new
InputStreamReader(httpconn.getInputStream(), "utf-8");int i;String content = "";// 从流中读取数据while ((i = isr.read()) != -1) {
content = content + (char) i;}isr.close();// 设置 TextViewtv.setText(content);
}//disconnecthttpconn.disconnect();
![Page 29: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/29.jpg)
Android Http 通信
使用 HttpUrlConnection 接口通信示例
HttpURLConnection 使用 POST 方法请求数据需要改变的主要有两处,一是需要使用 setRequestMethod() 方法,二是使用 DataOutputStream向服务器写入参数值。代码如下:
// 使用 HttpURLConnection 打开连接HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();// 因为要求使用 Post 方式提交数据,需要设置为 trueurlConn.setDoOutput(true);urlConn.setDoInput(true);// 设置以 Post 方式,注意此处的“ POST” 必须大写urlConn.setRequestMethod("POST");//Post 请求不能使用缓存urlConn.setUseCaches(false);urlConn.setInstanceFollowRedirects(true);// 配置本次连接的 Content-Type ,配置为 application/x-www-form-urlencodedurlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 连接,从 postUrl.openConnection() 至此的配置必须在 connect 之前完成// 要注意的事 connection.getOutputStream 会隐含地进行 connect 。urlConn.connect();//DataOutputStream 流上传数据DataOutputStream out=new DataOutputStream(urlConn.getOutputStream());// 要上传的参数String content="par="+ URLEncoder.encode("POSTTransferData", "gb2312");// 将要上传的内容写入流中out.writeBytes(content);// 刷新,关闭out.flush();out.close();
![Page 30: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/30.jpg)
Android WiFi
开发
Android SDK 提供的相关包: android.net.wifi
ScanResult 用于描述一个已经被检测到的 wifi 接入点。
WifiConfiguration 该类代表了一个已经配置好的 wifi 网络,包括了该网络的一些安全设置。例如接入点密码,接入点通讯所采用的安全标准。
WifiConfiguration.AuthAlgorithm 公认的 IEEE 802.11 标准认证算法。
![Page 31: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/31.jpg)
Android WiFi
相关类介绍
WifiConfiguration.GroupCipher 公认的组密码。 WifiConfiguration.KeyMgmt 公认的密钥管理方案。 WifiConfiguration.PairwiseCipher 公认的用于 WPA 的成对
密码标准。 WifiConfiguration.Protocol 公认的安全协议WifiConfiguration.Status 网络所可能存在的状态。
![Page 32: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/32.jpg)
Android WiFi
相关类介绍
WifiInfo 描述了各个 wifi 连接的状态,该连接是否处于活动状态或者是否处于识别过程中。
WifiManager 这个类比较重要。它提供了用于管理 wifi连接的各种主要 API 。详见表后说明。
WifiManager.MulticastLock 允许应用程序接收 wifi 的多播数据包。
WifiManager.WifiLock 允许应用程序永久地保持 wifi 连接(防止系统自动回收)。
![Page 33: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/33.jpg)
Android WiFi
重要类
Android 操作 WiFi 的重要类—— WifiManager
这个类提供了最主要的用于管理 wifi 连接的 API 。
通过调用 Context.getSystemService(Context.WIFI_SERVICE)
方法来得到系统提供的 WifiManager ,代码如下:
WifiManager mWifiManager = (WifiManager)
context.getSystemService(Context.WIFI_SERVICE);
![Page 34: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/34.jpg)
Android WiFi
WifiManager主要用于处理的事务
已经配置好的网络连接列表。 如果当前有连接存在的话,可以得到当前正处于活动状态的 wifi 连接的控制权,可以通过它建立或者断开连接,并且可以查询该网络连接的动态信息;
通过对已经扫描到的接入点的足够信息来进行判断,得出一个最好的接入点进行连接。
定义了很多用于系统广播通知的常量,它们分别代表了WiFi 状态的改变。
![Page 35: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/35.jpg)
Android WiFi
WiFi 的开发补充
Android 网络连接管理类—— ConnectivityManager
该类用于管理抽象意义上的“网络连接”
监控网络连接(包括WiFi , GPRS , UMTS等等); 当网络连接发生改变时,向系统广播这一改变; 当失去了当前的网络连接时,尝试切换到另外一个连接; 提供了允许其他应用程序调用的 API让应用程序可以方便地查询当前的网络状态。
它完成的主要任务是:
![Page 36: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/36.jpg)
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>
![Page 37: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/37.jpg)
Android WiFi
WiFi 开发——代码示例
// 取得 WifiManager 对象mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);// 取得 WifiInfo 对象mWifiInfo = mWifiManager.getConnectionInfo();// 打开 WIFIpublic void openWifi(){
if (!mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(true);}
}
![Page 38: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/38.jpg)
Android WiFi
WiFi 开发——代码示例
// 关闭 WIFIpublic void closeWifi(){
if (!mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(false);}
}// 得到 WifiLock ,以便应用程序保持 wifi 连接public void acquireWifiLock(){
mWifiLock.acquire();}
![Page 39: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/39.jpg)
// 解锁 WifiLockpublic void releaseWifiLock(){
if (mWifiLock.isHeld()) // 判断是否被锁定{
mWifiLock.acquire();}
}// 创建 WifiLockpublic void creatWifiLock(){
mWifiLock = WifiManager.createWifiLock("Lock");}
Android WiFi
WiFi 开发——代码示例
![Page 40: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/40.jpg)
// 得到已经配置好的网络列表public List<WifiConfiguration> getConfiguration(){
return mWifiConfiguration;}//选择一个已配置好的网络进行连接public void connectConfiguration(int index){
//索引大于配置好的网络索引返回if(index > mWifiConfiguration.size()){
return;}// 连接配置好的指定 ID 的网络
mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true);
}
Android WiFi
WiFi 开发——代码示例
![Page 41: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/41.jpg)
Android 蓝牙
Android 蓝牙开发
Android SDK 提供的相关包: android.bluetooth
API主要为应用程序提供如下几个功能: 1. 搜寻有效范围内的蓝牙设备; 2. 通过本地的蓝牙适配器来查询到与之配对的蓝牙设备; 3. 在配对的蓝牙设备之间建立 RFCOMM 信道; 4. 连接到其他设备的指定端口; 5. 在设备之间传输数据。
![Page 42: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/42.jpg)
Android 蓝牙
Android 蓝牙 API
接口名 描述
BluetoothProfile 蓝牙规范的公用 API 接口,所有的蓝牙规范都必 须 实 现 这 个 接口。 Profile 目的 是 要确保Bluetooth 设备间的互通性。
BluetoothProfile.ServiceListener 用于在蓝牙客户设备连接或者断开连接时给它们发出通知的接口。
android.bluetooth包括了以下两个接口:
![Page 43: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/43.jpg)
Android 蓝牙
Android 蓝牙 API
android.bluetooth包括了以下一些类:
类名 描述BluetoothA2dp 这个类作为对 BluetoothProfile 接口实现的实例,
这是对蓝牙的 A2DP规范的 API 实现类。
BluetoothAdapter 代表了本地的蓝牙适配器。BluetoothAssignedNumbers 蓝牙的指令编号。
BluetoothClass 代表蓝牙的类,这个类描述了蓝牙设备的特征和性能参数。
![Page 44: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/44.jpg)
Android 蓝牙
Android 蓝牙 API
类名 描述BluetoothClass.Device 定义了所有的 device 类所用的常量。
BluetoothClass.Device.Major 定义了所有主要的 device 类所用的常量。
BluetoothClass.Service 定义了所有的 service 类所用的常量。
BluetoothHeadset 实现蓝牙耳机服务的公共 API 。
![Page 45: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/45.jpg)
Android 蓝牙
Android 蓝牙 API
类名 描述BluetoothServerSocket 用于监听 socket 连接请求的类。
BluetoothSocket 一个已连接的或正在连接的 socket 类。
android.bluetooth 中用于建立连接的类:
类似于 Java API 中的 ServerSocket 和 Socket 类
![Page 46: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/46.jpg)
Android 蓝牙
Android 蓝牙权限获取
要在应用程序中对 Android 系统的蓝牙设备进行相关操作,需要在项目中的 AndroidManifest.xml 中添加:<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
![Page 47: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/47.jpg)
Android 蓝牙
Android 蓝牙示例——TestBluetooth
运行截图:
①程序初始化
②打开蓝牙
③允许搜索
④正在搜索
(项目文件保存在 /workspace目录,项目名称 TestBluetooth )
![Page 48: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/48.jpg)
Android 蓝牙
Android 蓝牙示例——TestBluetooth
TestBluetooth项目文件结构:
源码包名: com.bluetooth
主 Activity : BluetoothActivity
查找蓝牙 Activity : DiscoveryActivity
工具类(对话框功能): SamplesUtils
执行查找界面的布局: discovery.xml
主界面布局: main.xml
![Page 49: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/49.jpg)
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>接下页
![Page 50: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/50.jpg)
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-sdk android:minSdkVersion="5" /> <!-- 声明需要使用蓝牙的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /></manifest>
![Page 51: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/51.jpg)
Android 蓝牙
Android 蓝牙示例——TestBluetooth
BluetoothActivity.java:== 代码较多,见书本
DiscoveryActivity.java:== 代码较多,见书本
![Page 52: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/52.jpg)
Android 蓝牙
Android 蓝牙——建立连接
1. 本机作为服务端参与连接的建立 通过 listenUsingRfcommWithServiceRecord(String, UUID) 方法来得到一个BluetoothServerSocket对象,方法中的 String参数代表了本机的名称, UUID是用于蓝牙设备之间相互识别的唯一识别码。
mServerSocket=mAdapter.listenUsingRfcommWithServiceRecord(NAME, UUID);然后通过mServerSocket 的 accept() 方法开始监听连接到这个端口的请求。mServerSocket.accept();
该监听线程会一直阻塞直到有新的请求到来,除非在程序中人为的调用mServerSocket 的 close() 方法。完整代码见书本。
![Page 53: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/53.jpg)
Android 蓝牙
Android 蓝牙——建立连接
2. 本机作为客户端参与连接的建立
通过使用 BluetoothDevice 类来得到 BluetoothSocket ,这样将会得到一个用于连接到远程蓝牙设备的 BlueSocket 对象。
mSocket= device.createRfcommSocketToServiceRecord(MY_UUID);
得到了 BluetoothSocket对象后,通过调用它的 connect() 方法,建立起到服务器的一条专用的蓝牙连接。完整代码见书本。
![Page 54: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/54.jpg)
Android 蓝牙
Android 蓝牙——实例:手机联系人( contacts )交换的实现
这个程序实现的功能主要是:
1. 将手机内的名片信息(包括姓名,电话,邮箱,备注以及联系人头像等等)备份到手机的 SD卡中;
2. 可以解析由步骤 1 备份生成的备份文件并且导入到手机中;3. 实现不同的手机用户之间相互发送名片信息的功能,支持 wifi 和
蓝牙。
![Page 55: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/55.jpg)
Android 蓝牙
Android 蓝牙——实例:手机联系人( contacts )交换的实现
2 发送界面1 启动界面 3 正在连接
实例截图 ( 通过WiFi 发送手机联系人 )
![Page 56: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/56.jpg)
Android 蓝牙
Android 蓝牙——实例:手机联系人( contacts )交换的实现
发送文件的业务流程如图:
Androi d设备A Androi d设备B
控制端口A
数据端口B数据端口A
控制端口B①
②发送命令“ SEND+端口号”
③利用接收到的数据端口号建立连接,发送准备好消息
等待准备好②
④发送文件
![Page 57: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/57.jpg)
Android 蓝牙
Android 蓝牙——实例:手机联系人( contacts )交换的实现
发送文件步骤:
① 在 A 设备即发送方的客户端上输入设备 B即接收方的 IP 地址和控制端口B ,建立起到设备 B 的控制连接;
② 通过由第①步所建立的连接发送一条表示“请求发送文件”的命令,其中携带了设备 A 的数据端口 A 的值,同时设备 A 开始监听是否有请求连接到数据端口 A;
③ 设备 B 在接收到设备 A 所发出的消息后,解析该命令的作用,发现是以SEND 开头的“请求发送”命令,获取设备 A 的数据端口,尝试进行连接,若连接成功则发送一条“准备好”的消息;
④ 设备 A 接收到设备 B 所发出的准备好消息,开始通过数据端口连接发送文件,知道发送完成,释放端口。
![Page 58: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/58.jpg)
Android 蓝牙
通过蓝牙发送和接收名片文件
BluetoothServerSocket bss = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
蓝牙是通过以下的代码得到 BluetoothServerSocket 实例的:
BluetoothSocket bs = device.createRfcommSocketToServiceRecord(MY_UUID);
蓝牙通过如下方式得到 BluetoothSocket 实例:
![Page 59: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/59.jpg)
本章小结
本章主要学习了 Android 平台下的网络通信基础知识,并且通过一组示例说明了如何在实际开发中来使用 Android 网络相关的 API ,着重介绍了WIFI 和蓝牙开发的典型方法。
![Page 60: 第八章 Android 网络通信](https://reader033.vdocuments.pub/reader033/viewer/2022061522/5681309e550346895d969028/html5/thumbnails/60.jpg)
THE END