本人是大四在校生,寫這篇文章的目的就是主要記錄下我在使用鵝場的文智API以及阿里雲開放的智能機器人api所作的一個小demophp
(主界面_one)html
(主界面_two)java
在這個主界面中,主要是RecyclerView,兩個頭像用的ImageView,一個EditText,一個由TextView設計的發送按鈕,模擬微信的消息發送(這裏沒有對消息種類進行判斷,因此只是簡單的發送一條數據,得到一條數據,尚未行聊天工具那樣能夠發送多條數據,由於每個信息請求都會有一條信息返回就沒有作信息的左右判斷 )android
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.luobotie.kingshun.mychat.MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_chat"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!--蒙層,用於edittext的聚焦以及失焦-->
<View
android:id="@+id/maskForETFocus"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:onClick="clickToClearFocus" />
</FrameLayout>
<!--這裏是消息發送-->
<LinearLayout
android:elevation="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="horizontal"
android:padding="5dp">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/iv_send"
android:layout_weight="0.5"
android:src="@android:drawable/ic_menu_send" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="5"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:padding="3dp">
<EditText
android:id="@+id/et_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:hint="從這裏寫入您的話"
android:maxLines="3"
android:padding="5dp"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:textCursorDrawable="@drawable/color_cursor"
android:textSize="16sp" />
<View
android:layout_marginTop="3dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/colorGray" />
</LinearLayout>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:background="@drawable/btn_selector"
android:gravity="center_horizontal|clip_horizontal"
android:onClick="sendMsg"
android:padding="8dp"
android:text="發送"
android:textColor="#fff"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>複製代碼
這裏有一個framlayout裏面放了兩個組件,一個是recyclerview,另外一個是一個透明的蒙層@android:color/transparent 這個是用來給edittext失去焦點用來隱藏鍵盤用的,這個能夠用於經過控制組件的可見性來設置它是否存在,給edittext設置一個監聽器用來判斷聚焦狀態的改變git
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
Log.d(TAG, "onFocusChange: 已聚焦");
mMask.setVisibility(View.VISIBLE);
} else {
Log.d(TAG, "onFocusChange: 取消聚焦");
//鍵盤的強制隱藏
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mContent.getWindowToken(), IMM_HIDE_FLAGS);
//將mask取消存在
mMask.setVisibility(View.GONE);
}
}複製代碼
聚焦的時候,能夠給輸入框寫字,而且給蒙層設置可見(蒙層的做用就是控制輸入框聚焦),github
鍵盤的強制隱藏在代碼中已經貼出。在manifest中也要作出對軟鍵盤的控制算法
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateUnspecified|adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>複製代碼
android:windowSoftInputMode="stateUnspecified|adjustResize"這句話是有必要的 具體詳見複製代碼
這裏是網址:blog.csdn.net/xww810319/a…api
定義一個接口bash
public interface GetChatRequest {
@GET("/iqa/query?")
Call<chatBean> getChat(@Query("question") String question, @Header("Authorization") String appcode);
}
複製代碼
定義一個JavaBean(用GsonFormat插件)服務器
public class chatBean {
/**
* status : 0
* msg : ok
* result : {"type":"標準回覆","content":"杭州今天10℃~21℃ 晴 北風3-4 級轉東北風微風\r\n建議着薄外套、開衫牛仔衫褲等服裝。年老體弱者應適當添加衣物,宜着夾克衫、薄毛衣等。","relquestion":"查詢天氣[那麼?][天氣地區名|省名|城市別稱][天氣地區名?]"}
*/
private String status;
private String msg;
private ResultBean result;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public ResultBean getResult() {
return result;
}
public void setResult(ResultBean result) {
this.result = result;
}
public static class ResultBean {
/**
* type : 標準回覆
* content : 杭州今天10℃~21℃ 晴 北風3-4 級轉東北風微風
建議着薄外套、開衫牛仔衫褲等服裝。年老體弱者應適當添加衣物,宜着夾克衫、薄毛衣等。
* relquestion : 查詢天氣[那麼?][天氣地區名|省名|城市別稱][天氣地區名?]
*/
private String type;
private String content;
private String relquestion;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getRelquestion() {
return relquestion;
}
public void setRelquestion(String relquestion) {
this.relquestion = relquestion;
}
}
}複製代碼
這裏主要是利用getContent()方法獲取的信息接下來就是請求
很簡單的Retrofit的使用 ,這裏使用的GsonConverterFactory
是用來返回Gson數據的, String returnStr = response.body().getResult().getContent();就是返回的結果,可是是須要參數的
地址:market.aliyun.com/products/57…這裏是免費的人工機器人啊!!!
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
GetChatRequest request = retrofit.create(GetChatRequest.class);
Call<chatBean> call = request.getChat(question, APPCODE);
call.enqueue(new Callback<chatBean>() {
@Override
public void onResponse(Call<chatBean> call, Response<chatBean> response) {
String returnStr = response.body().getResult().getContent();
//與Adapter交換數據
swapDatas(returnStr);
}
@Override
public void onFailure(Call<chatBean> call, Throwable t) {
Toast.makeText(MainActivity.this, "機器人崩潰", Toast.LENGTH_SHORT).show();
}
});複製代碼
請求的數據就在adapter中簡單的經過對2取餘數來判斷是顯示在左側仍是右側
固然爲了數據的正常顯示不移位(由於recycleview的複用)在onBindView中:必須對組件設置可見性 對每個須要的組件(父組件就行)設置 固然還有設置Tag的方法!!!!!敲黑板!!!!
public void onBindViewHolder(MyViewHolder holder, int position) {
Log.d(TAG, "onBindViewHolder: " + position);
if (position % 2 == 1) {
//左邊消息
holder.mLeftContainer.setVisibility(View.VISIBLE);
holder.mRightContainer.setVisibility(View.GONE);
holder.mLeftMsg.setText(mDatas.get(position));
} else {
holder.mRightContainer.setVisibility(View.VISIBLE);
holder.mLeftContainer.setVisibility(View.GONE);
holder.mRightMsg.setText(mDatas.get(position));
}
}複製代碼
到此 咱們的機器人對話就完成了!!!
先上圖
沒錯就是item的點擊事件!!!!經過點擊來彈出提示框 點擊肯定後經過騰訊雲的文智API來獲取數據並顯示在一個新的Activity中那麼文智的連接在這裏:nlp.qq.com/
域名:wenzhi.api.qcloud.com
接口名: TextSentiment
在輿情監控、話題監督、口碑分析等商業分析領域有很是重要的應用價值。(引用騰訊雲)
下面是實例:
https://wenzhi.api.qcloud.com/v2/index.php?
Action=TextSentiment
&Nonce=345122
&Region=sz
&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
&Timestamp=1408704141
&Signature=HgIYOPcx5lN6gz8JsCFBNAWp2oQ
&content=雙萬兆服務器就是好,只是內存小點複製代碼
這裏有一個很大的坑就是HmacSHA256的加密算法如何去作請看官方文檔
這裏騰訊給廣大開發者一個通用的jar包具體請見SDK文檔用這裏的jar包徹底能夠輕鬆一件介入
到此微小Demo作完了給大佬們放上Github傳送門!!!忘大佬們輕虐!!!!