600 likes | 802 Views
第八章 Android 网络通信. 本章主要内容. 网络的重要性. 网络化信息化的世界 短信、电话 无线上网 移动 , 自由 ,随时随地. Android 支持的通信模式. GSM EDGE 3G ……. WIFI BLUETOOTH NFC. Android 网络通信基础. GSM. 全球移动通信系统 ( Global System for Mobile Communications ). 当前应用最为广泛的移动电话标准。全球超过 200 个国家和地区超过 10 亿人正在使用 GSM 电话。. Android 网络通信基础. GSM.
E N D
网络的重要性 • 网络化信息化的世界 • 短信、电话 • 无线上网 • 移动,自由,随时随地
Android 支持的通信模式 • GSM • EDGE • 3G • …… • WIFI • BLUETOOTH • NFC
Android 网络通信基础 GSM 全球移动通信系统 (Global System for Mobile Communications) 当前应用最为广泛的移动电话标准。全球超过200个国家和地区超过10亿人正在使用GSM电话。
Android 网络通信基础 GSM • GSM标准的广泛使用使得在移动电话运营商之间签署“漫游协定”后用户的国际漫游变得很平常。 • GSM较之它以前的标准最大的不同是他的信令和语音信道都是数字的,因此GSM被看作是第二代(2G)移动电话系统。GSM标准当前由3GPP组织负责制定和维护。
Android 网络通信基础 EDGE 增强型数据速率GSM演进技术 Enhanced Data Rate for GSM Evolution • 从GSM到3G的过渡技术 • 能够充分利用现有的GSM资源 • 弹性优势 • 工作在TDMA和GSM网络 • 提高了GPRS信道编码效率及其高速移动数据标准
Android 网络通信基础 3G 第三代移动通信技术(3rd-generation,3G) 3G就是指IMT-2000(International Mobile Telecommunications-2000),是国际电信联盟(ITU)定义的第三代无线通信的全球标准。 IMT-2000规定移动终端的连接速度: • 以车速移动时 ——144Kbps • 室外静止或步行时——384Kbps • 室内 ——2Mbps
Android 网络通信基础 3G 目前存在的几种标准: • WCDMA(Wideband CDMA)——欧洲 • CDMA2000 —— 美国高通北美公司 • TD-SCDMA(时分同步CDMA) —— 中国大陆 • WiMAX —— 微波存取全球互通(07年提出) • (Worldwide Interoperability for Microwave Access)
Android 网络通信基础 3G——应用 3G目前广泛地运用在: • 宽带上网 • 视频通话 • 手机电视 • 无线搜索 • 手机音乐 • 手机购物 • 手机网游
Android 网络通信基础 WiFi Wireless Fidelity,中文译为“无线兼容认证” • 实质——一种商业认证 • 技术——短程无线传输 • 现状——带WiFi的便携式设备是潮流
Android 网络通信基础 WiFi 常见的WiFi使用形式——无线路由器 • 覆盖范围——70至120米 • 使用场合——公司、家庭、公共场所 • 优点——方便的建立局域网、低成本、使用简单
Android 网络通信基础 WiFi——应用 WiFi相比其他技术有如下一些特点: • 无线电波的覆盖范围广 • 传输速度高 • 使用门槛比较低 • 消除布线的麻烦 • 发射功率低,健康安全
Android 网络通信基础 Bluetooth 定义: 蓝牙的标志 • 开放式无线通讯标准 • 设备短距离互联解决方案 优势: • 无需驱动程序——独特的配置文件 • 小型化无线电 • 低功率、低成本、安全性、稳固 • 易于使用、即时连接
Android 网络通信基础 Bluetooth 蓝牙协议栈: • 核心协议层(HCI、LMP、L2CAP、SDP) • 线缆替换协议层(RFCOMM) • 电话控制协议层(TCS-BIN) • 选用协议层(PPP、TCP、IP、UDP、OBEX、IrMC、WAP、WAE)
Android 网络通信基础 Bluetooth 蓝牙规范(profile)——为了保证蓝牙设备的互通性而制定的一系列规范: • 蓝牙立体声音频传输规范(A2DP) • 基本图像规范(BIP) • 基本打印规范(BPP) • 无线电话规范(CTP) • 蓝牙耳机规范(HP) • 文件传输规范(FTP) • ……
Android 网络通信基础 NFC Near Field Communication(近场通讯) 技术起源: NFC由非接触式射频识别(RFID)及互联互通技术整合演变而来,在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。
Android 网络通信基础 NFC 技术优势: • 轻松、安全、迅速的通信 • 传输范围小——独特的信号衰减技术 • 带宽高、能耗低 应用场合: • 门禁、公交 • 手机支付
Android 网络通信基础 Andrion提供的网络接口 Android平台提供了三种网络接口,它们分别是: • java.net.* • org.apache.* • android.net.* 开发人员可以使用这些接口方便的进行Android网络编程。
Android Http通信 Http 简介 Http(Hypertext Transfer Protocol)即超文本传输协议,它是Web的基础协议,是建立在TCP上的一种应用。 Http连接特点: 客户端发送的每次请求都需要服务器返回响应,并在请求结束后释放连接,这个建立连接到关闭连接的过程称为“一次连接”。 由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”、“无状态”的连接。
Android Http通信 Http 的特点 支持客户/服务器模式; 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记; 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
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 Http通信 使用HttpClient接口通信示例 1 初始状态 2 使用GET方法 3 使用POST方法
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 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 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 Http通信 使用HttpUrlConnection接口通信示例 4 初始状态 5 使用GET方法 6 使用POST方法
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 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 WiFi 开发 Android SDK提供的相关包:android.net.wifi
Android WiFi 相关类介绍
Android WiFi 相关类介绍
Android WiFi 重要类 Android 操作WiFi的重要类——WifiManager 这个类提供了最主要的用于管理wifi连接的API。 通过调用Context.getSystemService(Context.WIFI_SERVICE) 方法来得到系统提供的WifiManager,代码如下: WifiManagermWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Android WiFi WifiManager主要用于处理的事务 • 已经配置好的网络连接列表。 • 如果当前有连接存在的话,可以得到当前正处于活动状态的wifi连接的控制权,可以通过它建立或者断开连接,并且可以查询该网络连接的动态信息; • 通过对已经扫描到的接入点的足够信息来进行判断,得出一个最好的接入点进行连接。 • 定义了很多用于系统广播通知的常量,它们分别代表了WiFi状态的改变。
Android WiFi WiFi的开发补充 Android网络连接管理类——ConnectivityManager 该类用于管理抽象意义上的“网络连接” 它完成的主要任务是: • 监控网络连接(包括WiFi,GPRS,UMTS等等); • 当网络连接发生改变时,向系统广播这一改变; • 当失去了当前的网络连接时,尝试切换到另外一个连接; • 提供了允许其他应用程序调用的API让应用程序可以方便地查询当前的网络状态。
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 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 WiFi WiFi开发——代码示例 //关闭WIFI publicvoidcloseWifi() { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(false); } } //得到WifiLock,以便应用程序保持wifi连接 publicvoidacquireWifiLock() { mWifiLock.acquire(); }
Android WiFi WiFi开发——代码示例 //解锁WifiLock publicvoidreleaseWifiLock() { if (mWifiLock.isHeld()) //判断是否被锁定 { mWifiLock.acquire(); } } //创建WifiLock publicvoidcreatWifiLock() { mWifiLock = WifiManager.createWifiLock("Lock"); }
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 SDK提供的相关包:android.bluetooth • API主要为应用程序提供如下几个功能: • 1. 搜寻有效范围内的蓝牙设备; • 2. 通过本地的蓝牙适配器来查询到与之配对的蓝牙设备; • 3. 在配对的蓝牙设备之间建立RFCOMM信道; • 4. 连接到其他设备的指定端口; • 5. 在设备之间传输数据。
Android 蓝牙 Android 蓝牙API android.bluetooth包括了以下两个接口:
Android 蓝牙 Android 蓝牙API android.bluetooth包括了以下一些类:
Android 蓝牙 Android 蓝牙API
Android 蓝牙 Android 蓝牙API android.bluetooth中用于建立连接的类: 类似于Java API中的ServerSocket和Socket类
Android 蓝牙 Android 蓝牙权限获取 要在应用程序中对Android系统的蓝牙设备进行相关操作,需要在项目中的AndroidManifest.xml中添加: <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
Android 蓝牙 Android蓝牙示例——TestBluetooth 运行截图: (项目文件保存在/workspace目录,项目名称TestBluetooth) ① ② ③ ④ 程序初始化 打开蓝牙 允许搜索 正在搜索
Android 蓝牙 Android蓝牙示例——TestBluetooth TestBluetooth项目文件结构: 源码包名:com.bluetooth 主Activity:BluetoothActivity 查找蓝牙Activity:DiscoveryActivity 工具类(对话框功能):SamplesUtils 执行查找界面的布局:discovery.xml 主界面布局:main.xml
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蓝牙示例——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>