Определите доступное пространство перед созданием FileOutputStream из ParcelFileDescriptor из Intent.ACTION_CREATE_DOCUMENT - PullRequest
0 голосов
/ 04 августа 2020

У меня есть приложение 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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...