Как правильно обрабатывать загрузку изображений сейчас, когда фоновые задачи не разрешены? - PullRequest
0 голосов
/ 24 января 2019

Для начала позвольте мне прояснить, что у меня нет опыта разработки для Android, и это мой первый проект с ним.

Я использую Cordova, чтобы создать простое приложение для моей компании, и в качестве требования необходимо сделать несколько снимков и загрузить их на наш сервер.

Первоначально он работал, когда тестовое устройство использовало Android 7, но после обновления до Android 8.1 загрузка изображений больше не работает или загружается только первое изображение.

Проверяя adb logcat, я обнаружил сообщения типа «ActivityManager: фоновый запуск запрещен» и «BroadcastQueue: фоновый запуск запрещен».

При поиске в Интернете кажется, что нацеливание на более старый SDK должно было сработать, но пока мне не повезло с этим.

Я также пробовал подключаемые модули, которые должны были запускать службу переднего плана в качестве обходного пути, но они также не работали.

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

Это не для клиентов за пределами компании, поэтому даже если мне придется держать пользователя на экране загрузки, показывающем ход загрузки, это не будет проблемой, скорее это даже может быть полезно, поэтому они наверняка знают загрузка прошла успешно

Чтобы уточнить кое-что: загрузка уже работала, и все еще работает с Android 7, мне не нужна библиотека для этого. Моя проблема в том, что Android 8 не позволяет выполнять загрузку в качестве фонового сервиса, и я не понял, как избежать использования фонового сервиса с Cordova.

1 Ответ

0 голосов
/ 25 января 2019

Я не работал с Кордовой.Я рекомендую использовать OKHTTP для загрузки изображений.В этом примере я показываю, как мои приложения отправляют изображения в сценарий PHP на стороне сервера.Настройте вещи в своей деятельности:

private File tmpDir;
tmpDir = new File(getFilesDir(),"Your Android File Directory");
if (!tmpDir.exists()) tmpDir.mkdirs();

String fpath = "Directory_path_of_your_picture";
String fname = "Filename_of_your_picture";
File fbody = new File(tmpDir, fname);

// Upload the file by making a call to the Uploader class
Uploader(fbody, fname, fpath);

Класс Uploader выглядит следующим образом:

    // Upload Class
    public static int Uploader(File file, String fname, String fpath) throws Exception {
        int statusCode = -1;
        final URL url = new URL("Your_Upload_Script");

        OkHttpClient.Builder b = new OkHttpClient.Builder();
        b.readTimeout(5000, TimeUnit.MILLISECONDS);
        b.writeTimeout(5000, TimeUnit.MILLISECONDS);
        b.connectTimeout(5000, TimeUnit.MILLISECONDS);
        final OkHttpClient client = b.build();

        RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("filename", fname)
            .addFormDataPart("MAX_FILE_SIZE","300000")
            .addFormDataPart("filepath", fpath)
            .addFormDataPart("uploadedfile", fname,
                    RequestBody.create(MEDIA_TYPE_TEXT, file))
            .build();

        Request request = new Request.Builder()
            .url(url)
            .post(requestBody)
            .build();

        Response response = client.newCall(request).execute();
        if (response.isSuccessful()) {
            // Successful Upload
            statusCode = response.code();
        }
        return statusCode;
    }

Наконец, настройте скрипт-получатель на сервере следующим образом (версия PHP, но выможет иметь различный бэкэнд в зависимости от ваших настроек):

// PHP script on the server
<?php
    $fname = $_POST['filename'];
    $fpath = $_POST['filepath'];
    $target_path = $_SERVER['DOCUMENT_ROOT'] . "/" . $fpath . "/" . $fname;
    $upload_path = $_FILES['uploadedfile']['tmp_name'];
    if(move_uploaded_file($upload_path, $target_path)) {
        echo "Moved";
    } else {
        echo "Not Moved";
    }
?>
...