java.lang.String android.net.Uri.toString () для пустой ссылки на объект, LogCat показывает эту ошибку в строке 202 - PullRequest
0 голосов
/ 02 июля 2019

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

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

    mSaveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String name=mProfileName.getText().toString();
            if(!TextUtils.isEmpty(name) && mainImageUri!=null){
                mProgressBar.setVisibility(View.VISIBLE);
                if(isChanged){
                //The task of storing the data goes through uploading the image as well.

            user_id = mUser.getUid();

            final StorageReference image_path= mStorageReference.child("profile_photo").child(user_id+".jpg");
            image_path.putFile(mainImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                         if(task.isSuccessful()){
                            storeFireStore(image_path,name);
                         }else{
                             String error = task.getException().getMessage();
                             Toast.makeText(SetUpActivity.this,"Image Error: "+error,Toast.LENGTH_SHORT).show();

                         }
                    mProgressBar.setVisibility(View.INVISIBLE);

                }
            });

        }else{
                    //The task of storing the data does not go through uploading the image.
                    storeFireStore(null,name);
                    mProgressBar.setVisibility(View.INVISIBLE);
                }
            }

        }
    });

}

private void storeFireStore(StorageReference image_path, final String name) {
    final Uri[] download_uri = new Uri[1];
    if(image_path!=null){
        image_path.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                download_uri[0] =uri;
                Log.d(TAG,"Download Url obtained");
            }
        });
        } else{
        download_uri[0] =mainImageUri;
        Log.d(TAG,"Download Url obtained in else");
    }

Map<String,String> userMap=new HashMap<>();
userMap.put("image", download_uri[0].toString());//line 202 this is 
where the error occurs.userMap.put("name",name);

Я ожидаю получить значение downLoad_uri, но оно дает нулевое значение

Ответы [ 2 ]

1 голос
/ 02 июля 2019

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

Просто используйте приведенный ниже код для загрузки изображения в хранилище Firebase.

    image_path.putFile(mainImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
       @Override
       public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
         if(task.isSuccessful()){

           // HERE YOU CAN DIRECTLY GET DOWNLOAD URL OF UPLOADED IMAGE USING TASK RESULT.
           String downloadUrl = String.valueOf(taskSnapshot.getDownloadUrl());
           storeFireStore(downloadUrl,name);

         } else {

           String error = task.getException().getMessage();
           Toast.makeText(SetUpActivity.this,"Image Error: "+error,Toast.LENGTH_SHORT).show();

         }
         mProgressBar.setVisibility(View.INVISIBLE);
       }
    });

И внесите изменения в метод storeFireStore, как показано ниже,

    private void storeFireStore(String image_path, final String name) {

        Map<String, String> userMap = new HashMap<>();
        userMap.put("image", image_path != null ? image_path : "");//line 202 this is where the error occurs.
        userMap.put("name", name);

    }
1 голос
/ 02 июля 2019

image_path.getDownloadUrl().addOnSuccessListener() является асинхронным и возвращается немедленно, прежде чем результаты операции будут завершены. Ваш код продолжает обращаться к массиву download_uri, который инициализируется нулевыми значениями. Вы можете ожидать, что массив будет иметь заполненное значение после завершения обратного вызова.

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