昨天突然想在Android下调用图灵机器人API实现聊天的功能。说干就干,虽然过程中遇见一些问题,但最后解决了的心情真好。
API接口是(key值可以在图灵机器人网站里注册得到)
www.tuling123.com/openapi/api?key=1702c05fc1b94e2bb4de7fb2e61b21a3&info=hello
最后hello是讲的话,访问这个网站会访问一个JSON格式的内容。
text关键字就是访问的内容,只要把这个关键字的内容截取下列就行了。
下面开始写代码。
首先布个局,丑丑的别介意。
一个TextView在上面,用来显示内容,一个EditView在下面用来输入内容,然后一个按钮实现点击事件。
18 9 16 17 23 24 31 32 38 39 40
关键是点击事件的实现:
当按钮被点击时,就获取EditView上的内容。然后用InputUtils.getString(question)封装一个方法,传一个输入的内容用来返回网页关键字"text"里的内容。
这个地方需要注意下,在调试的时候,到int code = connection.getResponseCode();这一步就不运行了,获取不了状态码,百度了下。
需要在onCreate里加上:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build());
1 package cn.starry.gangchat.utils; 2 3 import java.io.InputStream; 4 import java.net.HttpURLConnection; 5 import java.net.URL; 6 import java.net.URLEncoder; 7 8 import org.json.JSONObject; 9 10 public class InputUtils {11 private static String APIKEY = "1702c05fc1b94e2bb4de7fb2e61b21a3";12 13 public static String getString(String question) {14 String out = null;15 try {16 String info = URLEncoder.encode(question, "utf-8");17 System.out.println(info);18 URL url = new URL("http://www.tuling123.com/openapi/api?key="19 + APIKEY + "&info=" + info);20 System.out.println(url);21 HttpURLConnection connection = (HttpURLConnection) url22 .openConnection();23 connection.setConnectTimeout(10 * 1000);24 connection.setRequestMethod("GET");25 int code = connection.getResponseCode();26 if (code == 200) {27 InputStream inputStream = connection.getInputStream();28 String resutl = StreamUtils.streamToString(inputStream);29 JSONObject object = new JSONObject(resutl);30 out = object.getString("text");31 }32 } catch (Exception e) {33 e.printStackTrace();34 }35 return out;36 37 }38 }
在InputUtils.java里用到了:
StreamUtils.streamToString(inputStream)
这个是我定义。是在一个输入流里获取内容,用utf-8编码返回。
1 package cn.starry.gangchat.utils; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 7 public class StreamUtils { 8 public static String streamToString(InputStream in) { 9 String result = "";10 try {11 // 创建一个字节数组写入流12 ByteArrayOutputStream out = new ByteArrayOutputStream();13 byte[] buffer = new byte[1024];14 int length = 0;15 while ((length = in.read(buffer)) != -1) {16 out.write(buffer, 0, length);17 out.flush();18 }19 result = new String(out.toByteArray(), "utf-8");20 out.close();21 } catch (IOException e) {22 e.printStackTrace();23 }24 return result;25 }26 }
最后还实现了一个点击按钮就让软键盘隐藏的功能。
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); if(imm.isActive()&&getCurrentFocus()!=null){ if (getCurrentFocus().getWindowToken()!=null) { imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } }
1 package cn.starry.gangchat; 2 3 import java.util.Random; 4 5 import cn.starry.gangchat.utils.InputUtils; 6 7 import android.os.Bundle; 8 import android.os.StrictMode; 9 import android.view.View;10 import android.view.inputmethod.InputMethodManager;11 import android.widget.EditText;12 import android.widget.LinearLayout;13 import android.widget.RelativeLayout;14 import android.widget.TextView;15 import android.widget.Toast;16 import android.annotation.SuppressLint;17 import android.app.Activity;18 import android.content.Context;19 20 public class MainActivity extends Activity {21 22 private EditText et_input;23 private TextView tv_out;24 private RelativeLayout rl;25 26 @SuppressLint("NewApi")27 @Override28 protected void onCreate(Bundle savedInstanceState) {29 super.onCreate(savedInstanceState);30 setContentView(R.layout.activity_main);31 int[] arr = { 0x7f020001, 0x7f020002, 0x7f020003, 0x7f020004,32 0x7f020005 };33 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()34 .detectDiskReads().detectDiskWrites().detectNetwork()35 .penaltyLog().build());36 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()37 .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()38 .penaltyLog().penaltyDeath().build());39 Random random = new Random();40 int ran = random.nextInt(5);41 et_input = (EditText) findViewById(R.id.et_input);42 tv_out = (TextView) findViewById(R.id.tv_out);43 rl = (RelativeLayout) findViewById(R.id.rl);44 rl.setBackgroundResource(arr[ran]);45 }46 47 public void click(View v) {48 String question = et_input.getText().toString().trim();49 if (question == null || "".equals(question)) {50 Toast.makeText(getApplicationContext(), "请输入内容哦!",51 Toast.LENGTH_SHORT).show();52 return;53 }54 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 55 if(imm.isActive()&&getCurrentFocus()!=null){56 if (getCurrentFocus().getWindowToken()!=null) {57 imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);58 } 59 }60 String result = InputUtils.getString(question);61 tv_out.setText(result);62 et_input.setText("");63 }64 65 }
安装包下载地址:
GitHub上有完整项目,可以直接导入在Eclipse里: