张钢
2024-09-02 63608b5dca9eebb6fa2cb1a8652b395f1d910c3e
app_base/src/main/java/com/android/app_base/utils/Utils.java
@@ -1,8 +1,17 @@
package com.android.app_base.utils;
import android.animation.ValueAnimator;
import android.app.ActionBar;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
@@ -10,11 +19,20 @@
import android.view.View;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import com.android.app_base.base.BaseApplication;
import com.blankj.utilcode.util.LogUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -37,7 +55,7 @@
     */
    public static void dropExpand(View view,int initialHeight , int targetHeight) {
        ValueAnimator animator = ValueAnimator.ofInt(initialHeight,targetHeight);
        animator.setDuration(500);
        animator.setDuration(400);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
@@ -56,7 +74,7 @@
     */
    public static void pullCollapse(View view,int initialHeight, int targetHeight) {
        ValueAnimator animator = ValueAnimator.ofInt(initialHeight, targetHeight);
        animator.setDuration(500);
        animator.setDuration(400);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
@@ -214,7 +232,7 @@
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", file);
            Uri contentUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".file-provider", file);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
//            Uri uri = Uri.parse("file://" + file.toString());
@@ -225,4 +243,85 @@
        context.startActivity(intent);
    }
    /**
     * 判断是否有网络
     */
    public static boolean checkNetwork() {
//        if (context == null) {
//            return false;
//        }
//        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//        if (mConnectivityManager == null) {
//            return false;
//        }
//        NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
//        return mNetworkInfo != null && mNetworkInfo.isAvailable();
        Application application = BaseApplication.getInstance();
        if (application != null) {
            ConnectivityManager manager = ContextCompat.getSystemService(application, ConnectivityManager.class);
            if (manager != null) {
                NetworkInfo info = manager.getActiveNetworkInfo();
                // 判断网络是否连接
                if (info == null || !info.isConnected()) {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * 把 view 转换成 drawable
     */
    public static Drawable convertViewToDrawable(View view) {
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        int width = view.getMeasuredWidth();
        int height = view.getMeasuredHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        view.layout(0, 0, width, height);
        view.draw(canvas);
        return new BitmapDrawable(view.getResources(), bitmap);
    }
    /**
     * 计算文件的MD5哈希值
     *
     * @param file 文件
     * @return 文件的MD5哈希值,如果计算失败则返回null
     */
    public static String calculateMD5(File file) {
        try {
            // 获取MD5消息摘要算法的实例
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 创建文件URL
            // 打开文件输入流,并使用DigestInputStream更新消息摘要
            try (FileInputStream is = new FileInputStream(file);
                 DigestInputStream dis = new DigestInputStream(is, md)) {
                // 读取输入流并更新消息摘要
                byte[] buffer = new byte[1024*256];
                while(true){
                    if (!(dis.read(buffer) > 0)) break;
                }
                // 获取MD5哈希值的字节数组
                md = dis.getMessageDigest();
                byte[] mdBytes = md.digest();
                // 将字节数组转换为十六进制字符串
                StringBuilder hexString = new StringBuilder();
                for (byte mdByte : mdBytes) {
                    hexString.append(Integer.toHexString(0xFF & mdByte));
                }
                return hexString.toString();
            }
        } catch (NoSuchAlgorithmException | IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}