- 在app下加入
// api project(':meiqiasdk')
// -------------------- 以下三個庫是必須依賴的 ----------------------------
implementation 'com.meiqia:meiqiasdk:+'
implementation 'com.android.support:support-v4:29.0.0'
implementation 'com.squareup.okhttp3:okhttp:3.5.0'
// -------------------- 以上三個庫是必須依賴的 ----------------------------
// 目前支持常見的 4 種圖片加載庫,必須在下面四個圖片加載庫中選擇一個添加依賴
// implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
// implementation 'com.squareup.picasso:picasso:2.5.2'
// implementation 'org.xutils:xutils:3.3.36'
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
// implementation 'com.github.bumptech.glide:glide:3.7.0'
可以看下我的配置
mainActivity佈局代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="@style/MQMatchMatch.Vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:gravity="center_horizontal"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
style="@style/MQWrapWrap"
android:layout_centerInParent="true"
android:layout_margin="16dp"
android:src="@drawable/ic_logo" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:gravity="center_horizontal"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AppTheme"
android:layout_marginBottom="8dp"
android:onClick="conversation"
android:text="諮詢客服" />
<!-- <Button-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- style="@style/AppTheme"-->
<!-- android:layout_marginBottom="8dp"-->
<!-- android:onClick="developer"-->
<!-- android:text="開發者功能" />-->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AppTheme"
android:layout_marginBottom="8dp"
android:onClick="customizedConversation"
android:text="自定義 Conversation" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/AppTheme"
android:onClick="leaveMessageForm"
android:text="留言表單" />
</LinearLayout>
</LinearLayout>
MainActivity代碼
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import com.meiqia.meiqiasdk.activity.MQMessageFormActivity;
import com.meiqia.meiqiasdk.util.MQIntentBuilder;
import com.meiqia.meiqiasdk.util.MQUtils;
public class MainActivity extends AppCompatActivity {
private static final int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 諮詢客服
*
* @param v
*/
public void conversation(View v) {
// 不兼容Android6.0動態權限
// conversation();
// 兼容Android6.0動態權限
conversationWrapper();
}
/**
* 開發者功能
*
* @param v
*/
public void developer(View v) {
startActivity(new Intent(MainActivity.this, ApiSampleActivity.class));
}
/**
* 自定義 Activity
*
* @param view
*/
public void customizedConversation(View view) {
Intent intent = new MQIntentBuilder(this, CustomizedMQConversationActivity.class).build();
startActivity(intent);
}
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case WRITE_EXTERNAL_STORAGE_REQUEST_CODE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
conversationWrapper();
} else {
MQUtils.show(this, com.meiqia.meiqiasdk.R.string.mq_sdcard_no_permission);
}
break;
}
}
}
private void conversationWrapper() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
} else {
conversation();
}
}
private void conversation() {
Intent intent = new MQIntentBuilder(this).build();
startActivity(intent);
}
public void leaveMessageForm(View view) {
startActivity(new Intent(this, MQMessageFormActivity.class));
}
}
初始化Application
package com.example.myapplication;
import android.app.Application;
import android.content.Intent;
import android.widget.Toast;
import com.meiqia.core.MQManager;
import com.meiqia.core.callback.OnInitCallback;
import com.meiqia.meiqiasdk.util.MQConfig;
/**
* name : 張鵬宇
* Telephone :15699990074
* City :Beijing
* autograph :The original people give you the calm love 💎Accompany you to see the long and thin scenery
* Date : 2020/4/17
*/
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
initMeiqiaSDK();
MQManager.setDebugMode(true);
}
private void initMeiqiaSDK() {
//初始化Activity
MQManager.setDebugMode(true);
// b70c8d1819c7e61686fde9f5c7a305d0
String meiqiaKey = "b70c8d1819c7e61686fde9f5c7a305d0";
MQConfig.init(this, meiqiaKey, new OnInitCallback() {
@Override
public void onSuccess(String s) {
//成功的方法
Toast.makeText(App.this, "成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int code, String message) {
//失敗的方法
Toast.makeText(App.this, "失敗 = " + message, Toast.LENGTH_SHORT).show();
}
});
customMeiqiaSDK();
}
private void customMeiqiaSDK() {
// 配置自定義信息
MQConfig.ui.titleGravity = MQConfig.ui.MQTitleGravity.LEFT;
MQConfig.ui.backArrowIconResId = R.drawable.ic_arrow_back_white_24dp;
// MQConfig.ui.titleBackgroundResId = R.color.test_red;
// MQConfig.ui.titleTextColorResId = R.color.test_blue;
// MQConfig.ui.leftChatBubbleColorResId = R.color.test_green;
// MQConfig.ui.leftChatTextColorResId = R.color.test_red;
// MQConfig.ui.rightChatBubbleColorResId = R.color.test_red;
// MQConfig.ui.rightChatTextColorResId = R.color.test_green;
// MQConfig.ui.robotEvaluateTextColorResId = R.color.test_red;
// MQConfig.ui.robotMenuItemTextColorResId = R.color.test_blue;
// MQConfig.ui.robotMenuTipTextColorResId = R.color.test_blue;
}
}
集成自 MQConversationActivity
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.meiqia.meiqiasdk.activity.MQConversationActivity;
/**
* 集成自 MQConversationActivity,可以動態改變其中的一些方法實現
*/
public class CustomizedMQConversationActivity extends MQConversationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 這裏可以動態添加一些 View 到佈局中
// eg: 右邊添加一個按鈕
RelativeLayout titleRL = (RelativeLayout) findViewById(R.id.title_rl);
Button rightBtn = new Button(this);
rightBtn.setText("RightBtn");
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
titleRL.addView(rightBtn, params);
// do something
rightBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(CustomizedMQConversationActivity.this, "RightBtn OnClick", Toast.LENGTH_SHORT).show();
}
});
}
}
ApiSampleActivity
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.meiqia.core.MQManager;
import com.meiqia.core.MQScheduleRule;
import com.meiqia.core.bean.MQMessage;
import com.meiqia.core.callback.OnEndConversationCallback;
import com.meiqia.core.callback.OnGetMQClientIdCallBackOn;
import com.meiqia.core.callback.OnGetMessageListCallback;
import com.meiqia.meiqiasdk.controller.ControllerImpl;
import com.meiqia.meiqiasdk.util.MQConfig;
import com.meiqia.meiqiasdk.util.MQIntentBuilder;
import com.meiqia.meiqiasdk.util.MQUtils;
import java.util.HashMap;
import java.util.List;
public class ApiSampleActivity extends Activity implements View.OnClickListener {
private TextView currentIdTv;
private View setCurrentIdOnlineBtn;
private View setInputIdOnlineBtn;
private View setCustomizedIdOnlineBtn;
private View getNewIdBtn;
private View setAgentTokenOnlineBtn;
private View setGroupTokenOnlineBtn;
private View setClientInfoBtn;
private View getUnreadMessageBtn;
private View offlineClientBtn;
private View endConversationBtn;
private MQManager mqManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_developer);
mqManager = MQManager.getInstance(this);
findViews();
setListeners();
updateId();
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
// 使用當前顧客上線
case R.id.set_current_client_id_online_btn:
MQConfig.registerController(new ControllerImpl(this));
Intent intent = new MQIntentBuilder(this).build();
startActivity(intent);
break;
// 使用指定 美洽顧客id 上線
case R.id.set_meiqia_client_id_online_btn:
showDialog("輸入美洽 ID", new EditDialogOnClickListener() {
@Override
public void onInput(String clientId) {
if (!TextUtils.isEmpty(clientId)) {
Intent intent = new MQIntentBuilder(ApiSampleActivity.this)
.setClientId(clientId)
.build();
startActivity(intent);
updateId();
}
}
});
break;
// 使用 開發者用戶id 上線
case R.id.set_customised_id_online_btn:
showDialog("209113", new EditDialogOnClickListener() {
@Override
public void onInput(String customizedId) {
if (!TextUtils.isEmpty(customizedId)) {
Intent intent = new MQIntentBuilder(ApiSampleActivity.this)
.setCustomizedId(customizedId)
.build();
startActivity(intent);
updateId();
}
}
});
break;
// 獲取一個新的美洽 ID
case R.id.get_new_meiqia_id_btn:
MQManager.getInstance(this).createMQClient(new OnGetMQClientIdCallBackOn() {
@Override
public void onSuccess(String mqClientId) {
toast("成功複製到剪貼板 :\n" + mqClientId);
if (!TextUtils.isEmpty(mqClientId)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
android.content.ClipboardManager mClipboard = (android.content.ClipboardManager) ApiSampleActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);
mClipboard.setPrimaryClip(ClipData.newPlainText("mq_content", mqClientId));
} else {
ClipboardManager mClipboard = (ClipboardManager) ApiSampleActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);
mClipboard.setText(mqClientId);
}
}
}
@Override
public void onFailure(int code, String message) {
toast(message);
}
});
break;
// 指定客服分配上線
case R.id.set_specified_agent_token_btn:
showDialog("c91e19c0c04b09aa1e2d4afd821e4af5", new EditDialogOnClickListener() {
@Override
public void onInput(String agentId) {
if (!TextUtils.isEmpty(agentId)) {
Intent intent = new MQIntentBuilder(ApiSampleActivity.this)
.setScheduledAgent(agentId)
.setScheduleRule(MQScheduleRule.REDIRECT_ENTERPRISE)
.build();
startActivity(intent);
updateId();
}
}
});
break;
// 指定客服分組分配上線
case R.id.set_specified_agent_group_token_btn:
showDialog("15c56fbe79d807127c6a923082ef2b9e", new EditDialogOnClickListener() {
@Override
public void onInput(String groupId) {
if (!TextUtils.isEmpty(groupId)) {
Intent intent = new MQIntentBuilder(ApiSampleActivity.this)
.setScheduledGroup(groupId)
.setScheduleRule(MQScheduleRule.REDIRECT_ENTERPRISE)
.build();
startActivity(intent);
}
}
});
break;
// 上傳自定義信息
case R.id.set_client_info:
MQConfig.isShowClientAvatar = true;
final HashMap<String, String> info = new HashMap<>();
info.put("name", "喬嘉寶");
info.put("avatar", " www.baidu.com");
info.put("gender", "男");
info.put("tel", "183");
info.put("技能1", "java");
info.put("技能2", "妹子");
info.put("技能3", "打麻將");
info.put("tags", "test1,test2,test3");
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setTitle("上傳自定義信息");
alertBuilder.setMessage("avatar -> https://s3.cn-north-1.amazonaws.com.cn/pics.meiqia.bucket/1dee88eabfbd7bd4\n" +
"name -> 喬嘉寶\n" +
"技能1 -> 休刊\n" +
"gender -> 男\n" +
"tel -> 183\n" +
"技能2 -> 外出取材\n" +
"技能3 -> 打麻將");
AlertDialog dialog = alertBuilder.create();
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new MQIntentBuilder(ApiSampleActivity.this)
.setClientInfo(info)
.build();
startActivity(intent);
}
});
dialog.show();
break;
case R.id.get_unread_message_btn:
AlertDialog.Builder unreadAlertBuilder = new AlertDialog.Builder(this);
unreadAlertBuilder.setTitle("注意");
unreadAlertBuilder.setMessage("退出界面後收到的消息,都將算作未讀消息");
AlertDialog unreadDialog = unreadAlertBuilder.create();
unreadDialog.setButton(DialogInterface.BUTTON_POSITIVE, "確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MQManager.getInstance(ApiSampleActivity.this).getUnreadMessages(new OnGetMessageListCallback() {
@Override
public void onSuccess(List<MQMessage> messageList) {
toast("unread message count = " + messageList.size());
}
@Override
public void onFailure(int code, String message) {
toast("get unread message failed");
}
});
}
});
unreadDialog.show();
break;
// 設置顧客離線
case R.id.set_client_offline_btn:
MQManager.getInstance(this).setClientOffline();
break;
// 結束當前對話
case R.id.end_conversation_btn:
MQManager.getInstance(this).endCurrentConversation(new OnEndConversationCallback() {
@Override
public void onSuccess() {
toast("endCurrentConversation success");
}
@Override
public void onFailure(int code, String message) {
toast("endCurrentConversation failed:\n" + message);
}
});
break;
}
}
private void updateId() {
currentIdTv.setText(mqManager.getCurrentClientId());
}
private void toast(String content) {
Toast.makeText(ApiSampleActivity.this, content, Toast.LENGTH_LONG).show();
}
private void setListeners() {
setCurrentIdOnlineBtn.setOnClickListener(this);
setInputIdOnlineBtn.setOnClickListener(this);
setCustomizedIdOnlineBtn.setOnClickListener(this);
getNewIdBtn.setOnClickListener(this);
setAgentTokenOnlineBtn.setOnClickListener(this);
setGroupTokenOnlineBtn.setOnClickListener(this);
setClientInfoBtn.setOnClickListener(this);
getUnreadMessageBtn.setOnClickListener(this);
offlineClientBtn.setOnClickListener(this);
endConversationBtn.setOnClickListener(this);
}
private void findViews() {
currentIdTv = (TextView) findViewById(R.id.current_id_tv);
setCurrentIdOnlineBtn = findViewById(R.id.set_current_client_id_online_btn);
setInputIdOnlineBtn = findViewById(R.id.set_meiqia_client_id_online_btn);
setCustomizedIdOnlineBtn = findViewById(R.id.set_customised_id_online_btn);
getNewIdBtn = findViewById(R.id.get_new_meiqia_id_btn);
setAgentTokenOnlineBtn = findViewById(R.id.set_specified_agent_token_btn);
setGroupTokenOnlineBtn = findViewById(R.id.set_specified_agent_group_token_btn);
setClientInfoBtn = findViewById(R.id.set_client_info);
getUnreadMessageBtn = findViewById(R.id.get_unread_message_btn);
offlineClientBtn = findViewById(R.id.set_client_offline_btn);
endConversationBtn = findViewById(R.id.end_conversation_btn);
}
private void showDialog(String title, final EditDialogOnClickListener editDialogOnClickListener) {
final Dialog inputDialog = new Dialog(this, R.style.MQDialog);
inputDialog.setCancelable(true);
inputDialog.setContentView(R.layout.dialog_input);
TextView titleTv = (TextView) inputDialog.findViewById(R.id.tv_input_title);
titleTv.setText(title);
final EditText valueEt = (EditText) inputDialog.findViewById(R.id.et_input_value);
inputDialog.findViewById(R.id.tv_input_confirm).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MQUtils.closeKeyboard(inputDialog);
inputDialog.dismiss();
editDialogOnClickListener.onInput(valueEt.getText().toString());
}
});
inputDialog.show();
MQUtils.openKeyboard(valueEt);
}
public interface EditDialogOnClickListener {
void onInput(String input);
}
}
Actity_developer.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/MQMatchMatch.Vertical">
<LinearLayout
style="@style/MQMatchWrap.Horizontal"
android:background="@color/mq_colorPrimary"
android:padding="8dp">
<TextView
style="@style/MQWrapWrap"
android:text="當前美洽ID: "
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/current_id_tv"
style="@style/MQMatchWrap"
android:textColor="@android:color/white"
android:textSize="14sp"
tools:text="ididididiididid" />
</LinearLayout>
<ScrollView style="@style/MQMatchMatch">
<LinearLayout
style="@style/MQMatchMatch.Vertical"
android:paddingBottom="16dp">
<Button
android:id="@+id/set_current_client_id_online_btn"
style="@style/AppTheme"
android:text="使用當前顧客 ID 上線" />
<Button
android:id="@+id/set_meiqia_client_id_online_btn"
style="@style/AppTheme"
android:text="輸入美洽顧客 ID 進行上線" />
<Button
android:id="@+id/set_customised_id_online_btn"
style="@style/AppTheme"
android:text="綁定用戶 ID 並上線" />
<Button
android:id="@+id/get_new_meiqia_id_btn"
style="@style/AppTheme"
android:text="獲取一個全新的美洽 ID" />
<Button
android:id="@+id/set_specified_agent_token_btn"
style="@style/AppTheme"
android:text="輸入一個客服 ID 進行指定分配" />
<Button
android:id="@+id/set_specified_agent_group_token_btn"
style="@style/AppTheme"
android:text="輸入一個客服組 ID 進行指定分配" />
<Button
android:id="@+id/set_client_info"
style="@style/AppTheme"
android:text="上傳自定義信息" />
<Button
android:id="@+id/get_unread_message_btn"
style="@style/AppTheme"
android:text="獲取未讀消息數目" />
<Button
android:id="@+id/set_client_offline_btn"
style="@style/AppTheme"
android:text="設置當前顧客爲離線狀態" />
<Button
android:id="@+id/end_conversation_btn"
style="@style/AppTheme"
android:text="結束當前對話" />
</LinearLayout>
</ScrollView>
</LinearLayout>
dlilog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
style="@style/MQMatchWrap.Vertical"
android:layout_marginLeft="@dimen/mq_size_level8"
android:layout_marginRight="@dimen/mq_size_level8"
android:background="@drawable/mq_shape_dialog_bg">
<TextView
android:id="@+id/tv_input_title"
style="@style/MQMatchWrap"
android:gravity="center"
android:padding="@dimen/mq_size_level4"
android:textColor="@android:color/black"
android:textSize="@dimen/mq_textSize_level2"
android:textStyle="bold"
tools:text="我是標題" />
<EditText
android:id="@+id/et_input_value"
style="@style/MQMatchWrap"
android:layout_marginBottom="@dimen/mq_size_level4"
android:layout_marginLeft="@dimen/mq_size_level4"
android:layout_marginRight="@dimen/mq_size_level4"
android:background="@drawable/mq_bg_edit_view"
android:padding="@dimen/mq_size_level2"
android:textColor="@android:color/black"
android:textSize="@dimen/mq_textSize_level2"
tools:text="skdfjksldjflsk" />
<View style="@style/MQHLine" />
<TextView
android:id="@+id/tv_input_confirm"
style="@style/MQClickableItem.Bottom"
android:gravity="center"
android:text="確定" />
</LinearLayout>
即可實現