某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。   既然是调用WebService,我们首先的搭建WebService服务器。为了便于操作,我们就使用网上免费的WebService进行学习。   下面演示的就是如何通过该网站提供的手机号码归属地查询WebService服务查询号码归属地    首先,将请求消息保存在XML文件中,然后使用$替换请求参数,如下:   mobilesoap.xml   <?xml version="1.0" encoding="utf-8"?>   <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">   <soap12:Body>   <getMobileCodeInfo xmlns="http://WebXml.com.cn/">   <mobileCode>$mobile</mobileCode>   <userID></userID>   </getMobileCodeInfo>   </soap12:Body>   </soap12:Envelope>   其次,设计MainActivity布局文件,   main.xml   <?xml version="1.0" encoding="utf-8"?>   <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent">   <TextView   android:layout_width="fill_parent"   android:layout_height="wrap_content"   android:text="手机号码" />   <EditText   android:id="@+id/mobileNum"   android:layout_width="fill_parent"   android:layout_height="wrap_content"   android:text=""   />   <Button   android:id="@+id/btnSearch"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="查询"   />   <TextView   android:id="@+id/mobileAddress"   android:layout_width="fill_parent"   android:layout_height="wrap_content"   />   </LinearLayout>   下面贴出MainActivity,   在Android中调用WebService还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。   package com.szy.webservice;   import java.io.ByteArrayOutputStream;   import java.io.InputStream;   import java.io.OutputStream;   import java.net.HttpURLConnection;   import java.net.URL;   import java.util.HashMap;   import java.util.Map;   import java.util.regex.Matcher;   import java.util.regex.Pattern;   import org.xmlpull.v1.XmlPullParser;   import android.app.Activity;   import android.os.Bundle;   import android.util.Log;   import android.util.Xml;   import android.view.View;   import android.widget.Button;   import android.widget.EditText;   import android.widget.TextView;   import android.widget.Toast;   public class MainActivity extends Activity   {   private EditText mobileNum;   private TextView mobileAddress;   private static final String TAG = "MainActivity";   @Override   public void onCreate(Bundle savedInstanceState)   {   super.onCreate(savedInstanceState);   setContentView(R.layout.main);   mobileNum = (EditText) this.findViewById(R.id.mobileNum);   mobileAddress = (TextView) this.findViewById(R.id.mobileAddress);   Button btnSearch = (Button) this.findViewById(R.id.btnSearch);   btnSearch.setOnClickListener(new View.OnClickListener()   {   @Override   public void onClick(View v)   {   // 获取电话号码   String mobile = mobileNum.getText().toString();   // 读取xml文件   InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");   try   {   // 显示电话号码地理位置,该段代码不合理,仅供参考   mobileAddress.setText(getMobileAddress(inStream, mobile));   } catch (Exception e)   {   Log.e(TAG, e.toString());   Toast.makeText(MainActivity.this, "查询失败", 1).show();   }   }   });   }   /**   * 获取电话号码地理位置   *   * @param inStream   * @param mobile   * @return   * @throws Exception   */   private String getMobileAddress(InputStream inStream, String mobile) throws Exception   {   // 替换xml文件中的电话号码   String soap = readSoapFile(inStream, mobile);   byte[] data = soap.getBytes();   // 提交Post请求   URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");   HttpURLConnection conn = (HttpURLConnection) url.openConnection();   conn.setRequestMethod("POST");   conn.setConnectTimeout(5 * 1000);   conn.setDoOutput(true);   conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");   conn.setRequestProperty("Content-Length", String.valueOf(data.length));   OutputStream outStream = conn.getOutputStream();   outStream.write(data);   outStream.flush();   outStream.close();   if (conn.getResponseCode() == 200)   {   // 解析返回信息   return parseResponseXML(conn.getInputStream());   }   return "Error";   }   private String readSoapFile(InputStream inStream, String mobile) throws Exception   {   // 从流中获取文件信息   byte[] data = readInputStream(inStream);   String soapxml = new String(data);   // 占位符参数   Map<String, String> params = new HashMap<String, String>();   params.put("mobile", mobile);   // 替换文件中占位符   return replace(soapxml, params);   }   /**   * 读取流信息   *   * @param inputStream   * @return   * @throws Exception   */   private byte[] readInputStream(InputStream inputStream) throws Exception   {   byte[] buffer = new byte[1024];   int len = -1;   ByteArrayOutputStream outSteam = new ByteArrayOutputStream();   while ((len = inputStream.read(buffer)) != -1)   {   outSteam.write(buffer, 0, len);   }   outSteam.close();   inputStream.close();   return outSteam.toByteArray();   }   /**   * 替换文件中占位符   *   * @param xml   * @param params   * @return   * @throws Exception   */   private String replace(String xml, Map<String, String> params) throws Exception   {   String result = xml;   if (params != null && !params.isEmpty())   {   for (Map.Entry<String, String> entry : params.entrySet())   {   String name = "\\$" + entry.getKey();   Pattern pattern = Pattern.compile(name);   Matcher matcher = pattern.matcher(result);   if (matcher.find())   {   result = matcher.replaceAll(entry.getValue());   }   }   }   return result;   }   /**   * 解析XML文件   * @param inStream   * @return   * @throws Exception   */   private static String parseResponseXML(InputStream inStream) throws Exception   {   XmlPullParser parser = Xml.newPullParser();   parser.setInput(inStream, "UTF-8");   int eventType = parser.getEventType();// 产生第一个事件   while (eventType != XmlPullParser.END_DOCUMENT)   {   // 只要不是文档结束事件   switch (eventType)   {   case XmlPullParser.START_TAG:   String name = parser.getName();// 获取解析器当前指向的元素的名称   if ("getMobileCodeInfoResult".equals(name))   {   return parser.nextText();   }   break;   }   eventType = parser.next();   }   return null;   }   }   最后注意,由于需要访问网络,需要加上权限  <uses-permission android:name="android.permission.INTERNET"/>   通过上面简单的例子,相信大家已经学习了如何在Android中调用WebService

更多相关文章

  1. Android(安卓)NDK编译本地文件以及引用第三方so文件
  2. android页面布局时定义控件ID时@id/XX和@+id/xx 有什么区别
  3. Android实现增量更新
  4. android 逆向工程
  5. Service与Android系统实现(1)-- 应用程序里的Service(二)
  6. Android中怎么破解游戏之修改金币数
  7. ANDROID Bionic C DOCS
  8. android 4.0以上WebView不能全屏播放视频的解决办法
  9. Android如何防止apk程序被反编译(尊重劳动成果)

随机推荐

  1. Windows Azure移动服务更新,支持Android、
  2. Android实现QQ登录(Android(安卓)Studio开
  3. Android(安卓)TTS 中文 文字转语音 使用T
  4. 在android上实现ffmpeg的pipe功能,实现除
  5. Android(安卓)中使用的阿里 mirrors
  6. android棋牌游戏实例,提供源码。
  7. 疯狂连连看学习心得-基于Android(安卓)St
  8. Android(安卓)Studio与夜神模拟器进行连
  9. Android自学笔记:开发常见问题总结
  10. Android流式布局FlowLayout的实现,Android