1.首先你得找到一个依赖包,类似这样的
依赖
2.Application
public class App extends Application {
protected static SharedPreferences sp = null;
protected static Context CONTEXT = null;
private String spName = "HuanXinDemo";
@Override
public void onCreate() {
super.onCreate();
if (CONTEXT == null) {
CONTEXT = getApplicationContext();
}
if (sp == null) {
sp = CONTEXT.getSharedPreferences(spName, MODE_PRIVATE);
}
initIMsdk();
}
public static SharedPreferences getSp() {
return sp;
}
/**
* 注册IM
*/
private void initIMsdk() {
int pid = android.os.Process.myPid();
String processAppName = getAppName(pid);
// 如果APP启用了远程的service,此application:onCreate会被调用2次
// 为了防止环信SDK被初始化2次,加此判断会保证SDK被初始化1次
// 默认的APP会在以包名为默认的process name下运行,如果查到的process name不是APP的process name就立即返回
if (processAppName == null ||!processAppName.equalsIgnoreCase(this.getPackageName())) {
// 则此application::onCreate 是被service 调用的,直接返回
return;
}
//EaseUI.getInstance().init(this,null);
EMOptions options = new EMOptions();
// 默认添加好友时,是不需要验证的,改成需要验证
options.setAcceptInvitationAlways(false);
EaseUI.getInstance().init(this, options);
EMClient.getInstance().setDebugMode(true);
}
/**
* 获取appName
* @param pID
* @return
*/
private String getAppName(int pID) {
String processName = null;
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while (i.hasNext()) {
ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next());
try {
if (info.pid == pID) {
processName = info.processName;
return processName;
}
} catch (Exception e) {
// Log.d("Process", "Error>> :"+ e.toString());
}
}
return processName;
}
}
3.Util
public class EaseUtil {
/**
* 用户登录
*
* @param username
* @param password
*/
public static void login(final Activity fromActivity, final Class toClazz, String username, String password) {
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
Toast.makeText(fromActivity, "用户名或者密码为空!", Toast.LENGTH_SHORT).show();
} else {
EMClient.getInstance().login(username, password, new EMCallBack() {//回调
@Override
public void onSuccess() {
fromActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(fromActivity, "登录成功!", Toast.LENGTH_SHORT).show();
}
});
Intent intent = new Intent(fromActivity, toClazz);
fromActivity.startActivity(intent);
}
/**
*
* @param progress //登录进度
* @param status //登录状态
*/
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, final String message) {
fromActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(fromActivity, "登录失败," + message, Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
/**
* 用户注册
*
* @param userName
* @param pasword
*/
public static void registUser(final Activity fromActivity, final String userName, final String pasword) {
new Thread(new Runnable() {
@Override
public void run() {
try {
EMClient.getInstance().createAccount(userName, pasword);
SPUtils.put(userName, userName);
SPUtils.put(pasword, pasword);
} catch (final HyphenateException e) {
e.printStackTrace();
fromActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(fromActivity, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
}).start();
}
/**
* 退出登录
*/
public static void loginOut(final Activity activity) {
EMClient.getInstance().logout(true, new EMCallBack() {
@Override
public void onSuccess() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity, "您已退出登录!", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onProgress(int progress, String status) {
}
@Override
public void onError(int code, final String message) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity, "退出失败," + message, Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
4.MainXML
5.创建一个ChatActivity
public class ChatActivity extends AppCompatActivity {
private EditText etId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
initView();
}
//点击开始聊天
public void chat(View view) {
String userId = etId.getText().toString().trim();
if(userId!=null){
EaseChatFragment chatFragment = new EaseChatFragment();
Bundle args = new Bundle();
args.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE);
args.putString(EaseConstant.EXTRA_USER_ID, userId);
chatFragment.setArguments(args);
getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit();
}
}
private void initView() {
etId = (EditText) findViewById(R.id.etId);
}
private void submit() {
// validate
String etIdString = etId.getText().toString().trim();
if (TextUtils.isEmpty(etIdString)) {
Toast.makeText(this, "请输入对方的id", Toast.LENGTH_SHORT).show();
return;
}
// TODO validate success, do something
}
}
6.Chat的xml
7.SpUtil
public class SPUtils {
/**
* 保存在手机里面的文件名
*/
public static final SharedPreferences sp = App.getSp();
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param key
* @param object
*/
public static void put(String key, Object object) {
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
SharedPreferencesCompat.apply(editor);
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param key
* @param defaultObject
* @return
*/
public static Object get(String key, Object defaultObject) {
if (defaultObject instanceof String) {
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sp.getLong(key, (Long) defaultObject);
}
return null;
}
/**
* 移除某个key值已经对应的值
*
* @param key
*/
public static void remove(String key) {
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.apply(editor);
}
/**
* 清除所有数据
*/
public static void clear() {
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.apply(editor);
}
/**
* 查询某个key是否已经存在
*
* @param key
* @return
*/
public static boolean contains(String key) {
return sp.contains(key);
}
/**
* 返回所有的键值对
* @return
*/
public static Map getAll() {
return sp.getAll();
}
/**
* 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
*/
private static class SharedPreferencesCompat {
private static final Method sApplyMethod = findApplyMethod();
/**
* 反射查找apply的方法
*
* @return
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private static Method findApplyMethod() {
try {
Class clz = SharedPreferences.Editor.class;
return clz.getMethod("apply");
} catch (NoSuchMethodException e) {
}
return null;
}
/**
* 如果找到则使用apply执行,否则使用commit
*
* @param editor
*/
public static void apply(SharedPreferences.Editor editor) {
try {
if (sApplyMethod != null) {
sApplyMethod.invoke(editor);
return;
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
editor.commit();
}
}
}
8.MainAc
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv_info;
private EditText user_name;
private ImageView img_clear_phone;
private EditText user_pwd;
private TextView mRegister;
private TextView mForget;
private Button btn_login;
private Button btn_clear;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
tv_info = (TextView) findViewById(R.id.tv_info);
user_name = (EditText) findViewById(R.id.user_name);
img_clear_phone = (ImageView) findViewById(R.id.img_clear_phone);
user_pwd = (EditText) findViewById(R.id.user_pwd);
mRegister = (TextView) findViewById(R.id.mRegister);
mForget = (TextView) findViewById(R.id.mForget);
btn_login = (Button) findViewById(R.id.btn_login);
btn_clear = (Button) findViewById(R.id.btn_clear);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
img_clear_phone.setOnClickListener(this);
btn_login.setOnClickListener(this);
btn_clear.setOnClickListener(this);
mRegister.setOnClickListener(this);
user_name.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String s1 = s.toString();
if(s1.equals("") || s1==null){
img_clear_phone.setVisibility(View.GONE);
}else{
img_clear_phone.setVisibility(View.VISIBLE);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.img_clear_phone:
user_name.setText("");
break;
case R.id.btn_login://登录
submit();
EaseUtil.login(MainActivity.this,ChatActivity.class,user_name.getText().toString(),user_pwd.getText().toString());
break;
case R.id.mRegister://注册
submit();
EaseUtil.registUser(MainActivity.this,user_name.getText().toString(),user_pwd.getText().toString());
break;
case R.id.btn_clear:
EaseUtil.loginOut(MainActivity.this);
break;
}
}
private void submit() {
// validate
String name = user_name.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
Toast.makeText(this, "请输入用户名", Toast.LENGTH_SHORT).show();
return;
}
String pwd = user_pwd.getText().toString().trim();
if (TextUtils.isEmpty(pwd)) {
Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
return;
}
// TODO validate success, do something
}
}
.App OK.
9.Manifest