zoukankan      html  css  js  c++  java
  • Android案例练习(一)——智能机器人

    Android案例练习(一)——智能机器人

        案例来自慕课网 http://www.imooc.com/,采用Eclipse编写。

        一、本案例使用的知识:

          1.第三方API图灵机器人的API。

                     2.ListView多种Item布局时的处理,实现聊天对话的界面
         二、目录结构
          
         三、编写过程:
          1.编写一个工具类,实现消息的发送与接收
          建立包com.example.util,在包下建立HttpUtils.java类,代码如下。
      1 package com.example.util;
      2 /*
      3  * 发送一个消息,得到一个返回的消息
      4  */
      5 import java.io.ByteArrayOutputStream;
      6 import java.io.IOException;
      7 import java.io.InputStream;
      8 import java.io.UnsupportedEncodingException;
      9 import java.net.HttpURLConnection;
     10 import java.net.MalformedURLException;
     11 import java.net.URLEncoder;
     12 import java.util.Date;
     13 
     14 import com.example.bean.ChatMessage;
     15 import com.example.bean.ChatMessage.Type;
     16 import com.example.bean.Result;
     17 import com.google.gson.Gson;
     18 
     19 public class HttpUtils {
     20     private static final String URL="http://www.tuling123.com/openapi/api";
     21     //固定的uri,指定往哪里发送请求
     22     private static final String API_KEY="ba5637dd0b34bab9322c7c61317cee5a";
     23     public static String doGet(String msg){
     24         String result="";
     25         String url=setParams(msg);//为URL设置参数
     26         InputStream is=null;
     27         ByteArrayOutputStream baos=null;
     28         
     29         try {
     30             java.net.URL urlNet=new java.net.URL(url);
     31             HttpURLConnection conn=(HttpURLConnection) urlNet.openConnection();
     32             conn.setReadTimeout(5*1000);
     33             conn.setConnectTimeout(5*1000);
     34             conn.setRequestMethod("GET");//conn参数设置
     35             
     36             is=conn.getInputStream();
     37             int len=-1;
     38             byte[] buf=new byte[128];//设置128字节缓冲区
     39             baos=new ByteArrayOutputStream();
     40             
     41             while((len=is.read(buf)) !=-1){
     42                 baos.write(buf,0,len);
     43             }
     44             baos.flush();
     45             
     46             result=new String(baos.toByteArray());
     47         } catch (MalformedURLException e) {
     48             // TODo 自动生成的 catch 块
     49             e.printStackTrace();
     50         } catch (IOException e) {
     51             // TODO 自动生成的 catch 块
     52             e.printStackTrace();
     53         }finally
     54         {
     55             if(baos!=null){
     56                 try {
     57                     baos.close();
     58                 } catch (IOException e) {
     59                     // TODO 自动生成的 catch 块
     60                     e.printStackTrace();
     61                 }
     62             }
     63             if(is!=null){
     64                 try {
     65                     is.close();
     66                 } catch (IOException e) {
     67                     // TODO 自动生成的 catch 块
     68                     e.printStackTrace();
     69                 }
     70             }
     71             
     72         }
     73         return result;
     74     }
     75     private static String setParams(String msg) {
     76         // TODO 自动生成的方法存根
     77        String url="";
     78     try {
     79         url = URL+"?key="+API_KEY+"&info="+URLEncoder.encode(msg,"UTF-8");
     80     } catch (UnsupportedEncodingException e) {
     81         // TODO 自动生成的 catch 块
     82         e.printStackTrace();
     83     }
     84         return url;
     85     }
     86     public static ChatMessage sendMessage(String msg){
     87         ChatMessage chatMessage=new ChatMessage();
     88         String jsonRes=doGet(msg);
     89         Gson gson=new Gson();
     90         Result result=null;
     91         try {
     92             result = gson.fromJson(jsonRes, Result.class);
     93             chatMessage.setMsg(result.getText());
     94         } catch (Exception e) {
     95             // TODO: handle exception
     96             chatMessage.setMsg("服务器繁忙,请稍后重试");
     97         }
     98         chatMessage.setDate(new Date());
     99         chatMessage.setType(Type.INCOMING);
    100         return chatMessage;
    101     }
    102     
    103 }
          2.搭建操作环境,对工具类进行测试
          建立包com.example.test,在此包下建立类TestHttpUtils.java。代码如下:
     1 package com.example.test;
     2 
     3 import com.example.util.HttpUtils;
     4 
     5 import android.test.AndroidTestCase;
     6 import android.util.Log;
     7 
     8 
     9 public class TestHttpUtils extends AndroidTestCase {
    10         public void testSendInfo(){
    11             String res=HttpUtils.doGet("给我讲个笑话");
    12             Log.e("TAG",res);
    13             String res1=HttpUtils.doGet("给我讲个鬼故事");
    14             Log.e("TAG",res1);
    15             String res2=HttpUtils.doGet("你好");
    16             Log.e("TAG",res2);
    17             String res3=HttpUtils.doGet("你真美");
    18             Log.e("TAG",res3);
    19         }
    20 }
          3.编写聊天界面
          在drawable-hdpi文件下加入所需的图片,res/layout下建立activity_main.xml,item_from_msg.xml,item_to_msg.xml三个布局文件,代码如下: 
     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent">
     5     <RelativeLayout 
     6         android:id="@+id/id_ly_top"
     7         android:layout_width="fill_parent"
     8         android:layout_height="45dp"
     9         android:layout_alignParentTop="true"
    10         android:background="@drawable/title_bar">"
    11         <TextView
    12             android:layout_width="wrap_content"
    13             android:layout_height="wrap_content"
    14             android:layout_centerInParent="true"
    15             android:textColor="#ffffff"
    16             android:textSize="22sp"
    17             android:text="小慕"
    18             />"
    19     </RelativeLayout>
    20     
    21     
    22     <RelativeLayout
    23         android:id="@+id/id_ly_bottom"
    24         android:layout_width="fill_parent"
    25         android:layout_height="55dp"
    26         android:layout_alignParentBottom="true"
    27         android:background="@drawable/bottom_bar">
    28          <Button
    29             android:id="@+id/id_send_msg"
    30             android:layout_width="60dp" 
    31             android:layout_height="40dp"
    32             android:layout_centerInParent="true"
    33             android:layout_alignParentRight="true"
    34             android:background="@drawable/send_btn_bg"
    35             android:text="发送"
    36            
    37             />
    38         <EditText 
    39             android:id="@+id/id_input_msg"
    40             android:layout_width="fill_parent"
    41             android:layout_height="40dp"
    42             android:background="@drawable/login_edit_normal"
    43             android:layout_marginLeft="10dp"
    44             android:layout_marginRight="10dp"
    45             android:layout_centerVertical="true"
    46             android:textSize="18sp"
    47             android:layout_toLeftOf="@id/id_send_msg"/>      "
    48     </RelativeLayout>
    49     <ListView
    50         android:id="@+id/id_listview_msgs"
    51         android:layout_width="fill_parent"
    52         android:layout_height="fill_parent"
    53         android:layout_above="@+id/id_ly_bottom"
    54         android:layout_below="@+id/id_ly_top"
    55         android:divider="@null"
    56         android:dividerHeight="5dp">
    57     </ListView>
    58 </RelativeLayout>
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:orientation="vertical" >
     6     
     7     <TextView
     8         android:id="@+id/id_from_msg_date"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:layout_gravity="center"
    12         android:background="#bebebe"
    13         android:textColor="#f5f5f5" 
    14         android:textSize="12sp"
    15         android:text="2012-12-12 12:12:12"  />
    16     <LinearLayout 
    17         android:layout_width="wrap_content"
    18         android:layout_height="wrap_content"
    19         android:orientation="horizontal"
    20         >
    21         <LinearLayout 
    22         android:layout_width="fill_parent"
    23         android:layout_height="wrap_content"
    24         android:orientation="vertical">
    25         <ImageView 
    26             android:layout_width="49dp"
    27             android:layout_height="49dp"
    28             android:src="@drawable/icon"/>
    29         <TextView
    30             android:layout_width="wrap_content"
    31             android:layout_height="wrap_content"
    32             android:textSize="18sp"
    33             android:layout_gravity="center"
    34             android:text="小慕"
    35             />"
    36             
    37         </LinearLayout>
    38         <TextView 
    39             android:id="@+id/id_from_msg_info"
    40             android:layout_width="wrap_content"
    41             android:layout_height="wrap_content"
    42             android:text="你好!"
    43             android:textSize="16sp"
    44             android:gravity="center_vertical"
    45             android:background="@drawable/chatfrom_bg_normal"/><!-- 垂直居中 -->"
    46         
    47     </LinearLayout>"
    48    
    49 
    50 </LinearLayout>
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:gravity="right"
     6     android:orientation="vertical" >
     7     
     8     <TextView
     9         android:id="@+id/id_to_msg_date"
    10         android:layout_width="wrap_content"
    11         android:layout_height="wrap_content"
    12         android:layout_gravity="center"
    13         android:background="#bebebe"
    14         android:textColor="#f5f5f5" 
    15         android:textSize="12sp"
    16         android:text="2012-12-12 12:12:12"  />
    17     <LinearLayout 
    18         android:layout_width="wrap_content"
    19         android:layout_height="wrap_content"
    20         android:orientation="horizontal"
    21         >
    22         <TextView 
    23             android:id="@+id/id_to_msg_info"
    24             android:layout_width="wrap_content"
    25             android:layout_height="wrap_content"
    26             android:text="你好!"
    27             android:textSize="16sp"
    28             android:gravity="center_vertical"
    29             android:background="@drawable/chatto_bg_normal"/><!-- 垂直居中 -->
    30         <LinearLayout 
    31         android:layout_width="fill_parent"
    32         android:layout_height="wrap_content"
    33         android:orientation="vertical">
    34         <ImageView 
    35             android:layout_width="49dp"
    36             android:layout_height="49dp"
    37             android:src="@drawable/me"/>
    38         <TextView
    39             android:layout_width="wrap_content"
    40             android:layout_height="wrap_content"
    41             android:textSize="18sp"
    42             android:layout_gravity="center"
    43             android:text="Saraad"
    44             />"
    45             
    46         </LinearLayout>
    47         
    48         
    49     </LinearLayout>
    50    
    51 
    52 </LinearLayout>

          为了更好的实现发送按钮的效果,需要在res下建立drawable文件夹,建立send_btn_bg.xml文件。代码如下:

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3     <item android:state_pressed="true"
    4         android:drawable="@drawable/send_btn_pressed"></item>
    5     <item android:drawable="@drawable/send_btn_normal"></item>"
    6 </selector>
          4.添加数据
            建立com.example.bean包,建立ChatMessage.java,Result.java文件,代码如下:
     1 package com.example.bean;
     2 
     3 import java.util.Date;
     4 
     5 public class ChatMessage {
     6     private String name;
     7     private String msg;
     8     private Type type;
     9     private Date date;
    10     public  ChatMessage() {
    11         
    12     }
    13     
    14     
    15     public ChatMessage(String msg, Type type, Date date) {
    16         super();
    17         this.msg = msg;
    18         this.type = type;
    19         this.date = date;
    20     }
    21 
    22 
    23     public enum Type{
    24         INCOMING,OUTCOMING
    25     }
    26 
    27     public String getName() {
    28         return name;
    29     }
    30 
    31     public void setName(String name) {
    32         this.name = name;
    33     }
    34 
    35     public String getMsg() {
    36         return msg;
    37     }
    38 
    39     public void setMsg(String msg) {
    40         this.msg = msg;
    41     }
    42 
    43     public Type getType() {
    44         return type;
    45     }
    46 
    47     public void setType(Type type) {
    48         this.type = type;
    49     }
    50 
    51     public Date getDate() {
    52         return date;
    53     }
    54 
    55     public void setDate(Date date) {
    56         this.date = date;
    57     }
    58 }
     1 package com.example.bean;
     2 
     3 public class Result {
     4     private int code;
     5     private String text;
     6     public int getCode() {
     7         return code;
     8     }
     9     public void setCode(int code) {
    10         this.code = code;
    11     }
    12     public String getText() {
    13         return text;
    14     }
    15     public void setText(String text) {
    16         this.text = text;
    17     }
    18 }

          5.实现对话

             在原有的包下建立ChatMessageAdapter.java文件,MainActivity.java是原有的。代码如下: 

     1 package com.example.imook_mook;
     2 
     3 import java.text.SimpleDateFormat;
     4 import java.util.List;
     5 
     6 import com.example.bean.ChatMessage;
     7 import com.example.bean.ChatMessage.Type;
     8 
     9 import android.content.Context;
    10 import android.view.LayoutInflater;
    11 import android.view.View;
    12 import android.view.ViewGroup;
    13 import android.widget.BaseAdapter;
    14 import android.widget.TextView;
    15 
    16 public class ChatMessageAdapter extends BaseAdapter {
    17     private LayoutInflater myInflater; 
    18     private List<ChatMessage> mDatas;
    19     
    20     public ChatMessageAdapter(Context context,List<ChatMessage> mDatas){
    21         myInflater=LayoutInflater.from(context);
    22         this.mDatas=mDatas;
    23         }
    24 
    25     @Override
    26     public int getCount() {
    27         // TODO 自动生成的方法存根
    28         return mDatas.size();
    29     }
    30 
    31     @Override
    32     public Object getItem(int position) {
    33         // TODO 自动生成的方法存根
    34         return mDatas.get(position);
    35     }
    36 
    37     @Override
    38     public long getItemId(int position) {
    39         // TODO 自动生成的方法存根
    40         return position;
    41     }
    42 
    43     @Override
    44     public int getItemViewType(int position) {
    45         // TODO 自动生成的方法存根
    46         ChatMessage chatMessage=mDatas.get(position);
    47         if(chatMessage.getType()==Type.INCOMING){
    48             return 0;
    49         }
    50         return 1;
    51     }//接受消息为0,发送消息为1;
    52 
    53     @Override
    54     public int getViewTypeCount() {
    55         // TODO 自动生成的方法存根
    56         return 2;
    57     }
    58 
    59     @Override
    60     public View getView(int position, View convertView, ViewGroup parent) {
    61         // TODO 自动生成的方法存根
    62         ChatMessage chatMessage=mDatas.get(position);
    63         ViewHolder viewHolder=null;
    64         if(convertView==null){
    65             //通过ItemType设置不同的布局
    66             if(getItemViewType(position)==0)
    67             {
    68             convertView=myInflater.inflate(R.layout.item_from_msg,
    69                     parent,false);
    70              viewHolder=new ViewHolder();
    71              viewHolder.mDate=(TextView) convertView
    72                      .findViewById(R.id.id_from_msg_date);
    73              viewHolder.mMsgs=(TextView) convertView
    74                      .findViewById(R.id.id_from_msg_info);    
    75         }else{
    76             convertView=myInflater.inflate(R.layout.item_to_msg,parent,
    77                     false);
    78              viewHolder=new ViewHolder();
    79              viewHolder.mDate=(TextView) convertView
    80                      .findViewById(R.id.id_to_msg_date);
    81              viewHolder.mMsgs=(TextView) convertView
    82                      .findViewById(R.id.id_to_msg_info);
    83         }
    84         convertView.setTag(viewHolder);
    85     }else{
    86         viewHolder=(ViewHolder) convertView.getTag();
    87     }
    88     //设置数据
    89     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    90     viewHolder.mDate.setText(df.format(chatMessage.getDate()));
    91     viewHolder.mMsgs.setText(chatMessage.getMsg());
    92     return convertView;
    93     }
    94     private final class ViewHolder{
    95         TextView mDate;
    96         TextView mMsgs;
    97     }//提升效率
    98 
    99 }
      1 package com.example.imook_mook;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Date;
      5 import java.util.List;
      6 
      7 import com.example.bean.ChatMessage;
      8 import com.example.bean.ChatMessage.Type;
      9 import com.example.util.HttpUtils;
     10 
     11 import android.os.Bundle;
     12 import android.os.Handler;
     13 import android.os.Message;
     14 import android.app.Activity;
     15 import android.text.TextUtils;
     16 import android.view.Menu;
     17 import android.view.View;
     18 import android.view.View.OnClickListener;
     19 import android.view.Window;
     20 import android.widget.Button;
     21 import android.widget.EditText;
     22 import android.widget.ListView;
     23 import android.widget.Toast;
     24 
     25 public class MainActivity extends Activity {
     26     private ListView mMsgs;
     27     private ChatMessageAdapter mAdapter;
     28     private List<ChatMessage> mDatas;//数据源
     29     
     30     private EditText mInputMsg;
     31     private Button mSendMsg;
     32     
     33     private Handler mHandler=new Handler()
     34     {
     35         public void handleMessage(android.os.Message msg){
     36             //等待接受子线程数据的返回
     37             ChatMessage fromMessage=(ChatMessage) msg.obj;
     38             mDatas.add(fromMessage);
     39             mAdapter.notifyDataSetChanged();
     40         }
     41     };
     42     @Override
     43     protected void onCreate(Bundle savedInstanceState) {
     44         super.onCreate(savedInstanceState);
     45         requestWindowFeature(Window.FEATURE_NO_TITLE);
     46         setContentView(R.layout.activity_main);
     47         
     48         initView();
     49         initDatas();
     50         //初始化事假
     51         initListener();
     52     }
     53     private void initListener() {
     54         // TODO 自动生成的方法存根
     55         mSendMsg.setOnClickListener(new OnClickListener(){
     56 
     57             @Override
     58             public void onClick(View v) {
     59                 // TODO 自动生成的方法存根
     60                 final String toMsg =mInputMsg.getText().toString();
     61                 if(TextUtils.isEmpty(toMsg))
     62                 {
     63                     Toast.makeText(MainActivity.this,"发送消息不能为空",Toast.LENGTH_SHORT).show();
     64                     return ;
     65                 }
     66                 
     67                 ChatMessage toMessage=new ChatMessage();
     68                 toMessage.setDate(new Date());
     69                 toMessage.setMsg(toMsg);
     70                 toMessage.setType(Type.OUTCOMING);
     71                 mDatas.add(toMessage);
     72                 mAdapter.notifyDataSetChanged();//通知更新
     73                 
     74                 mInputMsg.setText("");
     75                 new Thread(){
     76                     public void run(){
     77                         ChatMessage fromMessage=HttpUtils.sendMessage(toMsg);
     78                         Message m=Message.obtain();
     79                         m.obj=fromMessage;
     80                         mHandler.sendMessage(m);
     81                     }
     82                 }.start();
     83                 
     84             }
     85             
     86         });
     87     }
     88     private void initDatas() {
     89         // TODO 自动生成的方法存根
     90         mDatas=new ArrayList<ChatMessage>();
     91         mDatas.add(new ChatMessage("你好,小慕为您服务",Type.INCOMING,new Date()));
     92         //mDatas.add(new ChatMessage("你好",Type.OUTCOMING,new Date()));
     93         mAdapter=new ChatMessageAdapter(this,mDatas);
     94         mMsgs.setAdapter(mAdapter);
     95     }
     96     
     97     private void initView() {
     98         // TODO 自动生成的方法存根
     99         mMsgs=(ListView) findViewById(R.id.id_listview_msgs);
    100         mInputMsg=(EditText) findViewById(R.id.id_input_msg);
    101         mSendMsg= (Button) findViewById(R.id.id_send_msg);
    102         
    103     }
    104 
    105 
    106 }

          最后在AndroidManifest.xml文件中添加权限:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.imook_mook"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6     <uses-permission android:name="android.permission.INTERNET"/>"
     7     <uses-sdk
     8         android:minSdkVersion="8"
     9         android:targetSdkVersion="18" />
    10 
    11     <application
    12         android:allowBackup="true"
    13         android:icon="@drawable/ic_launcher"
    14         android:label="@string/app_name"
    15         android:theme="@style/AppTheme" >
    16         <uses-library android:name="android.test.runner"/>
    17         <activity
    18             android:name="com.example.imook_mook.MainActivity"
    19             android:label="@string/app_name" >
    20             <intent-filter>
    21                 <action android:name="android.intent.action.MAIN" />
    22 
    23                 <category android:name="android.intent.category.LAUNCHER" />
    24             </intent-filter>
    25         </activity>
    26     </application>
    27     <instrumentation android:targetPackage="com.example.imook_mook"
    28         android:label="this is a test"
    29         android:name="android.test.InstrumentationTestRunner">        
    30     </instrumentation>
    31 </manifest>

         四、总结

            项目截图:

                                           

          抛出异常快捷键shift+alt+z。

          引用图灵机器人的API官网  http://www.tuling123.com/。

     2016-03-1720:57:38
    本性的苏醒,往往在遭遇真实之后。
  • 相关阅读:
    设计模式之实现状态模式
    一定要记住的OO设计原则:
    设计模式之实现命令模式
    设计模式之实现迭代器模式
    设计模式之实现观察者模式
    设计模式之实现策略模式
    设计模式之实现组合模式
    设计模式之实现几种工厂模式
    设计模式之实现装饰者模式
    pygame学习笔记(3)——时间、事件、文字
  • 原文地址:https://www.cnblogs.com/chance88/p/5289274.html
Copyright © 2011-2022 走看看