确保每一个包存在一个类文件
This commit is contained in:
parent
b51bdb5fa2
commit
ff9a9a53d2
|
@ -1,12 +1,71 @@
|
||||||
package com.zftlive.android;
|
package com.zftlive.android;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 整个应用程序Applicaiton
|
* 整个应用程序Applicaiton
|
||||||
* @author 曾繁添
|
*
|
||||||
|
* @author 曾繁添
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class MApplication extends Application {
|
public class MApplication extends Application {
|
||||||
|
|
||||||
|
private static Context instance;
|
||||||
|
|
||||||
|
public static Stack<Activity> activitys = new Stack<Activity>();
|
||||||
|
|
||||||
|
public static Context gainContext() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> data = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
public static void assignData(String strKey, Object strValue) {
|
||||||
|
if (data.size() > 5) {
|
||||||
|
throw new RuntimeException("超过允许最大数");
|
||||||
|
}
|
||||||
|
data.put(strKey, strValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object gainData(String strKey) {
|
||||||
|
return data.get(strKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void pushTask(Activity task) {
|
||||||
|
activitys.push(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeTask(Activity task) {
|
||||||
|
activitys.remove(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeTask(int taskIndex) {
|
||||||
|
if (activitys.size() > taskIndex)
|
||||||
|
activitys.remove(taskIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeToTop() {
|
||||||
|
int end = activitys.size();
|
||||||
|
int start = 1;
|
||||||
|
for (int i = end - 1; i >= start; i--) {
|
||||||
|
activitys.get(i).finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeAll() {
|
||||||
|
for (Activity task : activitys) {
|
||||||
|
task.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.zftlive.android.common;
|
||||||
|
|
||||||
|
public class VersionChecker {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package com.zftlive.android.entity;
|
||||||
|
|
||||||
|
import com.zftlive.android.base.BaseEntity;
|
||||||
|
|
||||||
|
public class Config extends BaseEntity {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.zftlive.android.exception;
|
||||||
|
|
||||||
|
import com.zftlive.android.base.BaseException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SD卡剩余空间异常
|
||||||
|
* @author 曾繁添
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class NoFreeMbException extends BaseException {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,258 @@
|
||||||
|
package com.zftlive.android.model;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 树节点Model
|
||||||
|
* @author 曾繁添
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Node {
|
||||||
|
private String label;//节点显示的文字
|
||||||
|
private String value;//节点的值
|
||||||
|
private int icon = -1;//是否显示小图标,-1表示隐藏图标
|
||||||
|
private int tipCount = 0; //显示tips数量
|
||||||
|
private String linkURL;//打开连接URL
|
||||||
|
private Node parent;//父节点
|
||||||
|
private List<Node> children = new ArrayList<Node>();//子节点
|
||||||
|
private boolean isChecked = false;//是否处于选中状态
|
||||||
|
private boolean isExpanded = true;//是否处于展开状态
|
||||||
|
private boolean hasCheckBox = true;//是否拥有复选框
|
||||||
|
private boolean isShowTips = true; //是否显示提醒数目
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Node构造函数
|
||||||
|
* @param label 节点显示的文字
|
||||||
|
* @param value 节点的值
|
||||||
|
*/
|
||||||
|
public Node(String label,String value){
|
||||||
|
this.label = label;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置父节点
|
||||||
|
* @param node
|
||||||
|
*/
|
||||||
|
public void setParent(Node node){
|
||||||
|
this.parent = node;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得父节点
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Node getParent(){
|
||||||
|
return this.parent;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置节点文本
|
||||||
|
* @param label
|
||||||
|
*/
|
||||||
|
public void setLabel(String label){
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得节点文本
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getLabel(){
|
||||||
|
return this.label;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置节点值
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public void setValue(String value){
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得节点值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getValue(){
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置节点图标文件
|
||||||
|
* @param icon
|
||||||
|
*/
|
||||||
|
public void setIcon(int icon){
|
||||||
|
this.icon = icon;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得图标文件
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getIcon(){
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得节点连接URL
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getLinkURL() {
|
||||||
|
return linkURL;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置节点连接URL
|
||||||
|
* @param linkURL
|
||||||
|
*/
|
||||||
|
public void setLinkURL(String linkURL) {
|
||||||
|
this.linkURL = linkURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得节点tip数量
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getTipCount() {
|
||||||
|
return tipCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置节点tip数量
|
||||||
|
* @param tip数量
|
||||||
|
*/
|
||||||
|
public void setTipCount(int tipCount) {
|
||||||
|
this.tipCount = tipCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置是否显示tips
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void setIsShowTips(boolean isShowTips){
|
||||||
|
this.isShowTips = isShowTips;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取是否显示tips
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean getIsShowTips(){
|
||||||
|
return this.isShowTips;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否根节点
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isRoot(){
|
||||||
|
return parent==null?true:false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得子节点
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Node> getChildren(){
|
||||||
|
return this.children;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 添加子节点
|
||||||
|
* @param node
|
||||||
|
*/
|
||||||
|
public void add(Node node){
|
||||||
|
if(!children.contains(node)){
|
||||||
|
children.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 清除所有子节点
|
||||||
|
*/
|
||||||
|
public void clear(){
|
||||||
|
children.clear();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 删除一个子节点
|
||||||
|
* @param node
|
||||||
|
*/
|
||||||
|
public void remove(Node node){
|
||||||
|
if(!children.contains(node)){
|
||||||
|
children.remove(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 删除指定位置的子节点
|
||||||
|
* @param location
|
||||||
|
*/
|
||||||
|
public void remove(int location){
|
||||||
|
children.remove(location);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得节点的级数,根节点为0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getLevel(){
|
||||||
|
return parent==null?0:parent.getLevel()+1;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置节点选中状态
|
||||||
|
* @param isChecked
|
||||||
|
*/
|
||||||
|
public void setChecked(boolean isChecked){
|
||||||
|
this.isChecked = isChecked;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获得节点选中状态
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isChecked(){
|
||||||
|
return isChecked;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置是否拥有复选框
|
||||||
|
* @param hasCheckBox
|
||||||
|
*/
|
||||||
|
public void setCheckBox(boolean hasCheckBox){
|
||||||
|
this.hasCheckBox = hasCheckBox;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 是否拥有复选框
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean hasCheckBox(){
|
||||||
|
return hasCheckBox;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否叶节点,即没有子节点的节点
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isLeaf(){
|
||||||
|
return children.size()<1?true:false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 当前节点是否处于展开状态
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isExpanded(){
|
||||||
|
return isExpanded;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 设置节点展开状态
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void setExpanded(boolean isExpanded){
|
||||||
|
this.isExpanded = isExpanded;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 递归判断父节点是否处于折叠状态,有一个父节点折叠则认为是折叠状态
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isParentCollapsed(){
|
||||||
|
if(parent==null)return !isExpanded;
|
||||||
|
if(!parent.isExpanded())return true;
|
||||||
|
return parent.isParentCollapsed();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 递归判断所给的节点是否当前节点的父节点
|
||||||
|
* @param node 所给节点
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isParent(Node node){
|
||||||
|
if(parent==null)return false;
|
||||||
|
if(node.equals(parent))return true;
|
||||||
|
return parent.isParent(node);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.zftlive.android.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉框、单选框、复选框选项Bean
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class Option implements Serializable,Cloneable{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -724868344947644938L;
|
||||||
|
|
||||||
|
private String label = "请选择...";
|
||||||
|
|
||||||
|
private String value = "";
|
||||||
|
|
||||||
|
public Option() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Option(String value,String label) {
|
||||||
|
this.label = label;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(String label) {
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object clone() throws CloneNotSupportedException {
|
||||||
|
return super.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,154 @@
|
||||||
|
package com.zftlive.android.model;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
|
import android.hardware.Camera;
|
||||||
|
import android.net.wifi.WifiInfo;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.SystemClock;
|
||||||
|
import android.telephony.TelephonyManager;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
|
||||||
|
import com.zftlive.android.MApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 运行环境信息
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public final class SysEnv {
|
||||||
|
|
||||||
|
/***Log输出标识**/
|
||||||
|
private static final String TAG = SysEnv.class.getSimpleName();
|
||||||
|
|
||||||
|
/***屏幕显示材质**/
|
||||||
|
private static final DisplayMetrics mDisplayMetrics = new DisplayMetrics();
|
||||||
|
|
||||||
|
/**上下文**/
|
||||||
|
private static final Context context = MApplication.gainContext();
|
||||||
|
|
||||||
|
/**操作系统名称(GT-I9100G)***/
|
||||||
|
public static final String MODEL_NUMBER = Build.MODEL;
|
||||||
|
|
||||||
|
/**操作系统名称(I9100G)***/
|
||||||
|
public static final String DISPLAY_NAME = Build.DISPLAY;
|
||||||
|
|
||||||
|
/**操作系统版本(4.4)***/
|
||||||
|
public static final String OS_VERSION = Build.VERSION.RELEASE;;
|
||||||
|
|
||||||
|
/**应用程序版本***/
|
||||||
|
public static final String APP_VERSION = getVersion();
|
||||||
|
|
||||||
|
/***屏幕宽度**/
|
||||||
|
public static final int SCREEN_WIDTH = getDisplayMetrics().widthPixels;
|
||||||
|
|
||||||
|
/***屏幕高度**/
|
||||||
|
public static final int SCREEN_HEIGHT = getDisplayMetrics().heightPixels;
|
||||||
|
|
||||||
|
/***本机手机号码**/
|
||||||
|
public static final String PHONE_NUMBER = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number();
|
||||||
|
|
||||||
|
/***设备ID**/
|
||||||
|
public static final String DEVICE_ID = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
|
||||||
|
|
||||||
|
/***设备IMEI号码**/
|
||||||
|
public static final String IMEI = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getSimSerialNumber();
|
||||||
|
|
||||||
|
/***设备IMSI号码**/
|
||||||
|
public static final String IMSI = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getSubscriberId();
|
||||||
|
|
||||||
|
/**获取系统显示材质***/
|
||||||
|
public static DisplayMetrics getDisplayMetrics(){
|
||||||
|
WindowManager windowMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
|
||||||
|
windowMgr.getDefaultDisplay().getMetrics(mDisplayMetrics);
|
||||||
|
return mDisplayMetrics;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**获取摄像头支持的分辨率***/
|
||||||
|
public static List<Camera.Size> getSupportedPreviewSizes(Camera camera){
|
||||||
|
Camera.Parameters parameters = camera.getParameters();
|
||||||
|
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
|
||||||
|
return sizeList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取应用程序版本(versionName)
|
||||||
|
* @return 当前应用的版本号
|
||||||
|
*/
|
||||||
|
public static String getVersion() {
|
||||||
|
PackageManager manager = context.getPackageManager();
|
||||||
|
PackageInfo info = null;
|
||||||
|
try {
|
||||||
|
info = manager.getPackageInfo(context.getPackageName(), 0);
|
||||||
|
} catch (NameNotFoundException e) {
|
||||||
|
Log.e(TAG, "获取应用程序版本失败,原因:"+e.getMessage());
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return info.versionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取系统内核版本
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getKernelVersion(){
|
||||||
|
String strVersion= "";
|
||||||
|
FileReader mFileReader = null;
|
||||||
|
BufferedReader mBufferedReader = null;
|
||||||
|
try {
|
||||||
|
mFileReader = new FileReader("/proc/version");
|
||||||
|
mBufferedReader = new BufferedReader(mFileReader, 8192);
|
||||||
|
String str2 = mBufferedReader.readLine();
|
||||||
|
strVersion = str2.split("\\s+")[2];//KernelVersion
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "获取系统内核版本失败,原因:"+e.getMessage());
|
||||||
|
}finally{
|
||||||
|
try {
|
||||||
|
mBufferedReader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***
|
||||||
|
* 获取MAC地址
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getMacAddress(){
|
||||||
|
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
||||||
|
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
||||||
|
if(wifiInfo.getMacAddress()!=null){
|
||||||
|
return wifiInfo.getMacAddress();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取运行时间
|
||||||
|
* @return 运行时间(单位/s)
|
||||||
|
*/
|
||||||
|
public static long getRunTimes() {
|
||||||
|
long ut = SystemClock.elapsedRealtime() / 1000;
|
||||||
|
if (ut == 0) {
|
||||||
|
ut = 1;
|
||||||
|
}
|
||||||
|
return ut;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.zftlive.android.service;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.IBinder;
|
||||||
|
|
||||||
|
public class NetworkStateService extends Service {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,142 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.AlertDialog.Builder;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于静态内部类实现的单例,保证线程安全的网络信息工具类 <per> 使用该工具类之前,记得在AndroidManifest.xml添加权限许可 <xmp>
|
||||||
|
* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
* </xmp> </per>
|
||||||
|
*
|
||||||
|
* 安卓判断网络状态,只需要在相应的Activity的相关方法(onCreat/onResum)调用一行代码即可
|
||||||
|
* NetWorkUtils.getInstance(getActivity()).validateNetWork();
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class ToolNetwork {
|
||||||
|
|
||||||
|
public final static String NETWORK_CMNET = "CMNET";
|
||||||
|
public final static String NETWORK_CMWAP = "CMWAP";
|
||||||
|
public final static String NETWORK_WIFI = "WIFI";
|
||||||
|
public final static String TAG = "NetWorkUtils";
|
||||||
|
private static NetworkInfo networkInfo = null;
|
||||||
|
private Context mContext = null;
|
||||||
|
|
||||||
|
private ToolNetwork() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ToolNetwork getInstance() {
|
||||||
|
return SingletonHolder.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ToolNetwork init(Context context){
|
||||||
|
this.mContext = context;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断网络是否可用
|
||||||
|
*
|
||||||
|
* @return 是/否
|
||||||
|
*/
|
||||||
|
public boolean isAvailable() {
|
||||||
|
ConnectivityManager manager = (ConnectivityManager) mContext
|
||||||
|
.getApplicationContext().getSystemService(
|
||||||
|
Context.CONNECTIVITY_SERVICE);
|
||||||
|
if (null == manager) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
networkInfo = manager.getActiveNetworkInfo();
|
||||||
|
if (null == networkInfo || !networkInfo.isAvailable()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断网络是否已连接
|
||||||
|
*
|
||||||
|
* @return 是/否
|
||||||
|
*/
|
||||||
|
public boolean isConnected() {
|
||||||
|
if (!isAvailable()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!networkInfo.isConnected()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查当前环境网络是否可用,不可用跳转至开启网络界面,不设置网络强制关闭当前Activity
|
||||||
|
*/
|
||||||
|
public void validateNetWork() {
|
||||||
|
|
||||||
|
if (!isConnected()) {
|
||||||
|
Builder dialogBuilder = new AlertDialog.Builder(mContext);
|
||||||
|
dialogBuilder.setTitle("网络设置");
|
||||||
|
dialogBuilder.setMessage("网络不可用,是否现在设置网络?");
|
||||||
|
dialogBuilder.setPositiveButton(android.R.string.ok,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
((Activity) mContext).startActivityForResult(
|
||||||
|
new Intent(
|
||||||
|
Settings.ACTION_SETTINGS),
|
||||||
|
which);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialogBuilder.setNegativeButton(android.R.string.cancel,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
dialog.cancel();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialogBuilder.create();
|
||||||
|
dialogBuilder.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取网络连接信息</br> 无网络:</br> WIFI网络:WIFI</br> WAP网络:CMWAP</br>
|
||||||
|
* NET网络:CMNET</br>
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getNetworkType() {
|
||||||
|
if (isConnected()) {
|
||||||
|
int type = networkInfo.getType();
|
||||||
|
if (ConnectivityManager.TYPE_MOBILE == type) {
|
||||||
|
Log.i(TAG,
|
||||||
|
"networkInfo.getExtraInfo()-->"
|
||||||
|
+ networkInfo.getExtraInfo());
|
||||||
|
if (NETWORK_CMWAP.equals(networkInfo.getExtraInfo()
|
||||||
|
.toLowerCase())) {
|
||||||
|
return NETWORK_CMWAP;
|
||||||
|
} else {
|
||||||
|
return NETWORK_CMNET;
|
||||||
|
}
|
||||||
|
} else if (ConnectivityManager.TYPE_WIFI == type) {
|
||||||
|
return NETWORK_WIFI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SingletonHolder {
|
||||||
|
|
||||||
|
private static ToolNetwork instance = new ToolNetwork();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,467 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Hashtable;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Bitmap.Config;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.ColorMatrix;
|
||||||
|
import android.graphics.ColorMatrixColorFilter;
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.PixelFormat;
|
||||||
|
import android.graphics.PorterDuff.Mode;
|
||||||
|
import android.graphics.PorterDuffXfermode;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.RectF;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.graphics.drawable.NinePatchDrawable;
|
||||||
|
import android.media.ExifInterface;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.google.zxing.BarcodeFormat;
|
||||||
|
import com.google.zxing.EncodeHintType;
|
||||||
|
import com.google.zxing.WriterException;
|
||||||
|
import com.google.zxing.common.BitMatrix;
|
||||||
|
import com.google.zxing.qrcode.QRCodeWriter;
|
||||||
|
import com.zftlive.android.model.SysEnv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片工具类
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class ToolPicture {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 截取应用程序界面(去除状态栏)
|
||||||
|
* @param activity 界面Activity
|
||||||
|
* @return Bitmap对象
|
||||||
|
*/
|
||||||
|
public static Bitmap takeScreenShot(Activity activity){
|
||||||
|
View view =activity.getWindow().getDecorView();
|
||||||
|
view.setDrawingCacheEnabled(true);
|
||||||
|
view.buildDrawingCache();
|
||||||
|
Bitmap bitmap = view.getDrawingCache();
|
||||||
|
Rect rect = new Rect();
|
||||||
|
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
|
||||||
|
int statusBarHeight = rect.top;
|
||||||
|
|
||||||
|
Bitmap bitmap2 = Bitmap.createBitmap(bitmap,0,statusBarHeight, SysEnv.SCREEN_WIDTH, SysEnv.SCREEN_HEIGHT - statusBarHeight);
|
||||||
|
view.destroyDrawingCache();
|
||||||
|
return bitmap2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 截取应用程序界面
|
||||||
|
* @param activity 界面Activity
|
||||||
|
* @return Bitmap对象
|
||||||
|
*/
|
||||||
|
public static Bitmap takeFullScreenShot(Activity activity){
|
||||||
|
|
||||||
|
activity.getWindow().getDecorView().setDrawingCacheEnabled(true);
|
||||||
|
|
||||||
|
Bitmap bmp = activity.getWindow().getDecorView().getDrawingCache();
|
||||||
|
|
||||||
|
|
||||||
|
View view = activity.getWindow().getDecorView();
|
||||||
|
|
||||||
|
Bitmap bmp2 = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
|
||||||
|
|
||||||
|
//view.draw(new Canvas(bmp2));
|
||||||
|
|
||||||
|
//bmp就是截取的图片了,可通过bmp.compress(CompressFormat.PNG, 100, new FileOutputStream(file));把图片保存为文件。
|
||||||
|
|
||||||
|
//1、得到状态栏高度
|
||||||
|
Rect rect = new Rect();
|
||||||
|
view.getWindowVisibleDisplayFrame(rect);
|
||||||
|
int statusBarHeight = rect.top;
|
||||||
|
System.out.println("状态栏高度:" + statusBarHeight);
|
||||||
|
|
||||||
|
//2、得到标题栏高度
|
||||||
|
int wintop = activity.getWindow().findViewById(android.R.id.content).getTop();
|
||||||
|
int titleBarHeight = wintop - statusBarHeight;
|
||||||
|
System.out.println("标题栏高度:" + titleBarHeight);
|
||||||
|
|
||||||
|
// //把两个bitmap合到一起
|
||||||
|
// Bitmap bmpall=Biatmap.createBitmap(width,height,Config.ARGB_8888);
|
||||||
|
// Canvas canvas=new Canvas(bmpall);
|
||||||
|
// canvas.drawBitmap(bmp1,x,y,paint);
|
||||||
|
// canvas.drawBitmap(bmp2,x,y,paint);
|
||||||
|
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据指定内容生成自定义宽高的二维码图片
|
||||||
|
* @param content 需要生成二维码的内容
|
||||||
|
* @param width 二维码宽度
|
||||||
|
* @param height 二维码高度
|
||||||
|
* @throws WriterException 生成二维码异常
|
||||||
|
*/
|
||||||
|
public static Bitmap makeQRImage(String content, int width, int height)
|
||||||
|
throws WriterException {
|
||||||
|
// 判断URL合法性
|
||||||
|
if (ToolString.isNoBlankAndNoNull(content))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
|
||||||
|
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
|
||||||
|
// 图像数据转换,使用了矩阵转换
|
||||||
|
BitMatrix bitMatrix = new QRCodeWriter().encode(content,
|
||||||
|
BarcodeFormat.QR_CODE, width, height, hints);
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
// 按照二维码的算法,逐个生成二维码的图片,两个for循环是图片横列扫描的结果
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
if (bitMatrix.get(x, y))
|
||||||
|
pixels[y * width + x] = 0xff000000;
|
||||||
|
else
|
||||||
|
pixels[y * width + x] = 0xffffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 生成二维码图片的格式,使用ARGB_8888
|
||||||
|
Bitmap bitmap = Bitmap.createBitmap(width, height,
|
||||||
|
Bitmap.Config.ARGB_8888);
|
||||||
|
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取图片属性:旋转的角度
|
||||||
|
*
|
||||||
|
* @param path 图片绝对路径
|
||||||
|
* @return degree 旋转的角度
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static int gainPictureDegree(String path) throws Exception {
|
||||||
|
int degree = 0;
|
||||||
|
try {
|
||||||
|
ExifInterface exifInterface = new ExifInterface(path);
|
||||||
|
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
|
||||||
|
switch (orientation) {
|
||||||
|
case ExifInterface.ORIENTATION_ROTATE_90:
|
||||||
|
degree = 90;
|
||||||
|
break;
|
||||||
|
case ExifInterface.ORIENTATION_ROTATE_180:
|
||||||
|
degree = 180;
|
||||||
|
break;
|
||||||
|
case ExifInterface.ORIENTATION_ROTATE_270:
|
||||||
|
degree = 270;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return degree;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 旋转图片
|
||||||
|
* @param angle 角度
|
||||||
|
* @param bitmap 源bitmap
|
||||||
|
* @return Bitmap 旋转角度之后的bitmap
|
||||||
|
*/
|
||||||
|
public static Bitmap rotaingBitmap(int angle,Bitmap bitmap) {
|
||||||
|
//旋转图片 动作
|
||||||
|
Matrix matrix = new Matrix();;
|
||||||
|
matrix.postRotate(angle);
|
||||||
|
//重新构建Bitmap
|
||||||
|
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix, true);
|
||||||
|
return resizedBitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drawable转成Bitmap
|
||||||
|
* @param drawable
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Bitmap drawableToBitmap(Drawable drawable) {
|
||||||
|
if (drawable instanceof BitmapDrawable) {
|
||||||
|
return ((BitmapDrawable) drawable).getBitmap();
|
||||||
|
} else if (drawable instanceof NinePatchDrawable) {
|
||||||
|
Bitmap bitmap = Bitmap
|
||||||
|
.createBitmap(
|
||||||
|
drawable.getIntrinsicWidth(),
|
||||||
|
drawable.getIntrinsicHeight(),
|
||||||
|
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
|
||||||
|
: Bitmap.Config.RGB_565);
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
|
||||||
|
drawable.getIntrinsicHeight());
|
||||||
|
drawable.draw(canvas);
|
||||||
|
return bitmap;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从资源文件中获取图片
|
||||||
|
* @param context 上下文
|
||||||
|
* @param drawableId 资源文件id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Bitmap gainBitmap(Context context,int drawableId){
|
||||||
|
Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), drawableId);
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 灰白图片(去色)
|
||||||
|
* @param bitmap 需要灰度的图片
|
||||||
|
* @return 去色之后的图片
|
||||||
|
*/
|
||||||
|
public static Bitmap toBlack(Bitmap bitmap) {
|
||||||
|
Bitmap resultBMP = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
|
||||||
|
Bitmap.Config.RGB_565);
|
||||||
|
Canvas c = new Canvas(resultBMP);
|
||||||
|
Paint paint = new Paint();
|
||||||
|
ColorMatrix cm = new ColorMatrix();
|
||||||
|
cm.setSaturation(0);
|
||||||
|
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
|
||||||
|
paint.setColorFilter(f);
|
||||||
|
c.drawBitmap(bitmap, 0, 0, paint);
|
||||||
|
return resultBMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将bitmap转成 byte数组
|
||||||
|
*
|
||||||
|
* @param bitmap
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static byte[] toBtyeArray(Bitmap bitmap) {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
|
||||||
|
return baos.toByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将byte数组转成 bitmap
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Bitmap bytesToBimap(byte[] b) {
|
||||||
|
if (b.length != 0) {
|
||||||
|
return BitmapFactory.decodeByteArray(b, 0, b.length);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将Bitmap转换成指定大小
|
||||||
|
*
|
||||||
|
* @param bitmap 需要改变大小的图片
|
||||||
|
* @param width 宽
|
||||||
|
* @param height 高
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Bitmap createBitmapBySize(Bitmap bitmap, int width, int height) {
|
||||||
|
return Bitmap.createScaledBitmap(bitmap, width, height, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在图片右下角添加水印
|
||||||
|
* @param srcBMP 原图
|
||||||
|
* @param markBMP 水印图片
|
||||||
|
* @return 合成水印后的图片
|
||||||
|
*/
|
||||||
|
public static Bitmap composeWatermark(Bitmap srcBMP, Bitmap markBMP) {
|
||||||
|
if (srcBMP == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建一个新的和SRC长度宽度一样的位图
|
||||||
|
Bitmap newb = Bitmap.createBitmap(srcBMP.getWidth(), srcBMP.getHeight(), Config.ARGB_8888);
|
||||||
|
Canvas cv = new Canvas(newb);
|
||||||
|
// 在 0,0坐标开始画入原图
|
||||||
|
cv.drawBitmap(srcBMP, 0, 0, null);
|
||||||
|
// 在原图的右下角画入水印
|
||||||
|
cv.drawBitmap(markBMP, srcBMP.getWidth() - markBMP.getWidth() + 5, srcBMP.getHeight() - markBMP.getHeight() + 5, null);
|
||||||
|
// 保存
|
||||||
|
cv.save(Canvas.ALL_SAVE_FLAG);
|
||||||
|
// 存储
|
||||||
|
cv.restore();
|
||||||
|
|
||||||
|
return newb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将图片转成指定弧度(角度)的图片
|
||||||
|
*
|
||||||
|
* @param bitmap 需要修改的图片
|
||||||
|
* @param pixels 圆角的弧度
|
||||||
|
* @return 圆角图片
|
||||||
|
*/
|
||||||
|
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
|
||||||
|
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
|
||||||
|
//根据图片创建画布
|
||||||
|
Canvas canvas = new Canvas(output);
|
||||||
|
final Paint paint = new Paint();
|
||||||
|
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
|
||||||
|
final RectF rectF = new RectF(rect);
|
||||||
|
final float roundPx = pixels;
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
canvas.drawARGB(0, 0, 0, 0);
|
||||||
|
paint.setColor(0xff424242);
|
||||||
|
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
|
||||||
|
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
|
||||||
|
canvas.drawBitmap(bitmap, rect, rect, paint);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缩放图片
|
||||||
|
*
|
||||||
|
* @param bmp 需要缩放的图片源
|
||||||
|
* @param newW 需要缩放成的图片宽度
|
||||||
|
* @param newH 需要缩放成的图片高度
|
||||||
|
* @return 缩放后的图片
|
||||||
|
*/
|
||||||
|
public static Bitmap zoom(Bitmap bmp, int newW, int newH) {
|
||||||
|
|
||||||
|
// 获得图片的宽高
|
||||||
|
int width = bmp.getWidth();
|
||||||
|
int height = bmp.getHeight();
|
||||||
|
|
||||||
|
// 计算缩放比例
|
||||||
|
float scaleWidth = ((float) newW) / width;
|
||||||
|
float scaleHeight = ((float) newH) / height;
|
||||||
|
|
||||||
|
// 取得想要缩放的matrix参数
|
||||||
|
Matrix matrix = new Matrix();
|
||||||
|
matrix.postScale(scaleWidth, scaleHeight);
|
||||||
|
|
||||||
|
// 得到新的图片
|
||||||
|
Bitmap newbm = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix,true);
|
||||||
|
|
||||||
|
return newbm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取验证码图片
|
||||||
|
* @param width 验证码宽度
|
||||||
|
* @param height 验证码高度
|
||||||
|
* @return 验证码Bitmap对象
|
||||||
|
*/
|
||||||
|
public synchronized static Bitmap makeValidateCode(int width, int height){
|
||||||
|
return ValidateCodeGenerator.createBitmap(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取验证码值
|
||||||
|
* @return 验证码字符串
|
||||||
|
*/
|
||||||
|
public synchronized static String gainValidateCodeValue(){
|
||||||
|
return ValidateCodeGenerator.getCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 随机生成验证码内部类
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
final static class ValidateCodeGenerator{
|
||||||
|
private static final char[] CHARS = {
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||||
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
||||||
|
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
|
||||||
|
};
|
||||||
|
|
||||||
|
//default settings
|
||||||
|
private static final int DEFAULT_CODE_LENGTH = 4;
|
||||||
|
private static final int DEFAULT_FONT_SIZE = 20;
|
||||||
|
private static final int DEFAULT_LINE_NUMBER = 3;
|
||||||
|
private static final int BASE_PADDING_LEFT = 5, RANGE_PADDING_LEFT = 10, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 10;
|
||||||
|
private static final int DEFAULT_WIDTH = 60, DEFAULT_HEIGHT = 30;
|
||||||
|
|
||||||
|
//variables
|
||||||
|
private static String value;
|
||||||
|
private static int padding_left, padding_top;
|
||||||
|
private static Random random = new Random();
|
||||||
|
|
||||||
|
public static Bitmap createBitmap(int width,int height) {
|
||||||
|
padding_left = 0;
|
||||||
|
//创建画布
|
||||||
|
Bitmap bp = Bitmap.createBitmap(width, height, Config.ARGB_8888);
|
||||||
|
Canvas c = new Canvas(bp);
|
||||||
|
|
||||||
|
//随机生成验证码字符
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
for (int i = 0; i < DEFAULT_CODE_LENGTH; i++) {
|
||||||
|
buffer.append(CHARS[random.nextInt(CHARS.length)]);
|
||||||
|
}
|
||||||
|
value = buffer.toString();
|
||||||
|
|
||||||
|
//设置颜色
|
||||||
|
c.drawColor(Color.WHITE);
|
||||||
|
|
||||||
|
//设置画笔大小
|
||||||
|
Paint paint = new Paint();
|
||||||
|
paint.setTextSize(DEFAULT_FONT_SIZE);
|
||||||
|
for (int i = 0; i < value.length(); i++) {
|
||||||
|
//随机样式
|
||||||
|
randomTextStyle(paint);
|
||||||
|
padding_left += BASE_PADDING_LEFT + random.nextInt(RANGE_PADDING_LEFT);
|
||||||
|
padding_top = BASE_PADDING_TOP + random.nextInt(RANGE_PADDING_TOP);
|
||||||
|
c.drawText(value.charAt(i) + "", padding_left, padding_top, paint);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < DEFAULT_LINE_NUMBER; i++) {
|
||||||
|
drawLine(c, paint);
|
||||||
|
}
|
||||||
|
//保存
|
||||||
|
c.save(Canvas.ALL_SAVE_FLAG);
|
||||||
|
c.restore();
|
||||||
|
|
||||||
|
return bp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getCode() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void randomTextStyle(Paint paint) {
|
||||||
|
int color = randomColor(1);
|
||||||
|
paint.setColor(color);
|
||||||
|
paint.setFakeBoldText(random.nextBoolean());//true为粗体,false为非粗体
|
||||||
|
float skewX = random.nextInt(11) / 10;
|
||||||
|
skewX = random.nextBoolean() ? skewX : -skewX;
|
||||||
|
paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
|
||||||
|
paint.setUnderlineText(true); //true为下划线,false为非下划线
|
||||||
|
paint.setStrikeThruText(true); //true为删除线,false为非删除线
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void drawLine(Canvas canvas, Paint paint) {
|
||||||
|
int color = randomColor(1);
|
||||||
|
int startX = random.nextInt(DEFAULT_WIDTH);
|
||||||
|
int startY = random.nextInt(DEFAULT_HEIGHT);
|
||||||
|
int stopX = random.nextInt(DEFAULT_WIDTH);
|
||||||
|
int stopY = random.nextInt(DEFAULT_HEIGHT);
|
||||||
|
paint.setStrokeWidth(1);
|
||||||
|
paint.setColor(color);
|
||||||
|
canvas.drawLine(startX, startY, stopX, stopY, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int randomColor(int rate) {
|
||||||
|
int red = random.nextInt(256) / rate;
|
||||||
|
int green = random.nextInt(256) / rate;
|
||||||
|
int blue = random.nextInt(256) / rate;
|
||||||
|
return Color.rgb(red, green, blue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.zftlive.android.MApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置文件工具类
|
||||||
|
*
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class ToolProperties extends Properties {
|
||||||
|
|
||||||
|
private static Properties property = new Properties();
|
||||||
|
|
||||||
|
public static String readAssetsProp(String fileName, String key) {
|
||||||
|
String value = "";
|
||||||
|
try {
|
||||||
|
InputStream in = MApplication.gainContext().getAssets().open(fileName);
|
||||||
|
property.load(in);
|
||||||
|
value = property.getProperty(key);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String readAssetsProp(Context context,String fileName, String key) {
|
||||||
|
String value = "";
|
||||||
|
try {
|
||||||
|
InputStream in = context.getAssets().open(fileName);
|
||||||
|
property.load(in);
|
||||||
|
value = property.getProperty(key);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String readAssetsProp(String fileName, String key,String defaultValue) {
|
||||||
|
String value = "";
|
||||||
|
try {
|
||||||
|
InputStream in = MApplication.gainContext().getAssets().open(fileName);
|
||||||
|
property.load(in);
|
||||||
|
value = property.getProperty(key, defaultValue);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String readAssetsProp(Context context,String fileName, String key,String defaultValue) {
|
||||||
|
String value = "";
|
||||||
|
try {
|
||||||
|
InputStream in = context.getAssets().open(fileName);
|
||||||
|
property.load(in);
|
||||||
|
value = property.getProperty(key, defaultValue);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.zftlive.android.MApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取资源工具类
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class ToolResource {
|
||||||
|
private static final String TAG = ToolResource.class.getName();
|
||||||
|
|
||||||
|
private static Context mContext = MApplication.gainContext();
|
||||||
|
|
||||||
|
private static Class<?> CDrawable = null;
|
||||||
|
|
||||||
|
private static Class<?> CLayout = null;
|
||||||
|
|
||||||
|
private static Class<?> CId = null;
|
||||||
|
|
||||||
|
private static Class<?> CAnim = null;
|
||||||
|
|
||||||
|
private static Class<?> CStyle = null;
|
||||||
|
|
||||||
|
private static Class<?> CString = null;
|
||||||
|
|
||||||
|
private static Class<?> CArray = null;
|
||||||
|
|
||||||
|
static{
|
||||||
|
try{
|
||||||
|
CDrawable = Class.forName(mContext.getPackageName() + ".R$drawable");
|
||||||
|
CLayout = Class.forName(mContext.getPackageName() + ".R$layout");
|
||||||
|
CId = Class.forName(mContext.getPackageName() + ".R$id");
|
||||||
|
CAnim = Class.forName(mContext.getPackageName() + ".R$anim");
|
||||||
|
CStyle = Class.forName(mContext.getPackageName() + ".R$style");
|
||||||
|
CString = Class.forName(mContext.getPackageName() + ".R$string");
|
||||||
|
CArray = Class.forName(mContext.getPackageName() + ".R$array");
|
||||||
|
|
||||||
|
}catch(ClassNotFoundException e){
|
||||||
|
Log.i(TAG,e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getDrawableId(String resName){
|
||||||
|
return getResId(CDrawable,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getLayoutId(String resName){
|
||||||
|
return getResId(CLayout,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getIdId(String resName){
|
||||||
|
return getResId(CId,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getAnimId(String resName){
|
||||||
|
return getResId(CAnim,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getStyleId(String resName){
|
||||||
|
return getResId(CStyle,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getStringId(String resName){
|
||||||
|
return getResId(CString,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getArrayId(String resName){
|
||||||
|
return getResId(CArray,resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getResId(Class<?> resClass,String resName){
|
||||||
|
if(resClass == null){
|
||||||
|
Log.i(TAG,"getRes(null," + resName + ")");
|
||||||
|
throw new IllegalArgumentException("ResClass is not initialized. Please make sure you have added neccessary resources. Also make sure you have " + mContext.getPackageName() + ".R$* configured in obfuscation. field=" + resName);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Field field = resClass.getField(resName);
|
||||||
|
return field.getInt(resName);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.i(TAG, "getRes(" + resClass.getName() + ", " + resName + ")");
|
||||||
|
Log.i(TAG, "Error getting resource. Make sure you have copied all resources (res/) from SDK to your project. ");
|
||||||
|
Log.i(TAG, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Message;
|
||||||
|
import cn.smssdk.EventHandler;
|
||||||
|
import cn.smssdk.SMSSDK;
|
||||||
|
|
||||||
|
import com.zftlive.android.MApplication;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送短信验证码工具类
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ToolSMS {
|
||||||
|
|
||||||
|
public static String APPKEY = "25c13dc2e1c4";
|
||||||
|
public static String APPSECRET = "14340f710d155024867d4870786d4c10";
|
||||||
|
public static String CHINA = "86";
|
||||||
|
private static IValidateSMSCode mIValidateSMSCode;
|
||||||
|
private static Handler mSMSHandle = new MySMSHandler();
|
||||||
|
private static Context context = MApplication.gainContext();
|
||||||
|
|
||||||
|
public static void initSDK(String appkey, String appSecrect){
|
||||||
|
// 初始化短信SDK
|
||||||
|
SMSSDK.initSDK(context, appkey, appSecrect);
|
||||||
|
//注册回调监听接口
|
||||||
|
SMSSDK.registerEventHandler(new EventHandler() {
|
||||||
|
public void afterEvent(int event, int result, Object data) {
|
||||||
|
Message msg = new Message();
|
||||||
|
msg.arg1 = event;
|
||||||
|
msg.arg2 = result;
|
||||||
|
msg.obj = data;
|
||||||
|
mSMSHandle.sendMessage(msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求获取短信验证码
|
||||||
|
* @param phone 手机号
|
||||||
|
*/
|
||||||
|
public static void getVerificationCode(String phone){
|
||||||
|
SMSSDK.getVerificationCode(CHINA, phone);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交短信验证码,校验是否正确
|
||||||
|
* @param phone 手机号
|
||||||
|
* @param validateCode 手机短信验证码
|
||||||
|
*/
|
||||||
|
public static void submitVerificationCode(String phone, String validateCode,IValidateSMSCode callback){
|
||||||
|
mIValidateSMSCode = callback;
|
||||||
|
SMSSDK.submitVerificationCode(CHINA, phone, validateCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 释放资源
|
||||||
|
*/
|
||||||
|
public static void release(){
|
||||||
|
// 销毁回调监听接口
|
||||||
|
SMSSDK.unregisterAllEventHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息处理Handle
|
||||||
|
*/
|
||||||
|
private static class MySMSHandler extends Handler{
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
super.handleMessage(msg);
|
||||||
|
|
||||||
|
int event = msg.arg1;
|
||||||
|
int result = msg.arg2;
|
||||||
|
Object data = msg.obj;
|
||||||
|
|
||||||
|
if (result == SMSSDK.RESULT_COMPLETE) {
|
||||||
|
//提交验证码成功
|
||||||
|
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
|
||||||
|
//验证成功回调
|
||||||
|
if(null != mIValidateSMSCode){
|
||||||
|
mIValidateSMSCode.onSucced();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Throwable exption = ((Throwable) data);
|
||||||
|
//验证成功回调
|
||||||
|
if(null != mIValidateSMSCode){
|
||||||
|
mIValidateSMSCode.onFailed(exption);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交短信验证码回调接口
|
||||||
|
*/
|
||||||
|
public interface IValidateSMSCode{
|
||||||
|
void onSucced();
|
||||||
|
void onFailed(Throwable e);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import org.ksoap2.SoapEnvelope;
|
||||||
|
import org.ksoap2.serialization.SoapObject;
|
||||||
|
import org.ksoap2.serialization.SoapSerializationEnvelope;
|
||||||
|
import org.ksoap2.transport.HttpTransportSE;
|
||||||
|
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访问WebService的工具类,
|
||||||
|
*
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ToolSOAP {
|
||||||
|
|
||||||
|
// 含有3个线程的线程池
|
||||||
|
private static final ExecutorService executorService = Executors.newFixedThreadPool(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param url WebService服务器地址
|
||||||
|
* @param namespace 命名空间
|
||||||
|
* @param methodName WebService的调用方法名
|
||||||
|
* @param properties WebService的参数
|
||||||
|
* @param webServiceCallBack 返回结果回调接口
|
||||||
|
*/
|
||||||
|
public static void callService(String url,final String namespace,final String methodName,HashMap<String,String> properties,final WebServiceCallBack webServiceCallBack) {
|
||||||
|
// 创建HttpTransportSE对象,传递WebService服务器地址
|
||||||
|
final HttpTransportSE httpTransportSE = new HttpTransportSE(url);
|
||||||
|
// 创建SoapObject对象
|
||||||
|
SoapObject soapObject = new SoapObject(namespace, methodName);
|
||||||
|
|
||||||
|
// SoapObject添加参数
|
||||||
|
if (properties != null) {
|
||||||
|
for (Iterator<Map.Entry<String, String>> it = properties.entrySet().iterator(); it.hasNext();) {
|
||||||
|
Map.Entry<String, String> entry = it.next();
|
||||||
|
soapObject.addProperty(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号
|
||||||
|
final SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
|
||||||
|
// 设置是否调用的是.Net开发的WebService
|
||||||
|
soapEnvelope.setOutputSoapObject(soapObject);
|
||||||
|
soapEnvelope.dotNet = true;
|
||||||
|
httpTransportSE.debug = true;
|
||||||
|
|
||||||
|
// 用于子线程与主线程通信的Handler
|
||||||
|
final Handler mHandler = new Handler() {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
super.handleMessage(msg);
|
||||||
|
if(msg.what == 0){
|
||||||
|
webServiceCallBack.onSucced((SoapObject) msg.obj);
|
||||||
|
}else{
|
||||||
|
webServiceCallBack.onFailure((String)msg.obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 开启线程去访问WebService
|
||||||
|
executorService.submit(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SoapObject resultSoapObject = null;
|
||||||
|
Message mgs = mHandler.obtainMessage();
|
||||||
|
try {
|
||||||
|
|
||||||
|
httpTransportSE.call(namespace + methodName, soapEnvelope);
|
||||||
|
if (soapEnvelope.getResponse() != null) {
|
||||||
|
// 获取服务器响应返回的SoapObject
|
||||||
|
resultSoapObject = (SoapObject) soapEnvelope.bodyIn;
|
||||||
|
}
|
||||||
|
mgs.what = 0;
|
||||||
|
mgs.obj = resultSoapObject;
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
mgs.what = 1;
|
||||||
|
mgs.obj = e.getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将获取的消息利用Handler发送到主线程
|
||||||
|
mHandler.sendMessage(mgs);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebService回调接口
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface WebServiceCallBack {
|
||||||
|
|
||||||
|
public void onSucced(SoapObject result);
|
||||||
|
|
||||||
|
public void onFailure(String result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串工具类
|
||||||
|
* @author 曾繁添
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ToolString {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取UUID
|
||||||
|
* @return 32UUID小写字符串
|
||||||
|
*/
|
||||||
|
public static String gainUUID(){
|
||||||
|
String strUUID = UUID.randomUUID().toString();
|
||||||
|
strUUID = strUUID.replaceAll("-", "").toLowerCase();
|
||||||
|
return strUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断字符串是否非空非null
|
||||||
|
* @param strParm 需要判断的字符串
|
||||||
|
* @return 真假
|
||||||
|
*/
|
||||||
|
public static boolean isNoBlankAndNoNull(String strParm)
|
||||||
|
{
|
||||||
|
return (strParm == null) || (strParm.equals(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将流转成字符串
|
||||||
|
* @param is 输入流
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String convertStreamToString(InputStream is) throws Exception {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
sb.append(line).append("\n");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将文件转成字符串
|
||||||
|
* @param file 文件
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String getStringFromFile(File file) throws Exception {
|
||||||
|
FileInputStream fin = new FileInputStream(file);
|
||||||
|
String ret = convertStreamToString(fin);
|
||||||
|
//Make sure you close all streams.
|
||||||
|
fin.close();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,155 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.GradientDrawable;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.LinearLayout.LayoutParams;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import com.zftlive.android.MApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义Toast控件
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class ToolToast {
|
||||||
|
|
||||||
|
private static Toast mToast;
|
||||||
|
private static Handler mHandler = new Handler();
|
||||||
|
private static Runnable r = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
mToast.cancel();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弹出较长时间提示信息
|
||||||
|
* @param context 上下文对象
|
||||||
|
* @param msg 要显示的信息
|
||||||
|
*/
|
||||||
|
public static void showLong(Context context, String msg){
|
||||||
|
buildToast(context,msg,Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弹出较长时间提示信息
|
||||||
|
* @param msg 要显示的信息
|
||||||
|
*/
|
||||||
|
public static void showLong(String msg){
|
||||||
|
buildToast(MApplication.gainContext(),msg,Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弹出较短时间提示信息
|
||||||
|
* @param context 上下文对象
|
||||||
|
* @param msg 要显示的信息
|
||||||
|
*/
|
||||||
|
public static void showShort(Context context, String msg){
|
||||||
|
buildToast(context,msg,Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弹出较短时间提示信息
|
||||||
|
* @param msg 要显示的信息
|
||||||
|
*/
|
||||||
|
public static void showShort(String msg){
|
||||||
|
buildToast(MApplication.gainContext(),msg,Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造Toast
|
||||||
|
* @param context 上下文
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static Toast buildToast(Context context,String msg,int duration){
|
||||||
|
return buildToast(context,msg,duration,"#d83636",16);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造Toast
|
||||||
|
* @param context 上下文
|
||||||
|
* @param msg 消息
|
||||||
|
* @param duration 显示时间
|
||||||
|
* @param bgColor 背景颜色
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Toast buildToast(Context context,String msg,int duration,String bgColor){
|
||||||
|
return buildToast(context,msg,duration,bgColor,16);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造Toast
|
||||||
|
* @param context 上下文
|
||||||
|
* @param msg 消息
|
||||||
|
* @param duration 显示时间
|
||||||
|
* @param bgColor 背景颜色
|
||||||
|
* @param textSp 文字大小
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Toast buildToast(Context context,String msg,int duration,String bgColor,int textSp){
|
||||||
|
return buildToast(context,msg,duration,bgColor,textSp,10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造Toast
|
||||||
|
* @param context 上下文
|
||||||
|
* @param msg 消息
|
||||||
|
* @param duration 显示时间
|
||||||
|
* @param bgColor 背景颜色
|
||||||
|
* @param textSp 文字大小
|
||||||
|
* @param cornerRadius 四边圆角弧度
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@SuppressLint("NewApi")
|
||||||
|
public static Toast buildToast(Context context,String msg,int duration,String bgColor,int textSp,int cornerRadius){
|
||||||
|
mHandler.removeCallbacks(r);
|
||||||
|
|
||||||
|
if(null == mToast){
|
||||||
|
//构建Toast
|
||||||
|
mToast = Toast.makeText(context, null, duration);
|
||||||
|
mToast.setGravity(Gravity.CENTER, 0, 0);
|
||||||
|
//取消toast
|
||||||
|
mHandler.postDelayed(r, duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置Toast文字
|
||||||
|
TextView tv = new TextView(context);
|
||||||
|
int dpPadding = ToolUnit.dipTopx(10);
|
||||||
|
tv.setPadding(dpPadding, dpPadding, dpPadding, dpPadding);
|
||||||
|
tv.setGravity(Gravity.CENTER);
|
||||||
|
tv.setText(msg);
|
||||||
|
tv.setTextColor(Color.WHITE);
|
||||||
|
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSp);
|
||||||
|
|
||||||
|
//Toast文字TextView容器
|
||||||
|
LinearLayout mLayout = new LinearLayout(context);
|
||||||
|
GradientDrawable shape = new GradientDrawable();
|
||||||
|
shape.setColor(Color.parseColor(bgColor));
|
||||||
|
shape.setCornerRadius(cornerRadius);
|
||||||
|
shape.setStroke(1, Color.parseColor(bgColor));
|
||||||
|
shape.setAlpha(180);
|
||||||
|
mLayout.setBackground(shape);
|
||||||
|
mLayout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
|
||||||
|
//设置layout_gravity
|
||||||
|
params.gravity = Gravity.CENTER;
|
||||||
|
mLayout.setLayoutParams(params);
|
||||||
|
//设置gravity
|
||||||
|
mLayout.setGravity(Gravity.CENTER);
|
||||||
|
mLayout.addView(tv);
|
||||||
|
|
||||||
|
//将自定义View覆盖Toast的View
|
||||||
|
mToast.setView(mLayout);
|
||||||
|
|
||||||
|
return mToast;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
|
||||||
|
import com.zftlive.android.model.SysEnv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单位换算工具类
|
||||||
|
* @author 曾繁添<br>
|
||||||
|
* px :像素 <br>
|
||||||
|
in :英寸<br>
|
||||||
|
mm :毫米<br>
|
||||||
|
pt :磅,1/72 英寸<br>
|
||||||
|
dp :一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px<br>
|
||||||
|
dip :等同于dp<br>
|
||||||
|
sp :同dp相似,但还会根据用户的字体大小偏好来缩放。<br>
|
||||||
|
建议使用sp作为文本的单位,其它用dip<br>
|
||||||
|
布局时尽量使用单位dip,少使用px <br>
|
||||||
|
*/
|
||||||
|
public class ToolUnit {
|
||||||
|
|
||||||
|
/**设备显示材质**/
|
||||||
|
private static DisplayMetrics mDisplayMetrics = SysEnv.getDisplayMetrics();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sp转换px
|
||||||
|
* @param spValue sp数值
|
||||||
|
* @return px数值
|
||||||
|
*/
|
||||||
|
public static int spTopx(float spValue) {
|
||||||
|
return (int) (spValue * mDisplayMetrics.scaledDensity + 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* px转换sp
|
||||||
|
* @param pxValue px数值
|
||||||
|
* @return sp数值
|
||||||
|
*/
|
||||||
|
public static int pxTosp(float pxValue) {
|
||||||
|
return (int) (pxValue / mDisplayMetrics.scaledDensity + 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dip转换px
|
||||||
|
* @param dipValue dip数值
|
||||||
|
* @return px数值
|
||||||
|
*/
|
||||||
|
public static int dipTopx(int dipValue) {
|
||||||
|
return (int) (dipValue * mDisplayMetrics.density + 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* px转换dip
|
||||||
|
* @param pxValue px数值
|
||||||
|
* @return dip数值
|
||||||
|
*/
|
||||||
|
public static int pxTodip(float pxValue) {
|
||||||
|
return (int) (pxValue / mDisplayMetrics.density + 0.5f);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,306 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.Chat;
|
||||||
|
import org.jivesoftware.smack.ChatManagerListener;
|
||||||
|
import org.jivesoftware.smack.ConnectionConfiguration;
|
||||||
|
import org.jivesoftware.smack.MessageListener;
|
||||||
|
import org.jivesoftware.smack.Roster;
|
||||||
|
import org.jivesoftware.smack.RosterEntry;
|
||||||
|
import org.jivesoftware.smack.XMPPConnection;
|
||||||
|
import org.jivesoftware.smack.packet.Message;
|
||||||
|
import org.jivesoftware.smack.packet.Packet;
|
||||||
|
import org.jivesoftware.smack.packet.Presence;
|
||||||
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XMPP工具类
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class ToolXMPP {
|
||||||
|
|
||||||
|
private static ToolXMPP mToolXMPP = null;
|
||||||
|
private static XMPPConnection connection = null;
|
||||||
|
/**聊天窗口管理map集合**/
|
||||||
|
private Map<String, Chat> chatManage = new HashMap<String, Chat>();
|
||||||
|
|
||||||
|
|
||||||
|
private ToolXMPP() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对外公开的实例化接口
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static ToolXMPP newInstance(String address,int port){
|
||||||
|
try {
|
||||||
|
if(mToolXMPP == null){
|
||||||
|
mToolXMPP = new ToolXMPP();
|
||||||
|
ConnectionConfiguration config = new ConnectionConfiguration(address,port);
|
||||||
|
/** 是否启用调试 */
|
||||||
|
config.setDebuggerEnabled(true);
|
||||||
|
connection = new XMPPConnection(config);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("创建XMMPP失败,原因:"+e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return mToolXMPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Openfire连接
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static XMPPConnection getConnection(){
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接服务器
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean connect() {
|
||||||
|
try {
|
||||||
|
if(null != connection){
|
||||||
|
connection.connect();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 断开连接
|
||||||
|
*/
|
||||||
|
public void disConnect() {
|
||||||
|
if(null != connection){
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录
|
||||||
|
*
|
||||||
|
* @param username 登录帐号
|
||||||
|
* @param pswd 登录密码
|
||||||
|
* @return 是否登录成功
|
||||||
|
*/
|
||||||
|
public boolean login(String username, String pswd) {
|
||||||
|
try {
|
||||||
|
if (connection == null) return false;
|
||||||
|
connection.login(username, pswd);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取或创建聊天窗口
|
||||||
|
* @param friend 好友名
|
||||||
|
* @param listenter 聊天监听器
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Chat getFriendChat(String friend, MessageListener listenter) {
|
||||||
|
if(getConnection()==null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
/** 判断是否创建聊天窗口 */
|
||||||
|
for (String fristr : chatManage.keySet()) {
|
||||||
|
if (fristr.equals(friend)) {
|
||||||
|
// 存在聊天窗口,则返回对应聊天窗口
|
||||||
|
return chatManage.get(fristr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/** 创建聊天窗口 */
|
||||||
|
Chat chat = getConnection().getChatManager().createChat(friend + "@"+getConnection().getServiceName(), listenter);
|
||||||
|
|
||||||
|
/** 添加聊天窗口到chatManage */
|
||||||
|
chatManage.put(friend, chat);
|
||||||
|
|
||||||
|
return chat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建聊天会话
|
||||||
|
* @param toUser 聊天对象id
|
||||||
|
* @param domain 域
|
||||||
|
*/
|
||||||
|
public Chat createChat(String toUser,String domain){
|
||||||
|
Chat mChat = connection.getChatManager().createChat(toUser+domain,mMessageListener);
|
||||||
|
return mChat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息
|
||||||
|
* @param strMsg 消息内容
|
||||||
|
*/
|
||||||
|
public void sendMessage(Chat chat,String strMsg){
|
||||||
|
try {
|
||||||
|
//发送消息
|
||||||
|
chat.sendMessage(strMsg);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改密码
|
||||||
|
* @param newPswd 新密码
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
public static boolean changePassword(String newPswd)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
connection.getAccountManager().changePassword(newPswd);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置用户状态
|
||||||
|
*/
|
||||||
|
public void setPresence(int code) {
|
||||||
|
if (connection == null)
|
||||||
|
return;
|
||||||
|
Presence presence;
|
||||||
|
switch (code) {
|
||||||
|
case 0:
|
||||||
|
presence = new Presence(Presence.Type.available);
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
Log.v("state", "设置在线");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
presence = new Presence(Presence.Type.available);
|
||||||
|
presence.setMode(Presence.Mode.chat);
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
Log.v("state", "设置Q我吧");
|
||||||
|
System.out.println(presence.toXML());
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
presence = new Presence(Presence.Type.available);
|
||||||
|
presence.setMode(Presence.Mode.dnd);
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
Log.v("state", "设置忙碌");
|
||||||
|
System.out.println(presence.toXML());
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
presence = new Presence(Presence.Type.available);
|
||||||
|
presence.setMode(Presence.Mode.away);
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
Log.v("state", "设置离开");
|
||||||
|
System.out.println(presence.toXML());
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
Roster roster = connection.getRoster();
|
||||||
|
Collection<RosterEntry> entries = roster.getEntries();
|
||||||
|
for (RosterEntry entry : entries) {
|
||||||
|
presence = new Presence(Presence.Type.unavailable);
|
||||||
|
presence.setPacketID(Packet.ID_NOT_AVAILABLE);
|
||||||
|
presence.setFrom(connection.getUser());
|
||||||
|
presence.setTo(entry.getUser());
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
System.out.println(presence.toXML());
|
||||||
|
}
|
||||||
|
// 向同一用户的其他客户端发送隐身状态
|
||||||
|
presence = new Presence(Presence.Type.unavailable);
|
||||||
|
presence.setPacketID(Packet.ID_NOT_AVAILABLE);
|
||||||
|
presence.setFrom(connection.getUser());
|
||||||
|
presence.setTo(StringUtils.parseBareAddress(connection.getUser()));
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
Log.v("state", "设置隐身");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
presence = new Presence(Presence.Type.unavailable);
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
Log.v("state", "设置离线");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除当前用户
|
||||||
|
* @param connection
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean deleteAccount()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
connection.getAccountManager().deleteAccount();
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退出
|
||||||
|
*/
|
||||||
|
public void exit() {
|
||||||
|
// 状态
|
||||||
|
Presence presence = new Presence(Presence.Type.unavailable);
|
||||||
|
connection.sendPacket(presence);
|
||||||
|
//断开连接
|
||||||
|
disConnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息监听器
|
||||||
|
*/
|
||||||
|
public MessageListener mMessageListener = new MessageListener(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processMessage(Chat arg0, Message msg) {
|
||||||
|
Log.i("ToolXMPP", "from="+msg.getFrom() + "to="+msg.getTo() + "body="+msg.getBody() + "subject="+msg.getSubject());
|
||||||
|
|
||||||
|
//登录用户
|
||||||
|
StringUtils.parseName(getConnection().getUser());
|
||||||
|
//发送消息用户
|
||||||
|
msg.getFrom();
|
||||||
|
//消息内容
|
||||||
|
String body = msg.getBody();
|
||||||
|
boolean left = body.substring(0, 1).equals("{");
|
||||||
|
boolean right = body.substring(body.length()-1, body.length()).equals("}");
|
||||||
|
if(left&&right){
|
||||||
|
try {
|
||||||
|
JSONObject obj = new JSONObject(body);
|
||||||
|
String type = obj.getString("messageType");
|
||||||
|
String chanId = obj.getString("chanId");
|
||||||
|
String chanName = obj.getString("chanName");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单人聊天信息监听类
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public ChatManagerListener mChatManagerListener = new ChatManagerListener(){
|
||||||
|
|
||||||
|
public void chatCreated(Chat chat, boolean arg1)
|
||||||
|
{
|
||||||
|
chat.addMessageListener(mMessageListener);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package com.zftlive.android.tools;
|
||||||
|
|
||||||
|
import com.thoughtworks.xstream.XStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* XML工具类
|
||||||
|
* @author 曾繁添
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ToolXml {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* java 转换成xml
|
||||||
|
*
|
||||||
|
* @Title: toXml
|
||||||
|
* @Description: 将JavaBean转成XML
|
||||||
|
* @param bean 对象实例
|
||||||
|
* @return String xml字符串
|
||||||
|
*/
|
||||||
|
public static String toXml(Object bean) {
|
||||||
|
XStream xstream = new XStream();
|
||||||
|
xstream.processAnnotations(bean.getClass());
|
||||||
|
return xstream.toXML(bean);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将传入xml文本转换成Java对象
|
||||||
|
* @param xml
|
||||||
|
* @param bean xml对应的class类
|
||||||
|
* @return T xml对应的class类的实例对象 调用的方法实例:
|
||||||
|
* PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
|
||||||
|
*/
|
||||||
|
public static <T> T toBean(String xml, Class<T> bean) {
|
||||||
|
XStream xstream = new XStream();
|
||||||
|
xstream.processAnnotations(bean);
|
||||||
|
T obj = (T) xstream.fromXML(xml);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.zftlive.android.view;
|
||||||
|
|
||||||
|
import com.zftlive.android.MApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义View需要用到的常量、方法
|
||||||
|
* @author 曾繁添
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IView {
|
||||||
|
|
||||||
|
/**应用的包名称**/
|
||||||
|
String PACKAGE_NAME = MApplication.gainContext().getPackageName();
|
||||||
|
|
||||||
|
/***资源类型-array**/
|
||||||
|
String ARRAY = "array";
|
||||||
|
|
||||||
|
/***资源类型-attr**/
|
||||||
|
String ATTR = "attr";
|
||||||
|
|
||||||
|
/***资源类型-bool**/
|
||||||
|
String BOOL = "bool";
|
||||||
|
|
||||||
|
/***资源类型-color**/
|
||||||
|
String COLOR = "color";
|
||||||
|
|
||||||
|
/***资源类型-dimen**/
|
||||||
|
String DIMEN = "dimen";
|
||||||
|
|
||||||
|
/***资源类型-drawable**/
|
||||||
|
String DRAWABLE = "drawable";
|
||||||
|
|
||||||
|
/***资源类型-id**/
|
||||||
|
String ID = "id";
|
||||||
|
|
||||||
|
/***资源类型-id**/
|
||||||
|
String INTEGER = "integer";
|
||||||
|
|
||||||
|
/***资源类型-layout**/
|
||||||
|
String LAYOUT = "layout";
|
||||||
|
|
||||||
|
/***资源类型-drawable**/
|
||||||
|
String STRING = "string";
|
||||||
|
|
||||||
|
/***资源类型-style**/
|
||||||
|
String STYLE = "style";
|
||||||
|
|
||||||
|
/***资源类型-styleable**/
|
||||||
|
String STYLEABLE = "styleable";
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,254 @@
|
||||||
|
package com.zftlive.android.widget;
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.PixelFormat;
|
||||||
|
import android.graphics.drawable.GradientDrawable;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义时长的Toast
|
||||||
|
* @author 曾繁添
|
||||||
|
* @version 1.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MyToast {
|
||||||
|
|
||||||
|
public static MyToast makeText(Context context, CharSequence text, int duration)
|
||||||
|
{
|
||||||
|
MyToast result = new MyToast(context);
|
||||||
|
|
||||||
|
LinearLayout mLayout=new LinearLayout(context);
|
||||||
|
TextView tv = new TextView(context);
|
||||||
|
tv.setText(text);
|
||||||
|
tv.setTextColor(Color.WHITE);
|
||||||
|
tv.setGravity(Gravity.CENTER);
|
||||||
|
|
||||||
|
GradientDrawable shape = new GradientDrawable();
|
||||||
|
shape.setColor(Color.parseColor("#FF6666"));
|
||||||
|
shape.setCornerRadius(0.9f);
|
||||||
|
shape.setStroke(1, Color.parseColor("#FF6666"));
|
||||||
|
shape.setAlpha(180);
|
||||||
|
mLayout.setBackground(shape);
|
||||||
|
|
||||||
|
int w=context.getResources().getDisplayMetrics().widthPixels / 2;
|
||||||
|
int h=context.getResources().getDisplayMetrics().widthPixels / 10;
|
||||||
|
mLayout.addView(tv, w, h);
|
||||||
|
result.mNextView = mLayout;
|
||||||
|
result.mDuration = duration;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int LENGTH_SHORT = 2000;
|
||||||
|
public static final int LENGTH_LONG = 3500;
|
||||||
|
|
||||||
|
private final Handler mHandler = new Handler();
|
||||||
|
private int mDuration=LENGTH_SHORT;
|
||||||
|
private int mGravity = Gravity.CENTER;
|
||||||
|
private int mX, mY;
|
||||||
|
private float mHorizontalMargin;
|
||||||
|
private float mVerticalMargin;
|
||||||
|
private View mView;
|
||||||
|
private View mNextView;
|
||||||
|
|
||||||
|
private WindowManager mWM;
|
||||||
|
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
|
||||||
|
|
||||||
|
|
||||||
|
public MyToast(Context context) {
|
||||||
|
init(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the view to show.
|
||||||
|
* @see #getView
|
||||||
|
*/
|
||||||
|
public void setView(View view) {
|
||||||
|
mNextView = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the view.
|
||||||
|
* @see #setView
|
||||||
|
*/
|
||||||
|
public View getView() {
|
||||||
|
return mNextView;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set how long to show the view for.
|
||||||
|
* @see #LENGTH_SHORT
|
||||||
|
* @see #LENGTH_LONG
|
||||||
|
*/
|
||||||
|
public void setDuration(int duration) {
|
||||||
|
mDuration = duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the duration.
|
||||||
|
* @see #setDuration
|
||||||
|
*/
|
||||||
|
public int getDuration() {
|
||||||
|
return mDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the margins of the view.
|
||||||
|
*
|
||||||
|
* @param horizontalMargin The horizontal margin, in percentage of the
|
||||||
|
* container width, between the container's edges and the
|
||||||
|
* notification
|
||||||
|
* @param verticalMargin The vertical margin, in percentage of the
|
||||||
|
* container height, between the container's edges and the
|
||||||
|
* notification
|
||||||
|
*/
|
||||||
|
public void setMargin(float horizontalMargin, float verticalMargin) {
|
||||||
|
mHorizontalMargin = horizontalMargin;
|
||||||
|
mVerticalMargin = verticalMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the horizontal margin.
|
||||||
|
*/
|
||||||
|
public float getHorizontalMargin() {
|
||||||
|
return mHorizontalMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the vertical margin.
|
||||||
|
*/
|
||||||
|
public float getVerticalMargin() {
|
||||||
|
return mVerticalMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the location at which the notification should appear on the screen.
|
||||||
|
* @see android.view.Gravity
|
||||||
|
* @see #getGravity
|
||||||
|
*/
|
||||||
|
public void setGravity(int gravity, int xOffset, int yOffset) {
|
||||||
|
mGravity = gravity;
|
||||||
|
mX = xOffset;
|
||||||
|
mY = yOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the location at which the notification should appear on the screen.
|
||||||
|
* @see android.view.Gravity
|
||||||
|
* @see #getGravity
|
||||||
|
*/
|
||||||
|
public int getGravity() {
|
||||||
|
return mGravity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the X offset in pixels to apply to the gravity's location.
|
||||||
|
*/
|
||||||
|
public int getXOffset() {
|
||||||
|
return mX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the Y offset in pixels to apply to the gravity's location.
|
||||||
|
*/
|
||||||
|
public int getYOffset() {
|
||||||
|
return mY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* schedule handleShow into the right thread
|
||||||
|
*/
|
||||||
|
public void show() {
|
||||||
|
mHandler.post(mShow);
|
||||||
|
|
||||||
|
if(mDuration>0)
|
||||||
|
{
|
||||||
|
mHandler.postDelayed(mHide, mDuration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* schedule handleHide into the right thread
|
||||||
|
*/
|
||||||
|
public void hide() {
|
||||||
|
mHandler.post(mHide);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Runnable mShow = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
handleShow();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final Runnable mHide = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
handleHide();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private void init(Context context)
|
||||||
|
{
|
||||||
|
final WindowManager.LayoutParams params = mParams;
|
||||||
|
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||||
|
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||||
|
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||||
|
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
|
||||||
|
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
|
||||||
|
params.format = PixelFormat.TRANSLUCENT;
|
||||||
|
params.windowAnimations = android.R.style.Animation_Toast;
|
||||||
|
params.type = WindowManager.LayoutParams.TYPE_TOAST;
|
||||||
|
params.setTitle("Toast");
|
||||||
|
|
||||||
|
mWM = (WindowManager) context.getApplicationContext()
|
||||||
|
.getSystemService(Context.WINDOW_SERVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void handleShow() {
|
||||||
|
|
||||||
|
if (mView != mNextView) {
|
||||||
|
// remove the old view if necessary
|
||||||
|
handleHide();
|
||||||
|
mView = mNextView;
|
||||||
|
// mWM = WindowManagerImpl.getDefault();
|
||||||
|
final int gravity = mGravity;
|
||||||
|
mParams.gravity = gravity;
|
||||||
|
if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL)
|
||||||
|
{
|
||||||
|
mParams.horizontalWeight = 1.0f;
|
||||||
|
}
|
||||||
|
if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL)
|
||||||
|
{
|
||||||
|
mParams.verticalWeight = 1.0f;
|
||||||
|
}
|
||||||
|
mParams.x = mX;
|
||||||
|
mParams.y = mY;
|
||||||
|
mParams.verticalMargin = mVerticalMargin;
|
||||||
|
mParams.horizontalMargin = mHorizontalMargin;
|
||||||
|
if (mView.getParent() != null)
|
||||||
|
{
|
||||||
|
mWM.removeView(mView);
|
||||||
|
}
|
||||||
|
mWM.addView(mView, mParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleHide()
|
||||||
|
{
|
||||||
|
if (mView != null)
|
||||||
|
{
|
||||||
|
if (mView.getParent() != null)
|
||||||
|
{
|
||||||
|
mWM.removeView(mView);
|
||||||
|
}
|
||||||
|
mView = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue