package com.arialyy.frame.util;
import android.app.Activity;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.style.ForegroundColorSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;
import java.math.BigDecimal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 字符串工具类
*
* @author lyy
*/
public class StringUtil {
public static final int APPLICATION = 0;
public static final int BROADCAST = 1;
public static final int SERVICE = 2;
public static final int ACTIVITY = 3;
/**
* 获取字体长度
*
* @param textView
* @return
*/
public static int getTextLen(TextView textView) {
TextPaint paint = textView.getPaint();
return (int) Layout.getDesiredWidth(textView.getText().toString(), 0,
textView.getText().length(), paint);
}
/**
* 给某段支付设置下划线
*/
public static SpannableString underLineHight(String str, String underLineStr) {
if (!str.contains(underLineStr)) {
return null;
}
// 创建一个 SpannableString对象
SpannableString sp = new SpannableString(str);
int index = str.indexOf(underLineStr);
//设置背景颜色, StrikethroughSpan()是设置中划线
sp.setSpan(new UnderlineSpan(), index, index + underLineStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sp;
}
/**
* 高亮所有关键字
*
* @param str 这个字符串
* @param key 关键字
*/
public static SpannableString highlightKeyword(String str, String key, int highlightColor) {
if (!str.contains(key)) {
return null;
}
SpannableString sp = new SpannableString(str);
key = Pattern.quote(key);
Pattern p = Pattern.compile(key);
Matcher m = p.matcher(str);
while (m.find()) { //通过正则查找,逐个高亮
int start = m.start();
int end = m.end();
sp.setSpan(new ForegroundColorSpan(highlightColor), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return sp;
}
/**
* 创建一个含有超链接的字符串
*
* @param text 整段字符串
* @param clickText 含有超链接的字符
* @param url 超链接
*/
public static SpannableString createLinkText(String text, String clickText, String url) {
if (!text.contains(clickText)) {
return null;
}
SpannableString sp = new SpannableString(text);
int index = text.indexOf(clickText);
// 设置超链接
sp.setSpan(new URLSpan(url), index, index + clickText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return sp;
}
/**
* 将缓存的key转换为hash码
*
* @param key 缓存的key
* @return 转换后的key的值, 系统便是通过该key来读写缓存
*/
public static String keyToHashKey(String key) {
String cacheKey;
try {
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key.getBytes());
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.hashCode());
}
return cacheKey;
}
/**
* 读取Activity节点的meta-data
*/
public static String getActivityMetaData(Activity activity, String key) {
try {
return activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA)
.metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 读取Service节点的meta-data
*
* @param serviceClazz 服务的class
*/
public static String getServiceMetaData(Context context, Class<? extends Service> serviceClazz, String key) {
try {
return context.getPackageManager().getServiceInfo(new ComponentName(context, serviceClazz), PackageManager.GET_META_DATA)
.metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 读取BroadCast节点meta-data数据
*
* @param receiverClazz 广播接收器的class
*/
public static String getBroadCasetMetaData(Context context, Class<? extends BroadcastReceiver> receiverClazz, String key) {
try {
return context.getPackageManager().getReceiverInfo(new ComponentName(context, receiverClazz), PackageManager.GET_META_DATA)
.metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 读取Application节点的meta-data数据
*/
public static String getApplicationMetaData(Context context, String key) {
try {
return context.getPackageManager().getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA).metaData.getString(key);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 用AES算法解密加密的密码
*
* @param seed 密钥
* @param password 加密的密码
* @return 解密后的密码, 默认返回""
*/
public static String decryptPassword(String seed, String password) {
try {
return AESEncryption.decryptString(seed, password);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 从XML读取字符串
*
* @param context
* @param id 字符串id
* @return
*/
public static String getStringFromXML(Context context, int id) {
return context.getResources().getString(id);
}
/**
* 从xml读取字符串数组
*
* @param context
* @param id
* @return
*/
public static String[] getStringArrayFromXML(Context context, int id) {
return context.getResources().getStringArray(id);
}
/**
* 将字符串数组转换为list
*
* @param strArray
* @return
*/
public static List<String> stringArray2List(String[] strArray) {
List<String> list = new ArrayList<String>();
Collections.addAll(list, strArray);
return list;
}
/**
* 高亮整段字符串
*/
public static SpannableStringBuilder highLightStr(String str, int color) {
SpannableStringBuilder style = new SpannableStringBuilder(str);
style.setSpan(new ForegroundColorSpan(color), 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return style;
}
/**
* 高亮代码片段
*
* @param str 整段字符串
* @param highLightStr 要高亮的代码段
* @param color 高亮颜色
* @return
*/
public static SpannableStringBuilder highLightStr(String str, String highLightStr, int color) {
int start = str.indexOf(highLightStr);
if (start == -1) {
return null;
}
SpannableStringBuilder style = new SpannableStringBuilder(str);
// new BackgroundColorSpan(Color.RED)背景高亮
// ForegroundColorSpan(Color.RED) 字体高亮
style.setSpan(new ForegroundColorSpan(color), start, start
+ highLightStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return style;
}
/**
* 字符串转dbouble
*
* @param str
* @return
*/
public static double strToDouble(String str) {
// double d = Double.parseDouble(str);
/* 以下代码处理精度问题 */
BigDecimal bDeci = new BigDecimal(str);
// BigDecimal chushu =new BigDecimal(100000000);
// BigDecimal result =bDeci.divide(chushu,new
// MathContext(4));//MathConText(4)表示结果精确4位!
// return result.doubleValue() * 100000000;
return bDeci.doubleValue();
}
/**
* 将普通字符串转换为16位进制字符串
*
* @param src
* @return
*/
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("0x");
if (src == null || src.length <= 0) {
return null;
}
char[] buffer = new char[2];
for (byte aSrc : src) {
buffer[0] = Character.forDigit((aSrc >>> 4) & 0x0F, 16);
buffer[1] = Character.forDigit(aSrc & 0x0F, 16);
stringBuilder.append(buffer);
}
return stringBuilder.toString();
}
/**
* 把字符串长度加满16位
*
* @param str
* @return 16位长度的字符串
*/
public static String addStrLenTo16(String str) {
//由于汉字的特殊性,长度要用byte来判断
for (int i = str.getBytes().length; i < 16; i++) {
str += '\0';
}
return str;
}
/**
* 获取对象名
*
* @param obj 对象
* @return 对象名
*/
public static String getClassName(Object obj) {
String arrays[] = obj.getClass().getName().split("\\.");
return arrays[arrays.length - 1];
}
}