【问题标题】:Getting android.os.TransactionTooLargeException When uploading to Firebase上传到 Firebase 时获取 android.os.TransactionTooLargeException
【发布时间】:2017-05-12 16:46:44
【问题描述】:

我正在尝试将对象上传到 Firebase。该对象包括照片、标题、详细信息和时间戳。我收到了错误:

 java.lang.StackOverflowError: stack size 8MB

android.os.TransactionTooLargeException: data parcel size 1071868 bytes

尽管照片很小,只有 108KB,但我在尝试上传照片时遇到错误。

这是我将照片和相关信息上传到 Firebase 的方法:

    private void publishNews() {

    final String title = etTitle.getText().toString();
    final String detail = etDetail.getText().toString();

    StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("news");
    StorageReference imgRef = storageReference.child(imgUri.getLastPathSegment());

    final UploadTask uploadTask = imgRef.putFile(imgUri);

    // Show alert for loading
    android.app.AlertDialog.Builder alertDialogBuilder = new android.app.AlertDialog.Builder(getActivity(), R.style.CustomTheme_Dialog_Upload)
            .setTitle("Uploading...")
            .setMessage("1 %")

            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                        /* Dismiss the dialog */
                    uploadTask.cancel();
                    dialog.dismiss();
                }
            })
            .setIcon(R.drawable.ic_cloud_upload_black_24dp);

    final android.app.AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
    alertDialog.setCancelable(false);

    // Upload file to firebase on storageRef location
    uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
            @SuppressWarnings("VisibleForTests")
            double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
            alertDialog.setMessage((int) progress + " %");
        }
    })
            .addOnSuccessListener(getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    if(taskSnapshot.getDownloadUrl() == null) {
                        alertDialog.setMessage("Sorry there was a problem");
                        return;
                    }
                    alertDialog.setMessage("Saving...");

                    Uri photoDownloadUrl = taskSnapshot.getDownloadUrl();

                    final HashMap<String, Object> newsObj = new HashMap<>();
                    newsObj.put("photoUrl", photoDownloadUrl);
                    newsObj.put("title", title);
                    newsObj.put("detail", detail);
                    newsObj.put("timestamp", ServerValue.TIMESTAMP);

                    FirebaseDatabase database = FirebaseDatabase.getInstance();
                    database.getReference().child("news").push().setValue(newsObj).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            alertDialog.dismiss();
                        }
                    });
                }
            })

            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
                    alertDialog.setMessage("Failed to upload");
                }
            })

            .addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
                    alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
                    alertDialog.setMessage("Upload paused ");
                }
            });

}

挑选照片后获取图片uri的代码:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // After picking a photo
    if (requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK) {

        imgUri = data.getData();

        Glide.with(getActivity()).load(imgUri).into(imbAddPhoto); 
    }
}

奇怪的是,我曾经成功过一次,但后来我一直收到这个错误。感谢您的任何建议。

【问题讨论】:

  • “我在尝试上传照片时遇到错误,尽管它很小,只有 108KB”——这可能是 磁盘 上照片的大小。重要的是Bitmap 在内存中 的大小。照片在磁盘上被压缩。除此之外,请编辑您的问题并为您的OutOfMemoryError 发布整个 Java 堆栈跟踪。
  • 感谢您的帮助,我想我找到了问题所在。是 photoDownloadUrl,它必须是 String 而不是 Uri。

标签: android firebase firebase-realtime-database firebase-storage


【解决方案1】:

问题是 photoDownloadUrl 必须是字符串而不是 Uri。这是正确的版本:

                    String photoDownloadUrl = String.valueOf(taskSnapshot.getDownloadUrl());

                    final HashMap<String, Object> newsObj = new HashMap<>();
                    newsObj.put("photoUrl", photoDownloadUrl);
                    newsObj.put("title", title);
                    newsObj.put("detail", detail);
                    newsObj.put("timestamp", ServerValue.TIMESTAMP);

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 2019-06-28
    • 2019-10-23
    • 2020-12-05
    • 2021-09-04
    • 2016-12-30
    • 2020-11-19
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多