Android: загрузка фотографий из Facebook в Fireabse возвращает 404 - PullRequest
0 голосов
/ 07 ноября 2018

Итак, я кодирую приложение для Android, которое берет фотографии с Facebook и сохраняет их в базе данных Firebase.

Я использую graph-api для получения URL-адресов картинок, и это прекрасно работает, так как я могу разместить URL-адреса в браузере, и картинки появляются.

Теперь я хочу использовать UploadTask для загрузки этих картинок в firebase, и я получаю:

E/StorageException: StorageException has occurred.
    Object does not exist at location.
     Code: -13010 HttpResult: 404
11-07 19:58:00.894 8612-9182/com.finder E/StorageException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object"  }}
    java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object"  }}
        at com.google.firebase.storage.network.NetworkRequest.parseResponse(com.google.firebase:firebase-storage@@16.0.4:455)
        at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(com.google.firebase:firebase-storage@@16.0.4:435)
        at com.google.firebase.storage.network.NetworkRequest.processResponseStream(com.google.firebase:firebase-storage@@16.0.4:426)
        at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@16.0.4:280)
        at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@16.0.4:294)
        at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(com.google.firebase:firebase-storage@@16.0.4:65)
        at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(com.google.firebase:firebase-storage@@16.0.4:57)
        at com.google.firebase.storage.GetDownloadUrlTask.run(com.google.firebase:firebase-storage@@16.0.4:71)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818) 

Вот мой метод загрузки:

static class UploadPicAsyncWrapperTask extends AsyncTask<String, Void, Void> {
            @Override
            protected Void doInBackground(String... strings) {

                String picsFolder = strings[0];
                String id = strings[1];
                final String url = strings[2];
                final String profilepicNodeName = strings[3];
                final String picsNodeName = strings[4];

                final StorageReference filePathRoot = FirebaseStorage.getInstance().getReference().child(picsFolder).child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                final StorageReference filePath;

                filePath = filePathRoot.child(id);

                filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        // File already exists
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {

                        final UploadTask uploadTask;

                        try (InputStream is = new URL(Uri.encode(url)).openStream()) {
                            uploadTask = filePath.putStream(is); //Uri.fromFile(new File(url));  //Uri.parse(url) new ByteArrayInputStream()

                            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                                    filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                        @Override
                                        public void onSuccess(Uri uri) {
                                            if (profilePicName == null) {
                                                mUserDatabase.child(profilepicNodeName).setValue(uri.toString());
                                                profilePicName = uri.toString();

                                            } else {
                                                mUserDatabase.child(picsNodeName).child(Helper.imageUrlToFirebasePath(uri.toString())).setValue(uri.toString());
                                            }
                                            --picsRemaining;
                                        }
                                    });
                                }
                            });
                        } catch (MalformedURLException e) {
                            // TODO or not todo whatever
                        } catch (IOException e) {
                            // TODO or not todo whatever
                        }
                    }
                });

                return null;
            }
        }

И вот как называется asyncTask:

new UploadPicAsyncWrapperTask().execute(getString(R.string.firebase_storage_pics_folder), id, url, getString(R.string.firebase_database_profilepic_node_name), getString(R.string.firebase_database_pics_node_name));

Кто-нибудь знает, почему пожарная база не может поймать фотографии?

1 Ответ

0 голосов
/ 08 ноября 2018

Итак, в моем коде нет ничего плохого. Поскольку я не могу спросить Firebase, загружено ли уже изображение в базу данных, я прошу firebase предоставить мне downloadUrl этого изображения, и в onFailureListener я загружаю изображение.

Что я не знал, так это то, что неявный onFailureListener регистрирует сообщение об ошибке выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...