توی کد زیر 
من از روش انتخاب پوشه توسط کاربر و ذخیره مسیر استفاده کردم و در کد زیر فرستادم برای دانلود 

	private void executeOperation(String itemKey) {
		VerticalItem selectedItem = findVerticalItemByKey(itemKey);

		if (selectedItem == null) {
			dialogManager.shoerrorcoincast();
			return;
		}

		List<Object> params = selectedItem.getParams();
		if (params != null && params.size() >= 5) {
			try {
				long requiredSpace = ((Number) params.get(0)).longValue();
				String jsonKey = (String) params.get(1);
				String subPath = (String) params.get(2);
				String fileName = (String) params.get(3);
				int storageDialogId = ((Number) params.get(4)).intValue();

				// دریافت مسیر انتخاب‌شده از SharedPreferences
				SharedPreferences prefs = getSharedPreferences("permsStatus", Context.MODE_PRIVATE);
				String folderUriString = prefs.getString("folderUri", null);

				if (folderUriString == null) {
					dialogManager.shoerrorcoincast();
					return;
				}

				Uri folderUri = Uri.parse(folderUriString);
				DocumentFile baseDir = DocumentFile.fromTreeUri(this, folderUri);

				if (baseDir == null || !baseDir.canWrite()) {
					dialogManager.shoerrorcoincast();
					return;
				}

				// ساخت زیرپوشه‌ها از subPath
				DocumentFile targetDir = createSubDirectories(baseDir, subPath);
				if (targetDir == null) {
					dialogManager.shoerrorcoincast();
					return;
				}

				// اجرای متد دانلود
				gg(requiredSpace, jsonKey, targetDir, fileName, storageDialogId);

			} catch (ClassCastException | IndexOutOfBoundsException e) {
				dialogManager.shoerrorcoincast();
			}
		} else {
			dialogManager.shoerrorcoincast();
		}
	}


و 

private void gg(long requiredSpace, final String jsonKey, final DocumentFile targetDir, final String fileName, int storageDialogId) {
		long totalAvailableSpace = getInternalAvailableSpace();

		if (totalAvailableSpace < requiredSpace) {
			showStorageDialog(storageDialogId);
			return;
		}

		if (targetDir == null || !targetDir.canWrite()) {
			myToast.showToastfa("مسیر ذخیره‌سازی معتبر نیست یا قابل نوشتن نیست.");
			return;
		}

		dataManager.fetchDataFromServer(new DataManager.DataCallback() {
			@Override
			public void onSuccess(JsonArray jsonArray) {
				for (int i = 0; i < jsonArray.size(); i++) {
					JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
					if (jsonObject.has(jsonKey)) {
						String g1Value = jsonObject.get(jsonKey).getAsString();
						String decryptedUrl = ppsspp.decrypt(g1Value);

						// حذف فایل موجود
						DocumentFile existingFile = targetDir.findFile(fileName);
						if (existingFile != null && existingFile.exists()) {
							existingFile.delete();
						}

						// ساخت فایل جدید
						DocumentFile newFile = targetDir.createFile("application/octet-stream", fileName);
						if (newFile != null) {
							downloadManager.startDownload(decryptedUrl, newFile.getUri());
							myToast.showToasttru(getString(R.string.yesFailureback));
						} else {
							myToast.showToastfa("خطا در ایجاد فایل برای دانلود");
						}
						break; // فقط اولین مورد با jsonKey رو پردازش کن
					}
				}
			}

			@Override
			public void onFailure(Throwable t) {
				dialogManager.nojsonp();
			}
		});
	}









چون که جدیدا اومدم از طریق داکیومنت فایل و انتخاب پوشه از کاربر دسترسی گرفتم کلاس دانلود منو با دایرکتوری داکیومنت گرفته شده از کاربر فقط هماهنگ کن 


در قسمت بعدی کد کامل کلاس دانولد رو میفرستم همه کد رو اصلاح کن و بهینه کن