Облачное хранилище Google - загрузка объекта из приложения Android - PullRequest
0 голосов
/ 08 января 2020

Я пишу простую библиотеку android, которая загружает файлы, хранящиеся в GCS. Приведенный ниже код отлично работает

Storage storage = StorageOptions.newBuilder()
                        .setProjectId(PROJECT_ID)
                        .setCredentials(ServiceAccountCredentials.fromStream(getAssets().open(JSON_CREDENTIAL)))
                        .build()
                        .getService();
            Blob blob = storage.get(BlobId.of(BUCKET_NAME, BLOB_NAME));
            ReadChannel readChannel = blob.reader();
            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
            fileOutputStream.getChannel().transferFrom(readChannel, 0, Long.MAX_VALUE);
            fileOutputStream.close();

1) Но проблема в том, что мне нужно дать прогресс загрузки, и я не смог найти никаких обратных вызовов для вышеуказанных методов?

2) Кроме того, это лучший способ загрузки файлов из GCS в android приложение. Я не могу использовать firebase, потому что этот код присутствует в библиотеке и используется многими клиентскими приложениями, а firebase требует, чтобы все клиентские приложения были связаны с учетной записью firebase, чего я не хочу делать.

1 Ответ

0 голосов
/ 08 января 2020

Как сказал @ Doug , возможность получить индикатор выполнения лучше с потоками.

Ваш код будет выглядеть примерно так:

        Storage storage = StorageOptions.newBuilder()
                                .setProjectId(PROJECT_ID)
                                .setCredentials(ServiceAccountCredentials.fromStream(getAssets().open(JSON_CREDENTIAL)))
                                .build()
                                .getService();
        int BUFFER_SIZE = 64 * 1024;
        Blob blob = storage.get(BlobId.of(BUCKET_NAME, BLOB_NAME));
        ReadChannel readChannel = blob.reader();
        byte[] content = null;
        if (blob != null) {
            reader = blob.reader();
            ByteBuffer bytes = ByteBuffer.allocate(BUFFER_SIZE);

            while (reader.read(bytes) > 0) {
                bytes.flip();
                content = ArrayUtils.addAll(content,bytes.array());
                bytes.clear();
                //Here you can add the progress bar logic
            }
        }

        FileOutputStream fileOutputStream = new FileOutputStream(filePath);
        fileOutputStream.write(content);
        fileOutputStream.close();
...