package com.chinaiatb.mrdoctor.utils; import android.Manifest; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.MediaStore; import androidx.annotation.NonNull; import androidx.core.content.FileProvider; import android.provider.OpenableColumns; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.webkit.MimeTypeMap; import android.widget.TextView; import android.widget.Toast; import com.blankj.utilcode.util.LogUtils; import com.chinaiatb.mrdoctor.R; import com.chinaiatb.mrdoctor.base.ui.widget.ActionSheetDialog; import com.chinaiatb.mrdoctor.base.utils.FileUtils; import com.chinaiatb.mrdoctor.base.utils.PermissionUtils; import com.chinaiatb.mrdoctor.base.utils.ToastUtil; import com.chinaiatb.mrdoctor.configs.GlobalConstant; import com.chinaiatb.mrdoctor.configs.ParamsConfigs; import com.chinaiatb.mrdoctor.ui.test.friend.view.SelectImageActivity; import com.chinaiatb.mrdoctor.ui.test.model.Image; import com.google.android.material.snackbar.Snackbar; import com.huawei.hms.utils.IOUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import static com.blankj.utilcode.util.StringUtils.getString; import static com.chinaiatb.mrdoctor.configs.IntentParameter.TAG; /** * description: * 2020/12/10. * auth:lihe */ public class AddPictureFileUtils { private ActionSheetDialog sheetDialog; private Activity mActivity; public AddPictureFileUtils(Activity activity, int singleOrMulti, boolean needCrop){ this.mActivity = activity; this.singleOrMulti = singleOrMulti; if(needCrop){ FILE_SAVEPATH = getSDPath(mActivity.getBaseContext()); // SELECT_FILE_SAVEPATH = getSDPath(mActivity.getBaseContext()); TEMP_DIR_PATH = ParamsConfigs.TEMP_SAVE_PATH_11; } } public AddPictureFileUtils(Activity activity, int singleOrMulti){ this.mActivity = activity; this.singleOrMulti = singleOrMulti; } private final static String AUTHORITY_NAME = "com.chinaiatb.mrdoctor.fileprovider"; private String FILE_SAVEPATH = ParamsConfigs.PICTURE_SAVE_PATH; private String TEMP_DIR_PATH = ParamsConfigs.TEMP_SAVE_PATH; private String SELECT_FILE_SAVEPATH = ParamsConfigs.SELECT_FILE_SAVE_PATH; private String FileFlag; private Uri origUri;//原始uri private Uri cropUri;//剪裁后的uri private Uri selectFileUri; private File uploadPicFile;//上传照片 private String uploadPicPath;//上传照片路径 private File uploadSelectFile;//上传文件 private String uploadSelectFilePath;//上传文件路径 private List<String> selectedFileNames = new ArrayList<>(); private File uploadOriPicFile;//原始照片 private String uploadOriPicPath;//原始照片路径 private String fileType; private boolean needCutPicture;//标记是否需要剪裁 private int singleOrMulti = SINGLE_CHOOSE;//标记单选还是多选 public static final int SINGLE_CHOOSE = 1;//照片单选f public static final int MULTI_CHOOSE = 2;//照片多选 /** 请求相册 */ public static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0; /** 请求相机 */ public static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1; /** 请求裁剪 */ public static final int REQUEST_CODE_GETIMAGE_BYCROP = 2; /** 请求文件 */ public static final int REQUEST_CODE_GETFILE = 3; private final int CROP = 200; /** 请求存储权限 */ private static final int REQUEST_CODE_STORAGE_PERMISSION = 4; /** * 检查相机存储权限 */ public void checkPremission(boolean needCutPicture,String fileFlag) { FileFlag = fileFlag; this.needCutPicture = needCutPicture; CharSequence[] items = { getString(R.string.str_img_from_camera), getString(R.string.str_img_from_album) }; imageChooseItem(items); } /* * 获取SDK=30及以上的存储路径 * */ public static String getSDPath(Context context) { File sdDir = null; boolean sdCardExist = Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED);// 判断sd卡是否存在 if (sdCardExist) { if (Build.VERSION.SDK_INT>=29){ //Android10之后 sdDir = context.getExternalFilesDir(null); }else { sdDir = Environment.getExternalStorageDirectory();// 获取SD卡根目录 } } else { sdDir = Environment.getRootDirectory();// 获取跟目录 } return sdDir.toString(); } public void checkCameraPermissions(){ String[] permissions = new String[]{ // Manifest.permission.WRITE_EXTERNAL_STORAGE, // Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; //这里的this不是上下文,是Activity对象! PermissionUtils.getInstance().chekPermissions(mActivity, permissions, permissionsCameraResult,1); // ToastUtil.showLongToastTop("用于扫码登录、扫码签名、患者问题答复时添加图片或视频信息"); } //创建监听权限的接口对象 PermissionUtils.IPermissionsResult permissionsCameraResult = new PermissionUtils.IPermissionsResult() { @Override public void passPermissons() { onSheetDialogClick(1); } @Override public void forbitPermissons() { ToastUtil.showShortToast("没有权限!"); } }; public void checkFilePermissions(){ String[] permissions = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, }; //这里的this不是上下文,是Activity对象! PermissionUtils.getInstance().chekPermissions(mActivity, permissions, permissionsFileResult,1); } PermissionUtils.IPermissionsResult permissionsFileResult = new PermissionUtils.IPermissionsResult() { @Override public void passPermissons() { onSheetDialogClick(2); } @Override public void forbitPermissons() { ToastUtil.showShortToast("没有权限!"); } }; public void checkAlbumPermissions(){ String[] permissions = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, }; //这里的this不是上下文,是Activity对象! PermissionUtils.getInstance().chekPermissions(mActivity, permissions, permissionsAlbumResult,1); } //创建监听权限的接口对象 PermissionUtils.IPermissionsResult permissionsAlbumResult = new PermissionUtils.IPermissionsResult() { @Override public void passPermissons() { onSheetDialogClick(0); } @Override public void forbitPermissons() { ToastUtil.showShortToast("没有权限!"); } }; public void initDialog(){ if(null != sheetDialog){ return; } sheetDialog = new ActionSheetDialog(mActivity).builder(); sheetDialog.addSheetItem(getString(R.string.str_img_from_camera), null, new ActionSheetDialog.OnSheetItemClickListener() { @Override public void onClick(int which) { if(GlobalConstant.isAtRoomActivity){//还在视频过程中,不能拍照 ToastUtil.showShortToast("视频通话中,无法使用此功能"); }else{ checkCameraPermissions(); } } }); sheetDialog.addSheetItem(getString(R.string.str_img_from_album), null, new ActionSheetDialog.OnSheetItemClickListener() { @Override public void onClick(int which) { checkAlbumPermissions(); } }); //if (FileFlag=="1"){ if ("1".equals(FileFlag)){ sheetDialog.addSheetItem(getString(R.string.str_file_select), null, new ActionSheetDialog.OnSheetItemClickListener() { @Override public void onClick(int which) { checkFilePermissions(); } });} } /** * 相机选择和拍照 * @param items */ private void imageChooseItem(CharSequence[] items) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { initDialog(); if (mActivity == null || mActivity.isDestroyed() || mActivity.isFinishing()) { return; } sheetDialog.show(); } }); } private void onSheetDialogClick(int position){ //判断是否挂载了SD卡 String storageState = Environment.getExternalStorageState(); if(storageState.equals(Environment.MEDIA_MOUNTED)){ File savedir = new File(FILE_SAVEPATH); File tempdir = new File(TEMP_DIR_PATH); if (!savedir.exists()) { savedir.mkdirs(); } if (!tempdir.exists()) { tempdir.mkdirs(); } } else{ ToastUtil.showShortToast("SD卡未挂载,不能操作照片"); return; } //输出裁剪的临时文件 String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(new Date()); //照片命名 String origFileName = "byt_" + timeStamp + ".jpg"; String cropFileName = "byt_crop_" + timeStamp + ".jpg"; uploadOriPicPath = FILE_SAVEPATH + origFileName; uploadOriPicFile = new File(uploadOriPicPath); //裁剪头像的绝对路径 uploadPicPath = FILE_SAVEPATH + cropFileName; uploadPicFile = new File(uploadPicPath); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { origUri = FileProvider.getUriForFile(mActivity, AUTHORITY_NAME, uploadOriPicFile); }else{ origUri = Uri.fromFile(uploadOriPicFile); } cropUri = Uri.fromFile(uploadPicFile); //相册选图 if(position == 0) { if(singleOrMulti == SINGLE_CHOOSE){ startImagePick(); }else{ startActivity(); } } //手机拍照 else if(position == 1){ startActionCamera(); } //文件管理 else if(position == 2) { startActionFile(); } } private ArrayList<Image> mSelectImages = new ArrayList<>(); public static final int SELECT_IMAGE_REQUEST = 0x0011; private void startActivity() { Intent intent = new Intent(mActivity, SelectImageActivity.class); intent.putParcelableArrayListExtra("selected_images", mSelectImages); mActivity.startActivityForResult(intent, SELECT_IMAGE_REQUEST); } /** * 选择图片并直接裁剪 */ private void startImagePick() { // // 检查权限是否已授予 // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // if (!Environment.isExternalStorageManager()) { // // 如果没有权限,打开设置页面让用户授予权限 // Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); // mActivity.startActivityForResult(intent, REQUEST_CODE_STORAGE_PERMISSION); // return; // } // } // // 否则,执行正常的图片选择操作 Intent intent = new Intent(Intent.ACTION_PICK,null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); mActivity.startActivityForResult(Intent.createChooser(intent, "选择图片"),REQUEST_CODE_GETIMAGE_BYSDCARD); } /** * 相机拍照 */ private void startActionCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, selectFileUri/*this.getCameraTempFile()*/); // 添加这一句表示对目标应用临时授权该Uri所代表的文件 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } mActivity.startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCAMERA); } private void startActionFile() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); intent.addCategory(Intent.CATEGORY_OPENABLE); // 添加可打开的文件分类 mActivity.startActivityForResult(Intent.createChooser(intent, "选择文件"), REQUEST_CODE_GETFILE); } /** * 拍照后裁剪 * @param data 原始图片 */ private void startActionCrop(Uri data, boolean fromCamera) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(data, "image/*"); if (fromCamera && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } intent.putExtra("return-data", false); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1);// 裁剪框比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", CROP); intent.putExtra("outputY", CROP); intent.putExtra("scale", true); intent.putExtra("scaleUpIfNeeded", true);// 去黑边 intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri); mActivity.startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCROP); } private void startActionCrop2(File targetPhoto) { Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // intent.setAction(Intent.ACTION_OPEN_DOCUMENT); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setDataAndType(getUriByFileForN(targetPhoto), "image/*"); }else{ intent.setDataAndType(Uri.fromFile(targetPhoto), "image/*"); } intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri); intent.putExtra("return-data", false); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1);// 裁剪框比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", CROP); intent.putExtra("outputY", CROP); intent.putExtra("scale", true); intent.putExtra("scaleUpIfNeeded", true);// 去黑边 mActivity.startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCROP); } private void startActionCrop3(Uri sourceUri) { uploadPicFile = FileUtils.createImageFile(mActivity.getApplication(), true); Intent intent = new Intent("com.android.camera.action.CROP"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Android N 及以上版本,确保裁剪图片时可以访问文件 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setDataAndType(sourceUri, "image/*"); } // 设置裁剪输出文件的路径,针对不同版本需要做不同的处理 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 10 及以上版本,需要通过 FileProvider 获取 content:// URI intent.putExtra(MediaStore.EXTRA_OUTPUT, FileUtils.uri); // FileUtils.uri 是通过 FileProvider 提供的 URI } else { // 对于 Android 9 以下版本,使用 Uri.fromFile 来处理 file:// URI Uri imgCropUri = Uri.fromFile(uploadPicFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, imgCropUri); } //intent.putExtra("return-data", true); // 设置为 true 来返回裁剪数据 // 设置裁剪的相关参数 intent.putExtra("return-data", false); // 不返回裁剪数据,返回文件 URI intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); // 裁剪框的比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", CROP); // 裁剪后的宽度 intent.putExtra("outputY", CROP); // 裁剪后的高度 intent.putExtra("scale", true); // 允许缩放 intent.putExtra("scaleUpIfNeeded", true); // 去掉黑边 Log.d("yyyyy4", "needCutPicture="); mActivity.startActivityForResult(intent, REQUEST_CODE_GETIMAGE_BYCROP); } private Uri getImageContentUri(File imageFile){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = mActivity.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{filePath}, null); try { if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { if (imageFile.exists()) { Uri tempUri = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { tempUri = FileProvider.getUriForFile(mActivity, AUTHORITY_NAME, imageFile); }else{ tempUri = Uri.fromFile(imageFile); } return tempUri; } } }catch(Exception e){ e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } } else { return Uri.fromFile(imageFile); } return null; } /** * Android7.0根据文件获取uri */ private Uri getUriByFileForN( File imageFile) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = mActivity.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", new String[]{filePath}, null); if (cursor != null && cursor.moveToFirst()) { int id = cursor.getInt(cursor .getColumnIndex(MediaStore.MediaColumns._ID)); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + id); } else { Uri tempUri = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { tempUri = FileProvider.getUriForFile(mActivity, AUTHORITY_NAME, imageFile); }else{ tempUri = Uri.fromFile(imageFile); } return tempUri; } } /*************************************************************************/ /** * 选择相册图片时保存临时图片并获取图片临时路径 * @param data * @return */ private String getPhotoPathByUri(Intent data) { Uri contentUri = data.getData(); //copy file and send new file path String fileName = getFileName(contentUri); if (!TextUtils.isEmpty(fileName)) { File copyFile = new File(TEMP_DIR_PATH + File.separator + fileName); copy(contentUri, copyFile); return copyFile.getAbsolutePath(); } return null; } public String getFileName(Uri uri) { if (uri == null) return null; String fileName = null; String path = uri.getPath(); int cut = path.lastIndexOf('/'); if (cut != -1) { fileName = path.substring(cut + 1); } return fileName; } public void copy( Uri srcUri, File dstFile) { try { InputStream inputStream = mActivity.getContentResolver().openInputStream(srcUri); if (inputStream == null) return; OutputStream outputStream = new FileOutputStream(dstFile); IOUtils.copy(inputStream, outputStream); inputStream.close(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } private String saveSelectedFile(Uri srcUri) { String fileName = getFileName(srcUri); if (!TextUtils.isEmpty(fileName)) { File copyFile = new File(TEMP_DIR_PATH + File.separator + fileName); copy(srcUri, copyFile); return copyFile.getAbsolutePath(); } return null; } /*************************************************************************/ public String getUploadPicPath(){ return uploadPicPath; } public void setUploadPicPath(String uploadPicPath){ this.uploadPicPath = uploadPicPath; } public String getUploadOriPicPath(){ return uploadOriPicPath; } public void setUploadOriPicPath(String uploadOriPicPath){ this.uploadOriPicPath = uploadOriPicPath; } public String getUploadSelectFilePath(){ return uploadSelectFilePath; } public void setUploadSelectFilePath(String uploadSelectFilePath){ this.uploadSelectFilePath = uploadSelectFilePath; } public void dealOnActivityResult(int requestCode, int resultCode, Intent data,String AddFileFlag){ createFile(); Log.d("yyyyy0", "deal"); switch(requestCode) { case AddPictureFileUtils.REQUEST_CODE_GETIMAGE_BYCAMERA://拍照后的返回 if(!uploadOriPicFile.exists()) { //htc等手机可能存储在别的地方 Bitmap cameraBitMapData; if (data != null && data.hasExtra("data")) {//Intent带出 cameraBitMapData = data.getParcelableExtra("data"); } else { //存在系统路径 //获取系统拍照图片文件夹 Uri uri_DCIM = null; if (data.getData() != null) { uri_DCIM = data.getData(); } else { uri_DCIM = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } String DCIMPath = ""; //本次照片绝对路径 Cursor cr = mActivity.getContentResolver().query(uri_DCIM, new String[]{MediaStore.Images.Media.DATA}, null, null, MediaStore.Images.Media.DATE_MODIFIED + " desc");//降序排找最新的 if (cr.moveToFirst()) { DCIMPath = cr.getString(cr.getColumnIndex(MediaStore.Images.Media.DATA)); } cr.close(); cameraBitMapData = BitmapFactory.decodeFile(DCIMPath); } try { uploadOriPicFile.createNewFile(); //创建文件 FileOutputStream fos = new FileOutputStream(uploadOriPicFile); cameraBitMapData.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { LogUtils.w("=拍照图片保存发生异常!" + e); } } if(needCutPicture){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { try { startActionCrop3(getImageContentUri(uploadOriPicFile)); } catch (Exception e) { e.printStackTrace(); } } else { startActionCrop(getImageContentUri(uploadOriPicFile), true);//拍照后裁剪 } }else{ uplodTakePhotoFile(); } break; case AddPictureFileUtils.REQUEST_CODE_GETIMAGE_BYSDCARD://相册选择后的返回 Uri pickUri = data.getData(); Log.d("yyyyy", "pickUri: "+pickUri+"pickUri.getPath()"+pickUri.getPath()+"needCutPicture="+needCutPicture); if(pickUri != null && pickUri.getPath() != null){ if(needCutPicture){ Log.d("yyyyy1", "needCutPicture="+needCutPicture); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { try { Log.d("yyyyy2", "needCutPicture="+needCutPicture); //Uri fileUri = Uri.fromFile(new File(filePath)); Uri fileUri = FileProvider.getUriForFile(mActivity, "com.chinaiatb.mrdoctor.fileprovider", new File(getPhotoPathByUri(data))); //startActionCrop3(pickUri); startActionCrop3(fileUri); //startActionCrop2(new File(getPhotoPathByUri(data)));// 选图后裁剪 }catch (Exception e){ Log.d("yyyyy3", "needCutPicture="+needCutPicture); e.printStackTrace(); } }else{ startActionCrop2(new File(getPhotoPathByUri(data)));// 选图后裁剪 } }else{ uploadPhotoAlbumFile(data); } }else{ ToastUtil.showShortToast(getString(R.string.str_selected_pic_err)); } break; case AddPictureFileUtils.REQUEST_CODE_GETFILE: Uri pickFileUri = data.getData(); if (pickFileUri != null && pickFileUri.getPath() != null) { uploadSelectFilePath = getFilePathFromUri(mActivity.getApplicationContext(), pickFileUri); Log.d(TAG, "dealOnActivityResult: "+uploadSelectFilePath); fileType = getFileMimeType(mActivity.getApplicationContext(), pickFileUri); uploadSelectFile = new File(uploadSelectFilePath); String fileName = uploadSelectFile.getName(); selectedFileNames.add(fileName); uploadSelectFile(); if (uploadSelectFile.exists()) { Log.d(TAG, "文件保存成功"); // 执行其他操作 } else { Log.d(TAG, "文件保存失败"); // 处理文件保存失败的情况 } }break; case AddPictureFileUtils.SELECT_IMAGE_REQUEST://选择多张照片 if (data != null) { ArrayList<Image> selectImages = data.getParcelableArrayListExtra(SelectImageActivity.EXTRA_RESULT); uploadPhotoFiles(selectImages); } break; case REQUEST_CODE_GETIMAGE_BYCROP: // 单张剪裁后上传 Log.d("yyyyy11", "deal"); if (!uploadPicFile.exists()) { ToastUtil.showShortToast(getString(R.string.str_crop_pic_err)); } else { uploadAfterCutPhoto(); } break; } } public String getFileMimeType(Context context, Uri fileUri) { ContentResolver contentResolver = context.getContentResolver(); String fileMimeType = contentResolver.getType(fileUri); if (fileMimeType == null) { // 如果获取的MIME类型为空,尝试使用文件扩展名来推断MIME类型 String fileExtension = getFileExtension(context, fileUri); fileMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension); } return fileMimeType; } private String getFileExtension(Context context, Uri fileUri) { ContentResolver contentResolver = context.getContentResolver(); MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); // 从文件Uri获取文件名 String fileName = null; Cursor cursor = contentResolver.query(fileUri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { int displayNameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); if (displayNameIndex != -1) { fileName = cursor.getString(displayNameIndex); } } // 从文件名中获取扩展名 String fileExtension = null; if (fileName != null) { int dotIndex = fileName.lastIndexOf("."); if (dotIndex != -1 && dotIndex < fileName.length() - 1) { fileExtension = fileName.substring(dotIndex + 1).toLowerCase(); } } return fileExtension; } private String getFilePathFromUri(Context context, Uri uri) { String filePath = null; if (uri.getScheme().equals("content")) { ContentResolver contentResolver = context.getContentResolver(); Cursor cursor = contentResolver.query(uri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATA); filePath = cursor.getString(columnIndex); cursor.close(); } } else if (uri.getScheme().equals("file")) { filePath = uri.getPath(); } return filePath; } /** * 文件为空时创建文件 */ public void createFile(){ if(null == uploadPicFile){ uploadPicFile = new File(uploadPicPath); } if(null == uploadOriPicFile){ uploadOriPicFile = new File(uploadOriPicPath); } } /** * 拍照后上传原始图片 */ public void uplodTakePhotoFile(){ if(null != addPictureFileListener){ addPictureFileListener.uploadFile(uploadOriPicFile, FileUtils.getFileFormat(uploadOriPicPath)); Log.d(TAG, "uplodTakePhotoFile: "+uploadOriPicPath); } } /** * 从相册直接选择的单张照片 * @param data */ public void uploadPhotoAlbumFile(Intent data){ if(null != addPictureFileListener){ addPictureFileListener.uploadFile(new File(getPhotoPathByUri(data)), FileUtils.getFileFormat(uploadPicPath)); Log.d(TAG, "uploadPhotoAlbumFile: "+FileUtils.getFileFormat(uploadPicPath)); } } public void uploadSelectFile(){ if (selectedFileNames != null) { // 打印selectedFileNames数组 for (String fileName : selectedFileNames) { Log.d("Array", fileName); } } else { Log.d("Array", "selectedFileNames is null"); } if(null != addPictureFileListener){ addPictureFileListener.uploadSelectFileList(selectedFileNames); addPictureFileListener.uploadSelectFile(uploadSelectFile, FileUtils.getFileFormat(uploadSelectFilePath)); } } /** * 一组照片的上传 * @param selectImages */ public void uploadPhotoFiles(ArrayList<Image> selectImages){ if(null != addPictureFileListener){ addPictureFileListener.uploadFileList(selectImages); } } /** * 剪裁后的照片上传 */ public void uploadAfterCutPhoto(){ if(null != addPictureFileListener){ addPictureFileListener.uploadFile(uploadPicFile, FileUtils.getFileFormat(uploadPicPath)); } } private AddPictureFileListener addPictureFileListener; public interface AddPictureFileListener{ void uploadFile(File file, String suffix); void uploadSelectFile(File file, String suffix); void uploadFileList(ArrayList<Image> selectImages); void uploadSelectFileList(List<String> selectedFileNames); } public void setAddPictureFileListener(AddPictureFileListener addPictureFileListener){ this.addPictureFileListener = addPictureFileListener; } }哪些功能函数用到了getSDPath()函数
时间: 2025-07-22 13:37:21 浏览: 3
<think>好的,我现在需要分析用户提供的Java代码,找出哪些功能函数用到了`getSDPath()`函数。首先,我需要仔细查看代码中的各个方法,特别是那些可能调用`getSDPath()`的地方。
首先,在代码中搜索`getSDPath`的调用。注意到在`AddPictureFileUtils`类的构造函数中有这样的代码:
```java
public AddPictureFileUtils(Activity activity, int singleOrMulti, boolean needCrop){
this.mActivity = activity;
this.singleOrMulti = singleOrMulti;
if(needCrop){
FILE_SAVEPATH = getSDPath(mActivity.getBaseContext());
// SELECT_FILE_SAVEPATH = getSDPath(mActivity.getBaseContext());
TEMP_DIR_PATH = ParamsConfigs.TEMP_SAVE_PATH_11;
}
}
```
这里,当构造函数的参数`needCrop`为`true`时,`FILE_SAVEPATH`被赋值为`getSDPath(mActivity.getBaseContext())`。因此,这个构造函数调用了`getSDPath()`。
接下来,检查其他方法是否有调用`getSDPath()`。在代码的其他部分,比如`onSheetDialogClick`、`startActionCamera`等方法中,没有发现直接调用`getSDPath()`的情况。主要的调用点集中在上述的构造函数中。
因此,总结起来,`AddPictureFileUtils`类的构造函数`AddPictureFileUtils(Activity activity, int singleOrMulti, boolean needCrop)`在`needCrop`为`true`时调用了`getSDPath()`函数,用于设置`FILE_SAVEPATH`的值。
</think>
在提供的 `AddPictureFileUtils` 类中,**仅 `AddPictureFileUtils` 的带参构造函数** 调用了 `getSDPath()` 函数。具体分析如下:
### 调用位置
在 `AddPictureFileUtils` 类的构造函数 `AddPictureFileUtils(Activity activity, int singleOrMulti, boolean needCrop)` 中,当参数 `needCrop` 为 `true` 时,会调用 `getSDPath()` 函数,并将返回值赋值给成员变量 `FILE_SAVEPATH`:
```java
public AddPictureFileUtils(Activity activity, int singleOrMulti, boolean needCrop){
this.mActivity = activity;
this.singleOrMulti = singleOrMulti;
if(needCrop){
FILE_SAVEPATH = getSDPath(mActivity.getBaseContext()); // 调用 getSDPath()
// SELECT_FILE_SAVEPATH = getSDPath(mActivity.getBaseContext()); // 注释未生效
TEMP_DIR_PATH = ParamsConfigs.TEMP_SAVE_PATH_11;
}
}
```
### 调用目的
`getSDPath()` 函数的作用是获取存储路径(根据 Android 版本和 SD 卡状态选择私有目录或公共目录),而 `FILE_SAVEPATH` 是类中定义的图片保存路径。通过调用 `getSDPath()`,构造函数在 `needCrop` 为 `true` 时(需要裁剪图片的场景),将图片保存路径 `FILE_SAVEPATH` 初始化为 `getSDPath()` 返回的路径。
### 其他未调用的情况
在 `AddPictureFileUtils` 类的其他方法(如 `onSheetDialogClick`、`startActionCamera`、`dealOnActivityResult` 等)中,未发现对 `getSDPath()` 的直接调用。
阅读全文
相关推荐
















