| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | */ |
| | | 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) { |
| | |
| | | */ |
| | | 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) { |
| | |
| | | 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()); |
| | |
| | | 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; |
| | | } |
| | | } |