У меня есть приложение Android, которое я создаю, с функцией, позволяющей пользователю экспортировать созданные данные в zip-файл. Я прошу их выбрать папку на их устройстве Android для хранения zip-файла - скорее всего, это будет внешняя SD-карта. Я использую Intent.ACTION_CREATE_DOCUMENT для создания нового файла, но я не могу записать путь к устройству, чтобы проверить, достаточно ли места для хранения zip-файла. Мне известно, что Uri, возвращаемый из ACTION_CREATE_DOCUMENT, не содержит информации о каталоге как способ обеспечения большей безопасности. Кто-нибудь знает способ определить доступное хранилище, не предполагая, что пользователь выбрал хранилище SDCard?
Вот мой код, сокращенный:
public void Export_Operation_Init() {
//https://developer.android.com/training/data-storage/shared/documents-files#create-file
// Allow the user to choose a location to save the export using the system's file picker.
Intent intent_GetExportSaveAsFile = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent_GetExportSaveAsFile.addCategory(Intent.CATEGORY_OPENABLE);
intent_GetExportSaveAsFile.setType("application/zip");
//Generate the name of the zip file:
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String sTemp = sdf.format(timestamp);
String sZipFileName = "NHComicManager_Backup_" + sTemp + ".zip";
intent_GetExportSaveAsFile.putExtra(Intent.EXTRA_TITLE, sZipFileName);
//Start the activity:
startActivityForResult(intent_GetExportSaveAsFile, REQUEST_CODE_GET_EXPORT_SAVEAS_FILE);
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
Uri uriZipFile = resultData.getData();
String sUriString = uriZipFile.toString();
//Begin check for available space...
//?????
//...end check for available space.
Intent ExportIntent = new Intent(this, ExportComicsService.class);
ExportIntent.putExtra(ExportComicsService.ZIP_FILE, sUriString);
startService(ExportIntent);
}
Вот мой код в моем сервисе, который создает поток вывода файла, но я хотел бы проверить наличие места, прежде чем перейти к этому этапу:
@Override
protected void onHandleIntent(Intent intent) {
try {
//create ZipOutputStream to write to the zip file
String sUriString = intent.getStringExtra(ZIP_FILE);
Uri uriZipFile = Uri.parse(sUriString);
ParcelFileDescriptor pfd = getContentResolver().
openFileDescriptor(uriZipFile, "w");
FileOutputStream fos = new FileOutputStream(pfd.getFileDescriptor());
ZipOutputStream zos = new ZipOutputStream(fos);
//Begin zip file processing....
//...end zip file processing.
zos.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}