From 9fbcdc146440b49ef80714c1336c226e00727da8 Mon Sep 17 00:00:00 2001 From: Administrator <123> Date: Thu, 28 Oct 2021 10:16:30 +0000 Subject: [PATCH] 其他部分框架方法及文件新增 --- app/src/main/java/com/duqing/missions/base/BaseActivity.java | 404 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 404 insertions(+), 0 deletions(-) diff --git a/app/src/main/java/com/duqing/missions/base/BaseActivity.java b/app/src/main/java/com/duqing/missions/base/BaseActivity.java index cd24d4d..ef14ad3 100644 --- a/app/src/main/java/com/duqing/missions/base/BaseActivity.java +++ b/app/src/main/java/com/duqing/missions/base/BaseActivity.java @@ -1,14 +1,56 @@ package com.duqing.missions.base; +import android.Manifest; +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Environment; +import android.provider.Settings; +import android.util.Log; import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.Toast; +import androidx.annotation.ColorRes; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; import androidx.viewbinding.ViewBinding; +import com.duqing.missions.MyApplication; +import com.duqing.missions.data.ApkUpGradeResult; +import com.duqing.missions.util.MyLog; +import com.duqing.missions.util.ResPonse; +import com.duqing.missions.util.SpUtils; +import com.permissionx.guolindev.PermissionX; +import com.permissionx.guolindev.callback.ExplainReasonCallbackWithBeforeParam; +import com.permissionx.guolindev.callback.ForwardToSettingsCallback; +import com.permissionx.guolindev.callback.RequestCallback; +import com.permissionx.guolindev.request.ExplainScope; +import com.permissionx.guolindev.request.ForwardScope; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; +import java.util.Date; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; /** * Created by Administrator on 2021/10/27 0027. @@ -16,6 +58,41 @@ public abstract class BaseActivity<B extends ViewBinding> extends AppCompatActivity { protected B binding; + protected String TAG ; + public final String[] FILE_PERMISSIONS = new String []{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public final String[] LOCATION_PERMISSIONS = new String []{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}; + public final String[] CAMERA_PERMISSIONS = new String[]{ FILE_PERMISSIONS[0],FILE_PERMISSIONS[1], Manifest.permission.CAMERA}; + public final String[] CAMERA_RECORD_PERMISSIONS = new String[]{ FILE_PERMISSIONS[0],FILE_PERMISSIONS[1], Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO}; + + public static final int RESULT_LOGIN = 100,RESULT_LOGIN_RECREATE = 103,RESULT_BIND = 101,RESULT_SENDEDFILES = 105,RESULT_DISSCONNECT = 104, + RESULT_UPDATEUSER = 115,RESULT_LOGOUT = 113, REQUEST_CODE_ACTIVITY = 333; + public static final int REQUEST_CODE_LOGOUT = 20009,/*退出*/ + REQUEST_CODE_ORDER = 10010,/*订单详情*/ + REQUEST_CODE_LOGIN = 20010,/*登录*/ + REQUEST_CODE_SCAN = 20011/*扫描请求*/, + REQUEST_CODE_PIC = 20012,/*选择图片*/ + REQUEST_CODE_PAYPASS = 20112,/*支付验证*/ + REQUEST_CODE_PAYPASS_FOR_ALIPAY = 20110,/*支付宝修改支付验证*/ + REQUEST_CODE_PAYPASS_FOR_REALNAME = 20111,/*支付宝修改支付验证*/ + REQUEST_CODE_PERMISSION = 20013,/*请求权限*/ + REQUEST_VERSION_PERMISSION = 20013,/*检查更新*/ + REQUEST_INSTALL_PERMISSION = 20014,/*请求安装权限*/ + REQUEST_CODE_MANAGE_GROUP = 20015,/*选择分组*/ + REQUEST_CODE_MANAGE_DEL = 20016,/*选择删除*/ + REQUEST_CODE_MANAGE_EDIT = 20017,/*选择编辑*/ + REQUEST_CODE_MANAGE_ADD = 20018,/*选择添加*/ + REQUEST_CODE_MANAGE_DRAFT = 20019,/*选择草稿编辑*/ + REQUEST_CODE_WEPAY = 20020,/*微信支付*/ + REQUEST_CODE_ALIPAY = 20021,/*支付宝*/ + REQUEST_CODE_PINKAGE = 20022,/*包邮设置*/ + REQUEST_INSTALL_APK = 20200,/*请求安装权限*/ + REQUEST_CODE_COMMENT_REFRESH = 20222,/*请求安装权限*/ + RESULT_CODE_DRAFT = 4041/*草稿*/, + RESULT_CODE_UPDATED = 4042/*更新*/, + RESULT_CODE_FAILD = 4044/*失败*/, + RESULT_CODE_SUCESS = 4046/*成功*/, + RESULT_CODE_CANCEL = 4043/*取消*/; + protected Context mContext; @Override @@ -30,5 +107,332 @@ e.printStackTrace(); } setContentView(binding.getRoot()); + mContext = this; + try { + //设置坚屏 一定要放到try catch里面,否则会崩溃 + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } catch (Exception e) { + } + TAG = this.getClass().getSimpleName(); } + + + public void setStatusBarTransparent(boolean isBlack){ + //透明状态栏 + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + //透明导航栏 + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + } + + /** + * 修改状态栏颜色,支持4.4以上版本 + * @param colorId + */ + public void setStatusBarBgColor(@ColorRes int colorId) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + getWindow().setStatusBarColor(getResources().getColor(colorId)); + } + + /** + * 修改状态栏文本颜色 + * @param isBlack + */ + public void setStatusBarTextColor(boolean isBlack){ + View decor = getWindow().getDecorView(); + if (isBlack) { + decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } else { + decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + } + + /** + * 隐藏虚拟按键 + */ + public void hideBottomUIMenu() { + //隐藏虚拟按键 + if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api + View v = getWindow().getDecorView(); + v.setSystemUiVisibility(View.GONE); + } else if (Build.VERSION.SDK_INT >= 19) { + //for new api versions. + View decorView = getWindow().getDecorView(); + int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ; + decorView.setSystemUiVisibility(uiOptions); + } + + } + + /** + * 状态栏高度 + * @return + */ + public int getStatusBarHeight() { + int result = 0; + int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resId > 0) { + result = getResources().getDimensionPixelOffset(resId); + } + return result; + } + + + long mExitTime= 0 ; + /** + * 返回键退出程序 + */ + public void backExit() { + if ((System.currentTimeMillis() - mExitTime) > 2000) { + Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show(); + mExitTime = System.currentTimeMillis(); + } else { + //此方法导致app关闭后重启 + MyApplication.getApplication().quitApp(); + System.exit(0); + //quitApp(); + } + } + ApkUpGradeResult.AppInfo apkUpGrade; + ProgressDialog progressDialog ; + + public void showUpdateDialog(){ + if(apkUpGrade == null){ + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("新版本").setMessage("有新版更新\n"+apkUpGrade.content) + .setPositiveButton("", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + okHttpDownload(apkUpGrade.url, new ResPonse<String>() { + @Override + public void doSuccess(String path) { + apkUpGrade.remark = path; + openAPK(new File(path)); + } + + @Override + public void doError(String path) { + if(apkUpGrade.isImportant==1){ + showUpdateDialog(); + }else { + if(path != null) { + apkUpGrade.remark = path; + openAPK(new File(path)); + } + } + } + }); + } + }) + .setNegativeButton(apkUpGrade.isImportant==1?"退出":"取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if(apkUpGrade.isImportant==1){ + MyApplication.getApplication().quitApp(); + }else { + SpUtils.getInstance().putLongValOfProject(mContext,"version", new Date().getTime());//记录今天已经请求过更新 不在自动请求 + } + } + }); + } + + /** + * okhttp下载文件 + * @param downloadUrl + * @param resPonse + */ + protected void okHttpDownload(final String downloadUrl, final ResPonse<String> resPonse){ + PermissionX.init(this).permissions(FILE_PERMISSIONS).onExplainRequestReason(new ExplainReasonCallbackWithBeforeParam() { + @Override + public void onExplainReason(ExplainScope scope, List<String> deniedList, boolean beforeRequest) { + scope.showRequestReasonDialog(deniedList, "即将申请的权限是程序必须依赖的权限", "继续申请","我已明白"); + } + }).onForwardToSettings(new ForwardToSettingsCallback() { + @Override + public void onForwardToSettings(ForwardScope scope, List<String> deniedList) { + scope.showForwardToSettingsDialog(deniedList, "您需要去应用程序设置当中手动开启权限", "去设置","我已明白"); + } + }).request(new RequestCallback() { + @Override + public void onResult(boolean allGranted, List<String> grantedList, List<String> deniedList) { + if(allGranted){ + + OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); + + Request request = new Request.Builder() + .url(downloadUrl) + .get() + .build(); + + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("tag", "onFailure: " + e.getMessage()); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + ResponseBody body = response.body(); // 获取到请求体 + InputStream inputStream = body.byteStream(); // 转换成字节流 + progressDialog = new ProgressDialog(mContext); + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressDialog.setTitle("正在下载..."); + progressDialog.setCancelable(false); + progressDialog.show(); + saveFile(inputStream, getSaveFilePath(downloadUrl), body.contentLength(),resPonse); + } + }); + } else { + Toast.makeText(mContext, "您拒绝了权限申请!", Toast.LENGTH_SHORT).show(); + } + } + }); + } + + /** + * @param inputStream + * @param filePath 存放的地址 + * @param l 文件的长度 + */ + private void saveFile(InputStream inputStream, final String filePath, final long l, final ResPonse<String> resPonse) { + runOnUiThread(new Runnable() { + @Override + public void run() { + progressDialog.setMax((int)l);// 设置进度条最大值 + } + }); + long count = 0; + try { + File file = new File(filePath); + Log.i(TAG, "文件保存路径:" + filePath+" 文件是否存在:"+file.exists()); + if (!file.exists()) {//文件不存在 + file.createNewFile(); + }else{ + file.delete(); + } + // 获取到输出流,写入到的地址 + FileOutputStream outputStream = new FileOutputStream(file); + int length = -1; + byte[] bytes = new byte[1024 * 10]; + while ((length = inputStream.read(bytes)) != -1) { + // 写入文件 + outputStream.write(bytes, 0, length); + count += length; + + final long finalCount = count; + final int finalLenght = length; + runOnUiThread(new Runnable() { + @Override + public void run() { + progressDialog.setProgress((int) finalCount); // 设置进度 + } + }); + } + inputStream.close(); // 关闭输入流 + outputStream.close(); // 关闭输出流 + runOnUiThread(new Runnable() { + @Override + public void run() { + // 如果写入的进度值完毕,Toast + progressDialog.dismiss(); + resPonse.doSuccess(filePath); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 获取文件保存路径 sdcard根目录/download/文件名称 + * @param fileUrl + * @return + */ + public static String getSaveFilePath(String fileUrl){ + String fileName=fileUrl.substring(fileUrl.lastIndexOf("/")+1,fileUrl.length());//获取文件名称 + String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Download"; + File appDir = new File(storePath); + if (!appDir.exists()) { + appDir.mkdirs(); + } + return storePath + File.separator +fileName; + } + + /** + * 打开apk文件 + * @param file + */ + public void openAPK(final File file){ + + //android 8及以上需要设置权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !getPackageManager().canRequestPackageInstalls()) { + // 申请安装权限。 + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("需要允许安装权限").setMessage("应用需要手动设置,才能打开安装包升级应用").setCancelable(false) + .setNegativeButton("", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Uri packageUri = Uri.parse("package:" + getPackageName()); + Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageUri); + startActivityForResult(intent, REQUEST_INSTALL_PERMISSION); + dialog.dismiss(); + } + }) + .setPositiveButton(apkUpGrade.isImportant==1?"退出":"取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if(apkUpGrade.isImportant==1){ + MyApplication.getApplication().quitApp(); + } + } + }).create().show(); + return; + } + + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + Uri photoURI = null ; + if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N) { //判读版本是否在7.0以上 + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + photoURI = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".provider", file);//添加这一句表示对目标应用临时授权该Uri所代表的文件 + + }else{ + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + photoURI = Uri.fromFile(file); + } + intent.setDataAndType(photoURI,"application/vnd.android.package-archive"); + startActivityForResult(intent,REQUEST_INSTALL_APK); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + MyLog.i(TAG,String.format("onActivityResult requestCode:%s, resultCode:%s, data:%s",requestCode, resultCode, data)); + if(requestCode == REQUEST_INSTALL_PERMISSION){ + openAPK(new File(apkUpGrade.remark)); + }else if(requestCode == REQUEST_INSTALL_APK && apkUpGrade.isImportant==1){ + /*showDialog("强制更新", "需要安装新版本才能继续使用","安装","退出", new ResPonse() { + @Override + public void doSuccess(Object obj) { + + } + + @Override + public void doError(Object obj) { + super.doError(obj); + } + });*/ + } + } + + + protected boolean onBackKeyDown() { + onBackPressed(); + return false; + } + } -- Gitblit v1.9.1