Попытка получить изображение из Firebase, чтобы пользователь мог установить изображение профиля, но его пустое - PullRequest
2 голосов
/ 03 мая 2020

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

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    ImageView imageView;
    public static final int IMAGE_CODE = 1;
    Uri imageUri;
    private StorageReference storageReference;
    private DatabaseReference databaseReference;
    FirebaseUser user;
    String userid;

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView) headerView.findViewById(R.id.profilepic);
        user = FirebaseAuth.getInstance().getCurrentUser();
        userid = user.getUid();
        storageReference = FirebaseStorage.getInstance().getReference("Images");
        databaseReference = FirebaseDatabase.getInstance().getReference("uploads").child(userid);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openimage();
            }
        });
        profileImage(); 
   }

   private void profileImage(){
   databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              if(dataSnapshot.exists()) {
                  Upload upload = dataSnapshot.getValue(Upload.class);
                  Glide.with(getApplicationContext()).load(upload.getUplaodUri()).into(imageView);
              }
          }

          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {
              Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();

          }
      });
   }

   private void openimage() {
        Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        startActivityForResult(galleryIntent, IMAGE_CODE);
    }


    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
            if (!Settings.canDrawOverlays(this)) {
                // You don't have permission
                checkPermission1();
            } else {
                // Do as per your logic
            }

        }
        if (requestCode == IMAGE_CODE && resultCode == RESULT_OK && null != data && data.getData() != null) {
            imageUri = data.getData();
            Glide.with(this).load(imageUri).into(imageView);

            fileUploader();

        }
    }
    private String getFileExtension(Uri uri){
        ContentResolver cr = getContentResolver();
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        return mimeTypeMap.getExtensionFromMimeType(cr.getType(uri));
    }
    private void fileUploader(){
        if(imageUri != null){
            StorageReference reference = storageReference.child(userid + ".jpeg");

            reference.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            Upload upload = new Upload(uri.toString());
                            databaseReference.setValue(upload).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                profileImage();
            }
        });
                        }
                    });



                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
;;
                }
            });

        }else{
            Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();

        }

    }
}

Структура базы данных

Редактировать:

2020-05-03 15:55:51.232 25230-25407/com.example.carcrashdetection E/StorageException: StorageException has occurred.
    Object does not exist at location.
     Code: -13010 HttpResult: 404
2020-05-03 15:55:51.235 25230-25407/com.example.carcrashdetection E/StorageException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object",    "status": "GET_OBJECT"  }}
    java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object",    "status": "GET_OBJECT"  }}
        at com.google.firebase.storage.network.NetworkRequest.parseResponse(com.google.firebase:firebase-storage@@19.1.1:433)
        at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(com.google.firebase:firebase-storage@@19.1.1:450)
        at com.google.firebase.storage.network.NetworkRequest.processResponseStream(com.google.firebase:firebase-storage@@19.1.1:441)
        at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@19.1.1:272)
        at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@19.1.1:286)
        at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(com.google.firebase:firebase-storage@@19.1.1:70)
        at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(com.google.firebase:firebase-storage@@19.1.1:62)
        at com.google.firebase.storage.GetDownloadUrlTask.run(com.google.firebase:firebase-storage@@19.1.1:76)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

Также изображение находится в навигационном ящике и должен быть уникальным для каждого пользователя. Может кто-нибудь сказать мне, где я иду не так?

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете сделать это так:

reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
   @Override
    public void onSuccess(Uri uri) {
           Upload upload = new Upload(uri.toString());
           String uploadId = databaseReference.child(userid).push().getKey();
           databaseReference.child(uploadId).setValue(upload);
    }
});

Хранилище Firebase Документы

И в этой строке есть проблема:

Glide.with(getApplicationContext()).load(upload).into(imageView);

Загрузить это объект. Вы должны использовать upload.getUploadUri ()

if(dataSnapshot.exists()) {
   for (DataSnapshot ds : dataSnapshot.getChildren()){
        Upload upload = ds.getValue(Upload.class);
        Glide.with(getApplicationContext()).load(upload.getUplaodUri()).into(imageView);    
   }

}

Вы всегда видите последнее загруженное изображение таким образом. Если у пользователя есть изображение, вам не нужно использовать uploadId.

Изображение профиля:

    Upload upload = new Upload(uri.toString());
    databaseReference.setValue(upload);

и:

 if(dataSnapshot.exists()) {
       Upload upload = dataSnapshot.getValue(Upload.class);
       Glide.with(getApplicationContext()).load(upload.getUplaodUri()).into(imageView); 
 }

более полезно для вас.

...