文章目录
三种Toast(Toasty、tastytoast、supertoasts)
if(id == R.id.toast){
/**
* 常规Toast
*/
Tools.showToast(context,"点击次数:"+(toastInt++)+" 次");
}else if(id == R.id.Toasty){
/**
* implementation 'com.github.GrenderG:Toasty:1.5.2'
*/
//https://gitcode.com/GrenderG/Toasty/overview?utm_source=csdn_github_accelerator&isLogin=1
Toasty.success(context, "点击次数:"+(toastInt++)+" 次", Toast.LENGTH_SHORT, true).show();
}else if(id == R.id.TastyToast){
/**
* implementation 'com.sdsmdg.tastytoast:tastytoast:0.1.1'
*/
//https://github.com/yadav-rahul/TastyToast
TastyToast.makeText(context,"点击次数:"+(toastInt++)+" 次",TastyToast.LENGTH_LONG,TastyToast.SUCCESS);
}else if (id == R.id.SuperActivityToast){
/**
* implementation 'com.github.johnpersano:supertoasts:2.0'
*/
//https://github.com/JohnPersano/SuperToasts
SuperActivityToast.create(context, new Style(), Style.TYPE_BUTTON)
.setButtonText("UNDO")
.setButtonIconResource(R.mipmap.ic_launcher)
.setOnButtonClickListener("good_tag_name", null, new SuperActivityToast.OnButtonClickListener() {
@Override
public void onClick(View view, Parcelable token) {
Log.e("mylog","点击了 Toast");
}
})
.setProgressBarColor(Color.WHITE)
.setText("Email deleted")
.setDuration(Style.DURATION_LONG)
.setFrame(Style.FRAME_LOLLIPOP)
.setColor(PaletteUtils.getSolidColor(PaletteUtils.MATERIAL_PURPLE))
.setAnimations(Style.ANIMATIONS_POP).show();
}
日志封装类-MyLog
是对android log的封装,封装后 可以设置显示级别
/**
* Log的封装类,方便开启和关闭log
*/
public class MyLog {
public static final int VERBOSE = 1;
public static final int DEBUG = 2;
public static final int INFO = 3;
public static final int WARN = 4;
public static final int ERROR = 5;
public static final int NOTHING = 6;
public static final int level = VERBOSE; //设置显示级别
public static final String MYLOG_PATH_SDCARD_DIR = "/sdcard/ScanZbar/log";// 日志文件在sdcard中的路径
public static final String MY_LOG_FILE_NAME = "Log.txt";// 本类输出的日志文件名称
public static void v(String tag, String msg){
if(level <= VERBOSE)
Log.v(tag,msg);
}
public static void d(String tag, String msg){
if(level <= DEBUG)
Log.d(tag,msg);
}
public static void i(String tag, String msg){
if(level <= INFO)
Log.i(tag,msg);
}
public static void w(String tag, String msg){
if(level <= WARN)
Log.w(tag,msg);
}
public static void e(String tag, String msg){
if(level <= ERROR)
Log.e(tag,msg);
}
//调用该方法,可以将日志写入日志文件
public static void Loge(String tag, String msg){
if(LEVEL <= ERROR) {
Log.e(tag, msg);
writeLogtoFile("ERROR",tag,msg);
}
}
/**
* 打开日志文件并写入日志
* @param mylogtype
* @param tag
* @param text
*/
private static void writeLogtoFile(String mylogtype, String tag, String text) {// 新建或打开日志文件
Date nowtime = new Date();
String needWriteFiel = new SimpleDateFormat(TimeUtil.SDF3).format(nowtime);
String needWriteMessage = new SimpleDateFormat(TimeUtil.SDF1).format(nowtime) + " " + mylogtype + " " + tag + " " + text;
File dirPath = Environment.getExternalStorageDirectory();
File dirsFile = new File(MYLOG_PATH_SDCARD_DIR);
if (!dirsFile.exists()){
dirsFile.mkdirs();
}
//创建日志文件
File file = new File(dirsFile.toString(), needWriteFiel +".txt");// MYLOG_PATH_SDCARD_DIR
if (!file.exists()) {
try {
//在指定的文件夹中创建文件
boolean creatB = file.createNewFile();
if(!creatB)
MyLog.e("mylog","创建日志文件失败!");
} catch (Exception e) {
e.printStackTrace();
}
}
try(FileWriter filerWriter = new FileWriter(file, true);// 后面这个参数代表是不是要接上文件中原来的数据,不进行覆盖
BufferedWriter bufWriter = new BufferedWriter(filerWriter)) {
bufWriter.write(needWriteMessage);
bufWriter.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用
使用和正常log使用一样
MyLog.e("mylog","123");
MyLog.i("mylog","222");
...
线程封装类-LocalThreadPools
针对AsyncTask被弃用的替代
/**
* @Description TODO(全局使用的线程池)
*/
public class LocalThreadPools {
private static int threadNum = 0;
private static String TAG = LocalThreadPools.class.getSimpleName();
private static ExecutorService THREAD_POOL_EXECUTOR;
/**
* CPU数量
*/
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
/**
* 线程池数量
*/
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT-1,4));
/**
* 最大线程数量 = CPU数量*2+1
*/
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2+1;
/**
* 等待线程存活时间
*/
private static final int KEEP_ALIVE_SECONDS = 60;
/**
* 等待线程存活时间的单位
*/
private static final TimeUnit unit = TimeUnit.MINUTES;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<>(8);
/**
* 线程工厂
*/
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
threadNum++;
MyLog.e("mylog","线程工厂创建一个线程:"+threadNum+","+mCount.getAndIncrement());
return new Thread(r, "MangoTask #" + mCount.getAndIncrement());
}
};
private void initThreadPool() {
MyLog.e("mylog","core_pool_size:"+CORE_POOL_SIZE+",maximum_pool_size:"+MAXIMUM_POOL_SIZE+"," +
"KEEP_ALIVE_SECONDS:"+KEEP_ALIVE_SECONDS+",");
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, unit,
sPoolWorkQueue, sThreadFactory,new RejectedHandler()){
@Override
public void execute(Runnable command) {
super.execute(command);
MyLog.e("mylog","-----------ActiveCount="+getActiveCount());
MyLog.e("mylog","-----------PoolSize="+getPoolSize());
MyLog.e("mylog","-----------Queue="+getQueue().size());
MyLog.e("mylog","-----------finish="+getCompletedTaskCount());
}
};
//允许核心线程空闲超时时被回收
threadPoolExecutor.allowCoreThreadTimeOut(true);
THREAD_POOL_EXECUTOR = threadPoolExecutor;
}
private class RejectedHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
//可在这里做一些提示用户的操作
Tools.showToast(mContext.get(),"当前执行的任务过多,请稍后再试");
}
}
private WeakReference<Context> mContext;
private static LocalThreadPools instance;
private LocalThreadPools(Context context){
mContext = new WeakReference<>(context);
initThreadPool();
}
public static LocalThreadPools getInstance(Context context){
if (instance == null) {
instance = new LocalThreadPools(context);
}
return instance;
}
public void execute(Runnable command){
THREAD_POOL_EXECUTOR.execute(command);
}
/**
* 通过interrupt方法尝试停止正在执行的任务,但是不保证真的终止正在执行的任务
* 停止队列中处于等待的任务的执行
* 不再接收新的任务
* @return 等待执行的任务列表
*/
public static List<Runnable> shutdownNow(){
return THREAD_POOL_EXECUTOR.shutdownNow();
}
/**
* 停止队列中处于等待的任务
* 不再接收新的任务
* 已经执行的任务会继续执行
* 如果任务已经执行完了没有必要再调用这个方法
*/
public void shutDown(){
THREAD_POOL_EXECUTOR.shutdown();
sPoolWorkQueue.clear();
}
}
使用
LocalThreadPools.getInstance((TestActivity) mView).execute(new Runnable() {
@Override
public void run() {
//异步操作
}
});
自定义等待框-WaitDialog
布局文件
1、布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_loading_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<LinearLayout
android:layout_width="150dp"
android:layout_height="110dp"
android:background="@mipmap/loading_bg"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="10dp"
android:paddingLeft="21dp"
android:paddingRight="21dp"
android:paddingTop="10dp">
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_horizontal"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/dialog_loading"
android:indeterminateOnly="true" />
<TextView
android:id="@+id/tipTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="加载中..."
android:textColor="#f0f0f0"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
2、Drawable
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/dialog_loading_img"
android:pivotX="50%"
android:pivotY="50%" />
<!-- 下面是转圈的
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/dialog_loading_img2"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
-->
3、资源
背景图片资源 提取码:swey
自定义类
package com.kaiya.mvp.npm_ar.utils;
import android.app.Dialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.kaiya.mvp.npm_ar.R;
public class WaitDialog extends Dialog {
public WaitDialog(Context context){
super(context);
}
public WaitDialog(Context context, int themeResId){
super(context,themeResId);
}
public static class Builder{
private Context context;
private String message;
private boolean isShowMessage=true;
private boolean isCancelable=false;
private boolean isCancelOutside=false;
public Builder(Context context) {
this.context = context;
}
/**
* 设置提示信息
* @param message
* @return
*/
public Builder setMessage(String message){
this.message=message;
return this;
}
/**
* 设置是否显示提示信息
* @param isShowMessage
* @return
*/
public Builder setShowMessage(boolean isShowMessage){
this.isShowMessage=isShowMessage;
return this;
}
/**
* 设置是否可以按返回键取消
* @param isCancelable
* @return
*/
public Builder setCancelable(boolean isCancelable){
this.isCancelable=isCancelable;
return this;
}
/**
* 设置是否可以取消
* @param isCancelOutside
* @return
*/
public Builder setCancelOutside(boolean isCancelOutside){
this.isCancelOutside=isCancelOutside;
return this;
}
public WaitDialog create(){
LayoutInflater inflater = LayoutInflater.from(context);
View view=inflater.inflate(R.layout.dialog,null);
WaitDialog waitDialog=new WaitDialog(context, R.style.MyDialogStyle);
TextView msgText= view.findViewById(R.id.tipTextView);
if(isShowMessage){
msgText.setText(message);
}else{
msgText.setVisibility(View.GONE);
}
waitDialog.setContentView(view);
waitDialog.setCancelable(isCancelable);
waitDialog.setCanceledOnTouchOutside(isCancelOutside);
return waitDialog;
}
}
}
样式
<!-- 等待框样式 -->
<style name="MyDialogStyle">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
调用
public static void showWaitDialog(Context context, String str){
WaitDialog.Builder builder = new WaitDialog.Builder(context)
.setMessage(str)
.setCancelable(false);
waitDialog = builder.create();
waitDialog.show();
}
public static void hideWaitDialog(){
if(waitDialog != null) {
waitDialog.dismiss();
}
}
自定义进度条-LoadProgressbar
自定义进度条
/**
* 进度条
*/
public class DownLoadProgressbar extends View {
private Paint paint = new Paint(); // 绘制背景灰色线条画笔
private Paint paintText = new Paint(); // 绘制下载进度画笔
private float offset = 0f; // 下载偏移量
private float maxvalue = 0f; // 进度的总大小
private float currentValue = 0f; // 当前进度
private Rect mBound = new Rect(); // 获取百分比数字的长宽
private String percentValue = "0%"; // 要显示的现在百分比
private float offsetRight = 0f; // 灰色线条距离右边的距离
private int textSize = SizeUtils.sp2px(25); // 百分比的文字大小
private float offsetTop = SizeUtils.dp2px(18); // 距离顶部的偏移量
public DownLoadProgressbar(Context context) {
this(context, null);
}
public DownLoadProgressbar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DownLoadProgressbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
getTextWidth();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制底色
paint.setColor(Color.parseColor("#eeeeee"));
paint.setStrokeWidth(SizeUtils.dp2px(10));
canvas.drawLine(0, offsetTop, getWidth() - offsetRight, offsetTop, paint);
// 绘制进度条颜色
paint.setColor(Color.parseColor("#ff0000"));
paint.setStrokeWidth(SizeUtils.dp2px(11));
canvas.drawLine(0, offsetTop, offset, offsetTop, paint);
paint.setColor(Color.parseColor("#ffffff"));
paint.setStrokeWidth(SizeUtils.dp2px(1));
paintText.setColor(Color.parseColor("#ffffff"));
paintText.setTextSize(textSize);
paintText.setAntiAlias(true);
paintText.getTextBounds(percentValue, 0, percentValue.length(), mBound);
canvas.drawLine(offset, offsetTop, offset + mBound.width() + SizeUtils.dp2px(4), offsetTop, paint);
canvas.drawText(percentValue, offset, offsetTop + mBound.height() / 2 - SizeUtils.dp2px(2), paintText);
}
public void setCurrentValue(float currentValue) {
this.currentValue = currentValue;
int value = (int) (currentValue * 100 / maxvalue);
if (value < 100 && value > 0) {
percentValue = value + "%";
} else if (value <= 0) {
percentValue = "0%";
} else {
percentValue = "100%";
}
calc();
invalidate();
}
private void calc() {
if (currentValue < maxvalue) {
offset = (getWidth() - offsetRight) * currentValue / maxvalue;
} else {
offset = getWidth() - offsetRight;
}
}
/**
* 设置最大值
*
* @param maxValue
*/
public void setMaxvalue(int maxValue) {
this.maxvalue = maxValue;
}
/**
* 获取“100%”的宽度
*/
public void getTextWidth() {
Paint paint = new Paint();
Rect rect = new Rect();
paint.setTextSize(textSize);
paint.setAntiAlias(true);
paint.getTextBounds("100%", 0, "100%".length(), rect);
offsetRight = rect.width() + SizeUtils.dp2px(5);;
}
}
解压缩类-ZipUtils
解压缩
/**
* 解压缩zip文件
*/
public class ZipUtils {
public ZipUtils() {
}
/**
* 根据byte数组,生成文件
*/
public static void getFile(byte[] bfile, String filePath, String fileName) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try {
File dir = new File(filePath);
if (!dir.exists()) {//判断文件目录是否存在
dir.mkdirs();
}
file = new File(filePath + fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bfile);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
// 使用密码解压(图片不加密)
public static boolean unZipFile1(String zipFileFullName, String filePath, String password) {
try {
ZipFile zipFile = new ZipFile(zipFileFullName);
// 如果解压需要密码
if (zipFile.isEncrypted()) {
zipFile.setPassword(password);
}
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
zipFile.extractAll(filePath);//提取所有文件
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// 使用密码解压
public static boolean unZipFile(String zipFileFullName, String filePath, String password) {
try {
ZipFile zipFile = new ZipFile(zipFileFullName);
// 如果解压需要密码
if (zipFile.isEncrypted()) {
zipFile.setPassword(password);
}
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
zipFile.extractAll(filePath);//提取所有文件
// 压缩
ZipFolder(filePath, filePath + "01");
// 解压
ZipUtils.UnZipFolder(filePath + "01", filePath);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 解压zip到指定的路径
*
* @param zipFileString ZIP的名称
* @param outPathString 要解压缩路径
* @throws Exception
*/
public static void UnZipFolder(String zipFileString, String outPathString) {
ZipInputStream inZip = null;
OutputStream out = null;
try{
inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
String szName = "";
List<File> fileList = new ArrayList<File>();
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
//获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
File file = new File(outPathString + File.separator + szName);
if (!file.exists()) {
fileList.add(file);
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
// FileOutputStream out = new FileOutputStream(file);
out = AesUtil.encrypt(file, AesUtil.toKey(MyApplication.getInstance().getAESKey().getBytes()));// 加密
int len;
byte[] buffer = new byte[1024];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -1) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}
inZip.close();
// 删除目录下多余文件夹
File dirFile = new File(outPathString);
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteDirectory(files[i].getAbsolutePath());
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(inZip != null){
safeClose(inZip);
}
if(out != null){
safeClose(out);
}
}
}
public static void safeClose(OutputStream fis){
if(fis != null){
try{
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
public static void safeClose(ZipInputStream fis){
if(fis != null){
try{
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
/**
* 压缩文件和文件夹
*
* @param srcFileString 要压缩的文件或文件夹
* @param zipFileString 解压完成的Zip路径
* @throws Exception
*/
public static void ZipFolder(String srcFileString, String zipFileString) {
FileOutputStream fis = null;
ZipOutputStream outZip = null;
try{
fis = new FileOutputStream(zipFileString);
//创建ZIP
outZip = new ZipOutputStream(fis);
//创建文件
File file = new File(srcFileString);
//压缩
ZipFiles(file.getParent() + File.separator, file.getName(), outZip);
//完成和关闭
outZip.finish();
outZip.close();
fis.close();
}catch (Exception e){
e.printStackTrace();
}finally {
if(fis != null){
safeClose(fis);
}
if(outZip != null){
safeClose1(outZip);
}
}
}
public static void safeClose(FileOutputStream fis){
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void safeClose1(ZipOutputStream fis){
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 压缩文件
*
* @param folderString
* @param fileString
* @param zipOutputSteam
* @throws Exception
*/
private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam) {
FileInputStream inputStream = null;
try{
if (zipOutputSteam == null)
return;
File file = new File(folderString + fileString);
if (file.isFile()) {
ZipEntry zipEntry = new ZipEntry(fileString);
inputStream = new FileInputStream(file);
zipOutputSteam.putNextEntry(zipEntry);
int len;
byte[] buffer = new byte[4096];
while ((len = inputStream.read(buffer)) != -1) {
zipOutputSteam.write(buffer, 0, len);
}
zipOutputSteam.closeEntry();
} else {
//文件夹
String fileList[] = file.list();
//没有子文件和压缩
if (fileList.length <= 0) {
ZipEntry zipEntry = new ZipEntry(fileString + File.separator);
zipOutputSteam.putNextEntry(zipEntry);
zipOutputSteam.closeEntry();
}
//子文件和递归
for (int i = 0; i < fileList.length; i++) {
ZipFiles(folderString + fileString + "/", fileList[i], zipOutputSteam);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(inputStream != null){
safeClose(inputStream);
}
}
}
public static Bitmap getBitmap(File photoFile) {
InputStream fis = null;
try {
fis = AesUtil.decrypt(photoFile, AesUtil.toKey(MyApplication.getInstance().getAESKey().getBytes()));
return BitmapFactory.decodeStream(fis); ///把流转化为Bitmap图片
} catch (FileNotFoundException e) {
e.printStackTrace();
MyLog.e("mylog", "e1:" + e.getMessage());
return null;
} catch (Exception e) {
e.printStackTrace();
MyLog.e("mylog", "e2:" + e.getMessage());
return null;
} finally {
if(fis != null){
safeClose(fis);
}
}
}
public static void safeClose(InputStream fis){
if(fis != null){
try{
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
public static File getPhotoFile(String nonet, String fileAbsolutePath) {
File file = new File(fileAbsolutePath);
File[] subFile = file.listFiles();
if (subFile != null) {
for (int i = 0; i < subFile.length; i++) {
// 判断是否为文件夹
/*if (subFile[i].isDirectory()) {
getPhotoFile(idNonet, subFile[i].getAbsolutePath());
} else {*/
String filename = subFile[i].getName();
if (!TextUtils.isEmpty(filename) && filename.length() >= 13 && nonet != null) {
String subFilename = filename.substring(filename.length() - 13, filename.length() - 4);
// MyLog.e("mylog", "subFilename:" + subFilename + " nonet:" + nonet);
if (subFilename.equals(nonet)) {
MyLog.e("mylog", "filename:" + filename);
return subFile[i];
}
}
}
}
return null;
}
/**
* @param zipName 压缩文件的路径
* @param filePath 被压缩文件的路径
* @param password 加密
* @description:压缩以及加密
* @author: renbo
* @date: 2021年5月19日 下午3:35:33
*/
public static void unZipPass(String zipName, String filePath, String password) throws ZipException {
ZipFile zipFile = new ZipFile(zipName);
ArrayList<File> filesToAdd = new ArrayList<File>();
File root = new File(filePath);
File[] files = root.listFiles();
for (File file : files) {
if (file.isDirectory()) {
filesToAdd.add(new File(file.getAbsolutePath()));
} else {
filesToAdd.add(new File(file.getAbsolutePath()));
}
}
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // set
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
// Set password
parameters.setPassword(password);
zipFile.addFiles(filesToAdd, parameters);
}
/**
* 删除单个文件
*
* @param filePath 被删除文件的文件名
* @return 文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String filePath) {
File file = new File(filePath);
if (file.isFile() && file.exists()) {
return file.delete();
}
return false;
}
/**
* 删除文件夹以及目录下的文件
*
* @param filePath 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String filePath) {
boolean flag = false;
//如果filePath不以文件分隔符结尾,自动添加文件分隔符
if (!filePath.endsWith(File.separator)) {
filePath = filePath + File.separator;
}
File dirFile = new File(filePath);
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
flag = true;
File[] files = dirFile.listFiles();
//遍历删除文件夹下的所有文件(包括子目录)
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
//删除子文件
flag = deleteFile(files[i].getAbsolutePath());
if (!flag) break;
} else {
//删除子目录
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag) break;
}
}
if (!flag) return false;
//删除当前空目录
return dirFile.delete();
}
/**
* 根据路径删除指定的目录或文件,无论存在与否
*
* @param filePath 要删除的目录或文件
* @return 删除成功返回 true,否则返回 false。
*/
public static boolean DeleteFolder(String filePath) {
File file = new File(filePath);
if (!file.exists()) {
return false;
} else {
if (file.isFile()) {
// 为文件时调用删除文件方法
return deleteFile(filePath);
} else {
// 为目录时调用删除目录方法
return deleteDirectory(filePath);
}
}
}
}
本地数据库类-MySQLiteHelper
Android 创建本地数据库
/**
* 数据库帮助类
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
private static String initSqlFile = Environment.getExternalStorageDirectory().getAbsolutePath();
private static String REALPATH = initSqlFile+ File.separator+"XXXX"; //需要创建的路径
private static String REALFILE = REALPATH + File.separator +"xxxx.db"; //需要创建的文件
private static MySQLiteHelper db;
private static final int DATEBASE_VERSION = 1; //定义版本号
public static String getRealPath(){
return REALPATH;
}
public static String getRealFile(){
return REALFILE;
}
public static void CloseDB(){
db.close();
}
//自定义构造方法,简化自动生成的构造方法,path 是主要指定创建db文件的路径
public MySQLiteHelper(Context context){
this(context,REALFILE,null,DATEBASE_VERSION);
MyLog.e("mylog","文件路径:"+REALFILE);
}
//实现接口必须实现的构造方法
public MySQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//第一次创建数据库时,才会调用
MyLog.e("mylog","创建数据库");
sqLiteDatabase.execSQL(TableA.CREAT_TABLE(TableA.TABLE_NAME())); //创建表
sqLiteDatabase.execSQL(TableB.CREAT_TABLE(TableB.TABLE_NAME())); //创建表
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
TableA对于的类
/**
* 对应数据表的类
*/
public class TableA {
public static String TABLE_NAME(){
return "table_a";
}
public static final String id = "id"; //ID
public static final String s1= "s1";//字段s1
public static final String s1= "s2";//字段s2
public static final String s1= "s3";//字段s3
public static final String s1= "s4";//字段s4
public static final String s1= "s5";//字段s5
public static final String s1= "s6";//字段s6
public static String CREAT_TABLE(String tableName){
return new StringBuffer().
append("CREATE TABLE IF NOT EXISTS ").append(tableName).
append("(").
append(id).append(" INTEGER PRIMARY KEY AUTOINCREMENT,").
append(s1).append(" TEXT,").
append(s2).append(" TEXT,").
append(s3).append(" TEXT,").
append(s4).append(" TEXT,").
append(s5).append(" TEXT,").
append(s6).append(" TEXT").
append(");").toString();
}
}
访问webservice封装-HttpUtils
对访问webservice 接口的请求封装
引入的包
implementation files('libs\\ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar')
代码
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Base64;
public class HttpUtils {
private static final String serviceNameSapce = "http://webservice.cps.xxx.com/";
private static MyApplication myApplication = MyApplication.getInstance();
private HttpUtils() {
}
// 登录
public static String login(String METHODNAME, String username, String password,String pingid) {
SoapObject request = new SoapObject(serviceNameSapce, METHODNAME);
request.addProperty("username", jiami(username));
request.addProperty("password", jiami(password));
request.addProperty("pingid",jiami(pingid));
request.addProperty("pingidly",null);
return scop(request);
}
private static String scop(SoapObject request) {
//创建SoapSerializationEnvelope 对象,同时指定soap版本号
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER10);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = false;//由于是.net开发的webservice
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransportSE = new HttpTransportSE(getURl(), 400000);
try {
httpTransportSE.call(null, envelope);//调用
} catch (IOException e) {
e.printStackTrace();
return "{\"error\":\"" + e.getMessage() + "\"}";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "{\"error\":\"" + e.getMessage() + "\"}";
}
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
return object.getProperty(0).toString();
}
public static String jiami(String str) { //加密
return AesUtil.aesEncrypt(str, MyApplication.getInstance().getAESKey());
}
public static String jiemi(String str){ //解密
return AesUtil.aesDecrypt(str,MyApplication.getInstance().getAESKey());
}
public static String getURl(){
return myApplication.getIP()+myApplication.getIP_SUFFIX();
}
}
Toolbar封装类-MaterialToolbar
布局文件
<com.google.android.material.appbar.MaterialToolbar
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:id="@+id/titlebar"
android:background="@color/primary1"
style="@style/Widget.MaterialComponents.Toolbar.Surface"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@mipmap/back"
app:title="XXXX"
app:titleTextColor="@color/white"
app:titleCentered="true"
app:titleTextAppearance="@style/Text18wb"
app:subtitle="xxxx年xx月xx日 星期x"
app:subtitleTextColor="@color/white"
app:subtitleCentered="true"
app:subtitleTextAppearance="@style/Text12w"
app:menu="@menu/scan_menu"/>
配置文件
1、input_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--showAsAction的值always一直显示,ifRoom如果有地方就显示,没有则隐藏,never一直隐藏-->
<item android:id="@+id/owner"
android:title="个人中心"
android:icon="@mipmap/owner1"
app:showAsAction="always"/>
</menu>
2、scan_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--showAsAction的值always一直显示,ifRoom如果有地方就显示,没有则隐藏,never一直隐藏-->
<item android:id="@+id/clean"
android:title="一键清空"
android:icon="@mipmap/clean1"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/input"
android:title="行李补录"
android:icon="@mipmap/shoudong"
app:showAsAction="ifRoom"/>
<!-- <item-->
<!-- android:id="@+id/setting"-->
<!-- android:title="Setting"-->
<!-- android:icon="@mipmap/ic_launcher"-->
<!-- app:showAsAction="never"/>-->
</menu>
初始化
private void initToolBar(){
flightInputBinding.titlebar.setTitle("航班设置");
flightInputBinding.titlebar.setSubtitle(myApplication.getDATE_WEEK());
setSupportActionBar(flightInputBinding.titlebar);
}
布局与按钮事件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.input_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home){
Dialog.showFinishDialog(this, "确定要退出APP么?",
() -> myApplication.finishAllActivity());
}else if(id == R.id.owner){
Intent i = new Intent(FlightInputActivity.this,InfomationActivity.class);
startActivityForResult(i,2001);
}
return super.onOptionsItemSelected(item);
}
网络请求框架-OkGo
引入包
implementation 'com.lzy.net:okgo:3.0.4'
工具类
1、TrustAllCerts
此类用于绕过https验证
package com.kaiya.mvp.npm_ar.utils;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
/**
* Created by gang.qin
* Date:2024/3/19 15:05
* 质量、速度、廉价,选择其中两个 --- 匿名
*/
//public class TrustAllCerts implements X509TrustManager {
// @Override
// public void checkClientTrusted(X509Certificate[] chain, String authType) {}
//
// @Override
// public void checkServerTrusted(X509Certificate[] chain, String authType) {}
//
// @Override
// public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
//}
public class TrustAllCerts implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
if (chain == null) {
throw new IllegalArgumentException(" Check Server x509Certificates is null");
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}
public static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}
2、封装
package com.kaiya.mvp.npm_ar.utils;
import android.app.Application;
import android.content.Context;
import android.transition.TransitionManager;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cookie.CookieJarImpl;
import com.lzy.okgo.cookie.store.MemoryCookieStore;
import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
/**
* Created by gang.qin
* Date:2024/3/20 15:41
* 质量、速度、廉价,选择其中两个 --- 匿名
*/
public class OkGoUtils {
public static X509TrustManager xtm;
public static SSLContext sslContext;
public static void initOkGo(Application application){
xtm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
try {
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HostnameVerifier DO_NOT_VERIFY = (hostname, session) -> true;
// OkGo.getInstance().init(this); //最简单的配置 什么都不需要写 全部使用默认参数
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//可以使用OkGo内置的log拦截器打印log,如果你觉得不好用,也可以自己写个,这个没有限制。
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("OkGo");
//log打印级别
loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
//log颜色级别
loggingInterceptor.setColorLevel(Level.ALL);
builder.addInterceptor(loggingInterceptor);
//全局的读取超时时间
builder.readTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
//全局的写入超时时间
builder.writeTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
//全局的连接超时时间
builder.connectTimeout(OkGo.DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS);
/*
* connectTimeout:指客户端和服务器 建立通道 的时间
writeTimeout:客户端把数据写出去需要的时间
readTimeout:客户端等待服务器返回数据的时间
* */
//使用内存保持cookie,app退出后,cookie消失
builder.cookieJar(new CookieJarImpl(new MemoryCookieStore()));
if(sslContext != null){
builder.sslSocketFactory(sslContext.getSocketFactory(),xtm)
.hostnameVerifier(DO_NOT_VERIFY)
.build();
}else{
MyLog.e("mylog","过滤器出错!");
}
OkGo.getInstance().init(application)//必须调用初始化
.setOkHttpClient(builder.build()) //建议设置OkHttpClient,不设置将使用默认的
.setRetryCount(1); //超时重连,本身1次,我这边设置1次,总共2次访问
}
public static OkHttpClient initOkhttp(){
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(TrustAllCerts.createSSLSocketFactory())
.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier())
.build();
return client;
}
}
POST请求
private static void okgoPost(String method, HashMap<String,String> hashMap, OkGoCallback callback){
OkGo.<String>post(getIP()+method)
.params(hashMap)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
callback.callback(response.body());
}
});
}
下载
OkGo.<File>get(uploadUrl)
.tag(this)
//.headers("header1", "headerValue1")//
//.params("param1", "paramValue1")//
.execute(new FileCallback(
saveFilePath,
saveName
) {
@Override
public void onStart(com.lzy.okgo.request.base.Request<File, ? extends com.lzy.okgo.request.base.Request> request) {
super.onStart(request);
MyLog.e("mylog","开始下载");
}
@Override
public void onSuccess(com.lzy.okgo.model.Response<File> response) {
progress.getProgress(100,"success");
}
@Override
public void onError(com.lzy.okgo.model.Response<File> response) {
super.onError(response);
progress.getProgress(-1,"下载出错!");
}
@Override
public void downloadProgress(com.lzy.okgo.model.Progress pp) {
super.downloadProgress(pp);
int ppi = (int)(pp.fraction * 100);
MyLog.e("mylog","progress:"+ppi);
progress.getProgress(ppi,"");
}
});
网络请求框架-OkHttp
引入包
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
封装
TrustAllCerts类 在OkGo中 。
private static String okhttp(String method , String json){
MyLog.e("mylog-url",getIP()+method);
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(TrustAllCerts.createSSLSocketFactory()) //绕过https
.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier()) //绕过https
.build();
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url( getIP()+method )
.post(body)
.build();
try{
Response response = client.newCall(request).execute();
return Objects.requireNonNull(response.body()).string();
}catch (Exception e){
MyLog.e("mylog","error:\r\n"+e.getMessage());
return "error:\r\n"+e.getMessage();
}
}
调用
GetList list = new GetList(flightDate,flightNo,sourceAirport, myApplication.getAppIp()); //参数类
//list.toString() 为 类转json字符串
String response = okhttp(GET_LIST,list.toString());
下载
/**
*
* @param uploadUrl 下载路径
* @param saveFilePath 保存路径
* @param saveName 保存文件名 ,如 XXX.apk
* @param progress 回调函数,获取下载进度
*/
public void downloadApk(String uploadUrl,String saveFilePath,String saveName,Progress progress) {
// 创建OkHttpClient并配置自定义的TrustManager
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(TrustAllCerts.createSSLSocketFactory())
.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier())
.build();
Request request = new Request.Builder()
.url(uploadUrl)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
progress.getProgress(-1,e.getMessage());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//3824043
long fileMax = response.body().contentLength();
InputStream inputStream = Objects.requireNonNull(response.body()).byteStream();
File target = new File(saveFilePath,saveName);
FileOutputStream fileOutputStream = new FileOutputStream(target);
try {
byte[] buffer = new byte[2048];
int len;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
int p = (int) ((target.length() * 100) / fileMax);
progress.getProgress(p,"");
}
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
机场业务封装类-AirPortBNS
/**
* 机场业务相关
*/
public class AirPortBNS {
//三字码转汉字
public static String getStation(String str){
switch (str){
case "CTU":
return "成都双流";
case "TFU":
return "成都天府";
case "PKX":
return "北京大兴";
case "PEK":
return "北京首都";
case "SHA":
return "上海虹桥";
case "PVG":
return "上海浦东";
case "HZG":
return "汉中";
case "YCU":
return "运城";
case "UYN":
return "榆林";
case "GYU":
return "固原";
case "CAN":
return "广州";
case "SZX":
return "深圳";
case "HAK":
return "海口";
case "NKG":
return "南京";
case "CKG":
return "重庆";
case "XIY":
return "西安";
case "CSX":
return "长沙";
case "HGH":
return "杭州";
case "HRB":
return "哈尔滨";
case "SYX":
return "三亚";
case "KMG":
return "昆明";
case "XMN":
return "厦门";
case "DLC":
return "大连";
case "WUH":
return "武汉";
case "TAO":
return "青岛";
case "URC":
return "乌鲁木齐";
case "TNA":
return "济南";
case "NNG":
return "南宁";
case "TSN":
return "天津";
case "SHE":
return "沈阳";
case "KWE":
return "贵阳";
case "KWL":
return "桂林";
case "WNZ":
return "温州";
case "FOC":
return "福州";
case "TYN":
return "太原";
case "NGB":
return "宁波";
case "KHN":
return "南昌";
case "CGQ":
return "长春";
case "CGO":
return "郑州";
case "LHW":
return "兰州";
case "HFE":
return "合肥";
case "HKG":
return "香港";
case "ZUH":
return "珠海";
case "YNT":
return "烟台";
case "SJW":
return "石家庄";
case "INC":
return "银川";
case "SWA":
return "汕头";
case "HET":
return "呼和浩特";
case "LXA":
return "拉萨";
case "YNJ":
return "延吉";
case "YIH":
return "宜昌";
case "LJG":
return "丽江";
case "MIG":
return "绵阳";
case "XNN":
return "西宁";
case "WUS":
return "武夷山";
case "CZX":
return "常州";
case "SZV":
return "苏州";
case "ZHA":
return "湛江";
case "DYG":
return "张家界";
case "TXN":
return "黄山";
case "JMU":
return "佳木斯";
case "JNZ":
return "锦州";
case "BAV":
return "包头";
case "BHY":
return "北海";
case "NTG":
return "南通";
case "YIW":
return "义乌";
case "WEH":
return "威海";
case "NAO":
return "南充";
case "CGD":
return "常德";
case "AVA":
return "安顺";
case "XUZ":
return "徐州";
case "LYG":
return "连云港";
case "MDG":
return "牡丹江";
case "YNZ":
return "盐城";
case "DNH":
return "敦煌";
case "BFU":
return "蚌埠";
case "ENH":
return "恩施";
case "XFN":
return "襄阳";
case "SIN":
return "新加坡";
case "YBP":
return "宜宾";
case "DDG":
return "丹东";
case "JJN":
return "晋江";
case "NDG":
return "齐齐哈尔";
case "AQG":
return "安庆";
case "BSD":
return "保山";
case "LYA":
return "洛阳";
case "LZO":
return "泸州";
case "KRL":
return "库尔勒";
case "LZH":
return "柳州";
case "CIF":
return "赤峰";
case "MFM":
return "澳门";
case "LYI":
return "临沂";
case "IQN":
return "庆阳";
case "HLD":
return "海拉尔";
case "HYN":
return "黄岩";
case "NRT":
return "东京";
case "FUG":
return "阜阳";
case "TSA":
return "台北";
case "SHP":
return "秦皇岛";
case "YVR":
return "温哥华";
case "JHG":
return "西双版纳";
case "JZH":
return "九寨沟";
case "DAX":
return "达县";
case "HSN":
return "舟山";
case "KNC":
return "吉安";
case "CHW":
return "酒泉";
case "NNY":
return "南阳";
case "JUZ":
return "衢州";
case "JIL":
return "吉林";
case "JGN":
return "嘉峪关";
case "JDZ":
return "景德镇";
case "HNY":
return "衡阳";
case "TEN":
return "铜仁";
case "TGO":
return "通辽";
case "WUZ":
return "梧州";
case "GOQ":
return "格尔木";
case "JIU":
return "九江";
case "AYG":
return "安阳";
case "AKU":
return "阿克苏";
case "KHG":
return "喀什";
case "ZYI":
return "遵义";
case "AKA":
return "安康";
case "DAT":
return "大同";
case "ENY":
return "延安";
case "WUT":
return "五台山";
case "SYM":
return "思茅";
case "ZAT":
return "昭通";
case "HEK":
return "黑河";
case "JGS":
return "井冈山";
case "GYS":
return "广元";
case "HTN":
return "和田";
case "SEL":
return "汉城";
case "CIH":
return "长治";
case "XIC":
return "西昌";
case "YIN":
return "伊宁";
case "MXZ":
return "梅县";
case "SGN":
return "胡志明";
case "SHS":
return "沙市";
case "HAN":
return "河内";
case "HTT":
return "花土沟镇";
case "JUH":
return "九华山";
case "WDS":
return "十堰";
case "FUO":
return "佛山";
case "AAT":
return "阿勒泰";
case "ACF":
return "阿拉尔塔里木";
case "TLQ":
return "吐鲁番";
case "DZU":
return "大足登云";
case "GHN":
return "广汉";
case "XNT":
return "邢台";
case "EJN":
return "额济纳旗";
case "WHA":
return "芜湖";
case "AHJ":
return "阿坝";
case "LLB":
return "荔波";
case "LDG":
return "罗定";
case "XEN":
return "兴城";
case "LZY":
return "林芝";
case "YLX":
return "玉林";
case "GZG":
return "甘孜";
case "WNH":
return "文山";
case "YTW":
return "于田万方";
case "LIA":
return "梁平";
case "HSJ":
return "上街";
case "LHK":
return "老河口";
case "ZFL":
return "昭苏";
case "PNJ":
return "沙河口";
case "HZA":
return "菏泽";
case "HCZ":
return "郴州";
case "CQW":
return "武隆";
case "MZG":
return "马公";
case "TPE":
return "桃园";
case "TNN":
return "台南";
case "TTT":
return "台东";
case "NZH":
return "满洲里";
case "RHT":
return "阿拉善右旗";
case "AXF":
return "阿拉善左旗";
case "CDE":
return "承德";
case "WMT":
return "遵义茅台";
case "FYJ":
return "抚远";
case "KJI":
return "布尔津";
case "QSZ":
return "莎车";
case "KHH":
return "高雄";
case "HUN":
return "花莲";
case "NAY":
return "北京南苑";
case "WUA":
return "乌海";
case "DSN":
return "鄂尔多斯";
case "EHU":
return "鄂州花湖";
case "YIE":
return "阿尔山";
case "ERL":
return "二连浩特";
case "HDG":
return "邯郸";
case "HUO":
return "霍林郭勒";
case "LFQ":
return "临汾";
case "LLV":
return "吕梁";
case "BPE":
return "秦皇岛北戴河";
case "TVS":
return "唐山";
case "UCB":
return "乌兰察布";
case "HLH":
return "乌兰浩特";
case "XIL":
return "锡林浩特";
case "NZL":
return "扎兰屯";
case "ZQZ":
return "张家口";
case "DTU":
return "五大连池";
case "JSJ":
return "建三江";
case "YSQ":
return "松原";
case "AEB":
return "百色";
case "HCJ":
return "河池";
case "HJJ":
return "怀化";
case "JMJ":
return "澜沧";
case "LNJ":
return "临沧博尚";
case "FYN":
return "富蕴";
case "NGQ":
return "阿里";
case "DIG":
return "迪庆";
case "THQ":
return "天水";
case "HUZ":
return "惠州";
case "BAR":
return "琼海";
case "XYI":
return "三沙";
case "WGN":
return "邵阳";
case "HPG":
return "神农架";
case "LLF":
return "永州";
case "BFJ":
return "毕节";
case "KJH":
return "凯里";
case "BPX":
return "昌都";
case "DLU":
return "大理凤仪";
case "GMQ":
return "果洛";
case "JIC":
return "金昌";
case "YUS":
return "玉树";
case "YZY":
return "张掖";
case "ZHY":
return "中卫";
case "WUX":
return "无锡";
case "YTY":
return "扬州";
case "DOY":
return "东营";
case "HIA":
return "淮安";
case "WEF":
return "潍坊";
case "KOW":
return "赣州";
case "JNG":
return "济宁";
case "RIZ":
return "日照";
case "SQJ":
return "三明";
case "SQD":
return "上饶";
case "DCY":
return "稻城";
case "KGT":
return "康定";
case "HZH":
return "黎平";
case "JIQ":
return "黔江";
case "WXN":
return "万州";
case "CWJ":
return "沧源";
case "LUM":
return "德宏芒市";
case "LPF":
return "六盘水";
case "NLH":
return "宁蒗";
case "RKZ":
return "日喀则";
case "TCZ":
return "腾冲";
case "HXD":
return "德令哈";
case "GXH":
return "夏河";
case "KRY":
return "克拉玛依";
case "JGD":
return "加格达奇";
case "AOG":
return "鞍山";
case "DQA":
return "大庆";
case "JXA":
return "鸡西";
case "TNH":
return "通化";
case "LDS":
return "伊春";
case "YKH":
return "营口";
case "LCX":
return "连城";
case "YIC":
return "宜春";
case "HMI":
return "哈密";
case "KCA":
return "库车";
case "NLT":
return "那拉提";
case "IQM":
return "且末";
case "SHF":
return "石河子";
case "TCG":
return "塔城";
case "KNH":
return "金门";
case "RMQ":
return "台中";
case "NBS":
return "长白山";
case "CHG":
return "朝阳";
case "OHE":
return "漠河";
case "XAI":
return "信阳";
case "YYA":
return "岳阳";
case "BZX":
return "巴中";
case "LGZ":
return "山南隆子机场";
case "DDR":
return "日喀则定日";
case "HBQ":
return "海北";
case "LNL":
return "陇南";
case "BPL":
return "博乐";
case "RQA":
return "若羌";
case "HQL":
return "塔什库尔干";
case "TWC":
return "图木舒克";
case "DXJ":
return "湘西";
case "CNI":
return "大长山岛";
case "SXJ":
return "鄯善";
case "RLK":
return "巴彦淖尔";
case "DBC":
return "白城";
case "HSC":
return "韶关";
case "DZH":
return "达州";
case "PZI":
return "攀枝花";
case "WSK":
return "巫山";
case "ACX":
return "兴义";
case "SZH":
return "朔州";
case "JBK":
return "江布拉克";
case "HJB":
return "巴音布鲁克";
case "HQQ":
return "安阳";
case "LZG":
return "阆中";
default:
return str;
}
}
//航空公司二字码转图标
public static int getIcon(String str){
int i = -1;
switch (str){
case "2P":
i = R.mipmap.aircorp_2p;
break;
case "3U":
i = R.mipmap.aircorp_3u;
break;
case "3V":
i = R.mipmap.aircorp_3v;
break;
case "4J":
i = R.mipmap.aircorp_4j;
break;
case "5J":
i = R.mipmap.aircorp_5j;
break;
case "5M":
i = R.mipmap.aircorp_5m;
break;
case "5X":
i = R.mipmap.aircorp_5x;
break;
case "6U":
i = R.mipmap.aircorp_6u;
break;
case "7C":
i = R.mipmap.aircorp_7c;
break;
case "8C":
i = R.mipmap.aircorp_8c;
break;
case "8L":
i = R.mipmap.aircorp_8l;
break;
case "8M":
i = R.mipmap.aircorp_8m;
break;
case "8Y":
i = R.mipmap.aircorp_8y;
break;
case "9C":
i = R.mipmap.aircorp_9c;
break;
case "9H":
i = R.mipmap.aircorp_9h;
break;
case "9W":
i = R.mipmap.aircorp_9w;
break;
case "AA":
i = R.mipmap.aircorp_aa;
break;
case "AB":
i = R.mipmap.aircorp_ab;
break;
case "AC":
i = R.mipmap.aircorp_ac;
break;
case "AF":
i = R.mipmap.aircorp_af;
break;
case "AH":
i = R.mipmap.aircorp_ah;
break;
case "AI":
i = R.mipmap.aircorp_ai;
break;
case "AK":
i = R.mipmap.aircorp_ak;
break;
case "AM":
i = R.mipmap.aircorp_am;
break;
case "AQ":
i = R.mipmap.aircorp_aq;
break;
case "AY":
i = R.mipmap.aircorp_ay;
break;
case "AZ":
i = R.mipmap.aircorp_az;
break;
case "B7":
i = R.mipmap.aircorp_b7;
break;
case "BA":
i = R.mipmap.aircorp_ba;
break;
case "BI":
i = R.mipmap.aircorp_bi;
break;
case "BK":
i = R.mipmap.aircorp_bk;
break;
case "BR":
i = R.mipmap.aircorp_br;
break;
case "BX":
i = R.mipmap.aircorp_bx;
break;
case "CA":
i = R.mipmap.aircorp_ca;
break;
case "CI":
i = R.mipmap.aircorp_ci;
break;
case "CK":
i = R.mipmap.aircorp_ck;
break;
case "CN":
i = R.mipmap.aircorp_cn;
break;
case "CO":
i = R.mipmap.aircorp_co;
break;
case "CX":
i = R.mipmap.aircorp_cx;
break;
case "CY":
i = R.mipmap.aircorp_cy;
break;
case "CZ":
i = R.mipmap.aircorp_cz;
break;
case "DD":
i = R.mipmap.aircorp_dd;
break;
case "DL":
i = R.mipmap.aircorp_dl;
break;
case "DR":
i = R.mipmap.aircorp_dr;
break;
case "DT":
i = R.mipmap.aircorp_dt;
break;
case "DZ":
i = R.mipmap.aircorp_dz;
break;
case "E8":
i = R.mipmap.aircorp_e8;
break;
case "EK":
i = R.mipmap.aircorp_ek;
break;
case "ET":
i = R.mipmap.aircorp_et;
break;
case "EU":
i = R.mipmap.aircorp_eu;
break;
case "EY":
i = R.mipmap.aircorp_ey;
break;
case "FD":
i = R.mipmap.aircorp_fd;
break;
case "FE":
i = R.mipmap.aircorp_fe;
break;
case "FG":
i = R.mipmap.aircorp_fg;
break;
case "FI":
i = R.mipmap.aircorp_fi;
break;
case "FL":
i = R.mipmap.aircorp_fl;
break;
case "FM":
i = R.mipmap.aircorp_fm;
break;
case "FU":
i = R.mipmap.aircorp_fu;
break;
case "G5":
i = R.mipmap.aircorp_g5;
break;
case "GA":
i = R.mipmap.aircorp_ga;
break;
case "GE":
i = R.mipmap.aircorp_ge;
break;
case "GF":
i = R.mipmap.aircorp_gf;
break;
case "GJ":
i = R.mipmap.aircorp_gj;
break;
case "GS":
i = R.mipmap.aircorp_gs;
break;
case "GX":
i = R.mipmap.aircorp_gx;
break;
case "HO":
i = R.mipmap.aircorp_ho;
break;
case "HU":
i = R.mipmap.aircorp_hu;
break;
case "HX":
i = R.mipmap.aircorp_hx;
break;
case "HY":
i = R.mipmap.aircorp_hy;
break;
case "HZ":
i = R.mipmap.aircorp_hz;
break;
case "IB":
i = R.mipmap.aircorp_ib;
break;
case "IR":
i = R.mipmap.aircorp_ir;
break;
case "JD":
i = R.mipmap.aircorp_jd;
break;
case "JL":
i = R.mipmap.aircorp_jl;
break;
case "JQ":
i = R.mipmap.aircorp_jq;
break;
case "JR":
i = R.mipmap.aircorp_jr;
break;
case "JS":
i = R.mipmap.aircorp_js;
break;
case "KA":
i = R.mipmap.aircorp_ka;
break;
case "KC":
i = R.mipmap.aircorp_kc;
break;
case "KE":
i = R.mipmap.aircorp_ke;
break;
case "KL":
i = R.mipmap.aircorp_kl;
break;
case "KN":
i = R.mipmap.aircorp_kn;
break;
case "KQ":
i = R.mipmap.aircorp_kq;
break;
case "KY":
i = R.mipmap.aircorp_ky;
break;
case "KZ":
i = R.mipmap.aircorp_kz;
break;
case "LA":
i = R.mipmap.aircorp_la;
break;
case "LH":
i = R.mipmap.aircorp_lh;
break;
case "LJ":
i = R.mipmap.aircorp_lj;
break;
case "LO":
i = R.mipmap.aircorp_lo;
break;
case "LX":
i = R.mipmap.aircorp_lx;
break;
case "LY":
i = R.mipmap.aircorp_ly;
break;
case "M0":
i = R.mipmap.aircorp_m0;
break;
case "MA":
i = R.mipmap.aircorp_ma;
break;
case "MD":
i = R.mipmap.aircorp_md;
break;
case "MF":
i = R.mipmap.aircorp_mf;
break;
case "MH":
i = R.mipmap.aircorp_mh;
break;
case "MI":
i = R.mipmap.aircorp_mi;
break;
case "MK":
i = R.mipmap.aircorp_mk;
break;
case "MM":
i = R.mipmap.aircorp_mm;
break;
case "MR":
i = R.mipmap.aircorp_mr;
break;
case "MS":
i = R.mipmap.aircorp_ms;
break;
case "MU":
i = R.mipmap.aircorp_mu;
break;
case "NH":
i = R.mipmap.aircorp_nh;
break;
case "NS":
i = R.mipmap.aircorp_ns;
break;
case "NW":
i = R.mipmap.aircorp_nw;
break;
case "NX":
i = R.mipmap.aircorp_nx;
break;
case "NZ":
i = R.mipmap.aircorp_nz;
break;
case "OQ":
i = R.mipmap.aircorp_oq;
break;
case "OS":
i = R.mipmap.aircorp_os;
break;
case "OX":
i = R.mipmap.aircorp_ox;
break;
case "OZ":
i = R.mipmap.aircorp_oz;
break;
case "PG":
i = R.mipmap.aircorp_pg;
break;
case "PK":
i = R.mipmap.aircorp_pk;
break;
case "PN":
i = R.mipmap.aircorp_pn;
break;
case "PR":
i = R.mipmap.aircorp_pr;
break;
case "Q4":
i = R.mipmap.aircorp_q4;
break;
case "QF":
i = R.mipmap.aircorp_qf;
break;
case "QH":
i = R.mipmap.aircorp_qh;
break;
case "QR":
i = R.mipmap.aircorp_qr;
break;
case "QV":
i = R.mipmap.aircorp_qv;
break;
case "QW":
i = R.mipmap.aircorp_qw;
break;
case "RA":
i = R.mipmap.aircorp_ra;
break;
case "RG":
i = R.mipmap.aircorp_rg;
break;
case "S7":
i = R.mipmap.aircorp_s7;
break;
case "SA":
i = R.mipmap.aircorp_sa;
break;
case "SC":
i = R.mipmap.aircorp_sc;
break;
case "SK":
i = R.mipmap.aircorp_sk;
break;
case "SQ":
i = R.mipmap.aircorp_sq;
break;
case "SU":
i = R.mipmap.aircorp_su;
break;
case "SV":
i = R.mipmap.aircorp_sv;
break;
case "T5":
i = R.mipmap.aircorp_t5;
break;
case "TE":
i = R.mipmap.aircorp_te;
break;
case "TG":
i = R.mipmap.aircorp_tg;
break;
case "TH":
i = R.mipmap.aircorp_th;
break;
case "TK":
i = R.mipmap.aircorp_tk;
break;
case "TR":
i = R.mipmap.aircorp_tr;
break;
case "TV":
i = R.mipmap.aircorp_tv;
break;
case "TW":
i = R.mipmap.aircorp_tw;
break;
case "U6":
i = R.mipmap.aircorp_u6;
break;
case "UA":
i = R.mipmap.aircorp_ua;
break;
case "UL":
i = R.mipmap.aircorp_ul;
break;
case "UO":
i = R.mipmap.aircorp_uo;
break;
case "UQ":
i = R.mipmap.aircorp_uq;
break;
case "UX":
i = R.mipmap.aircorp_ux;
break;
case "VD":
i = R.mipmap.aircorp_vd;
break;
case "VN":
i = R.mipmap.aircorp_vn;
break;
case "VS":
i = R.mipmap.aircorp_vs;
break;
case "VT":
i = R.mipmap.aircorp_vt;
break;
case "VV":
i = R.mipmap.aircorp_vv;
break;
case "XF":
i = R.mipmap.aircorp_xf;
break;
case "YI":
i = R.mipmap.aircorp_yi;
break;
case "Z2":
i = R.mipmap.aircorp_z2;
break;
case "ZA":
i = R.mipmap.aircorp_za;
break;
case "ZE":
i = R.mipmap.aircorp_ze;
break;
case "ZH":
i = R.mipmap.aircorp_zh;
break;
case "ZP":
i = R.mipmap.aircorp_zp;
break;
default:
i = R.mipmap.aircorp_weizhi;
break;
}
return i;
}
}
航司图标_高清-百度网盘
提取码:rya4
航司图标-百度网盘
提取码:rmmq
注:暂时用百度网盘了,其他方式可能会收费