Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FireStorage Java Android将图像保存到FireStorage需要上传两次_Java_Android_Firebase_Google Cloud Firestore_Firebase Storage - Fatal编程技术网

FireStorage Java Android将图像保存到FireStorage需要上传两次

FireStorage Java Android将图像保存到FireStorage需要上传两次,java,android,firebase,google-cloud-firestore,firebase-storage,Java,Android,Firebase,Google Cloud Firestore,Firebase Storage,我正在使用Firestore开发一个post系统,并使用Firebase存储来托管映像。用户必须填写5个字段,其中一个是要添加的图像。因此,为了让用户选择图像,我执行以下操作: img_imgpost.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // D

我正在使用Firestore开发一个post系统,并使用Firebase存储来托管映像。用户必须填写5个字段,其中一个是要添加的图像。因此,为了让用户选择图像,我执行以下操作:

     img_imgpost.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Defining Implicit Intent to mobile gallery
                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(
                            Intent.createChooser(
                                    intent,
                                    "Select Image from here..."),
                            PICK_IMAGE_REQUEST);
    
                }
            });
protected void onActivityResult(int requestCode,
                                    int resultCode,
                                    Intent data)
    {



        super.onActivityResult(requestCode,
                resultCode,
                data);


        // checking request code and result code
        // if request code is PICK_IMAGE_REQUEST and
        // resultCode is RESULT_OK
        // then set image in the image view
        if (requestCode == PICK_IMAGE_REQUEST
                && resultCode == RESULT_OK
                && data != null
                && data.getData() != null) {

            // Get the Uri of data
            ImageUri = data.getData();
            try {

                // Setting image on image view using Bitmap
                Bitmap bitmap = MediaStore
                        .Images
                        .Media
                        .getBitmap(
                                getContentResolver(),
                                ImageUri);
                img_imgpost.setImageBitmap(bitmap);
            }

            catch (IOException e) {
                // Log the exception
                e.printStackTrace();
            }
        }
    }
此时,当用户单击create post按钮时,应用程序将上载图像,然后上载用户在字段中输入的数据。因此,在firestore中,我们将有:

         |
         |
         --- title: "Post Title"
         |
         --- date: September 03, 2018 at 6:16:58 PM UTC+3
         |
         --- valutation: 8
         |
         --- urlImage: https// etc


         [...] etc
问题是,如果不执行两次“创建帖子”按钮的onclick事件,我就无法加载图像。事实上,如果按一次“创建帖子”,firestore中的URLMImage记录将为空,firestore上不会加载图像

单击“创建帖子”按钮:

btn_invia.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
progress.setVisibility(View.VISIBLE);
posted=“”;
字符串[]字符格式=新字符串[]{“a”、“b”、“c”、“d”、“e”、“f”、“z”、“3”、“*”、“#”、“%”、“&”、“^”、“r”、“!”、“j”、“h”、“q”};//18个字符
对于(int i=0;i而言,
uploadImage()
方法似乎是异步运行的,
uploadDataOnFirestore
uploadImage
之后立即运行,而无需等待上载图像,因此图像为
null

要解决此问题,请移动uploadImage任务的
OnCompleteListener
onComplete
方法中的
uploadDataOnFirestore
方法调用,以便在运行
uploadDataOnFirestore
uploadImage()之前图像已完成上载
方法似乎是异步运行的,
uploadDataOnFirestore
uploadImage
之后运行,而不等待上载图像,因此图像为
null

要解决此问题,请移动uploadImage任务的
OnCompleteListener
onComplete
方法中的
uploadDataOnFirestore
方法调用,以便在运行
uploadDataOnFirestore

btn_invia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progress.setVisibility(View.VISIBLE);
                postId = "";

                String [] charsForId = new String[] {"a", "b", "c", "d", "e", "f", "z", "3", "*", "#", "%", "&", "^", "r", "!", "j", "h", "q"}; //18 chars

                for(int i = 0; i<20; i++){
                    postId += charsForId[(int) Math.floor((Math.random() * 17) + 0)];
                }
                Toast.makeText(posta.this, postId, Toast.LENGTH_SHORT).show();
                descriz = descr.getText().toString();
                titolo = title.getText().toString();
                valut = vote.getText().toString();

                uploadImage();
                uploadDataOnFirestore(postId, descriz, titolo, valut, genre);




            }
        });