【问题标题】:Social Network app: Profile photos don't appear correctly社交网络应用程序:个人资料照片显示不正确
【发布时间】:2021-10-11 23:45:33
【问题描述】:

我使用 Java 语言创建了一个社交网络应用程序,该应用程序能够插入图片作为个人资料照片。如果我尝试上传我的照片,它可以工作,但如果其他用户尝试使用其他设备进行上传,他们看不到我的照片,我也看不到他们的照片。基本上每个人都使用自己的设备查看自己的照片。

然而,尽管我的头像上传正确,但它往往会在一段时间后消失。

如何解决?

截图:

https://i.stack.imgur.com/SXo99.jpg

尝试设置头像的代码:

firebaseFirestore.collection("Users").document(user_id).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {

            if(task.isSuccessful()){

                if(task.getResult().exists()){

                    String name = task.getResult().getString("name");
                    String image = task.getResult().getString("image");
                    String about = task.getResult().getString("about");
                    String skills = task.getResult().getString("skills");

                    mainImageUri = Uri.parse(image);

                    setupName.setText(name);
                    setupAbout.setText(skills);
                    setupSkills.setText(about);

                    RequestOptions placeholderRequest = new RequestOptions();
                    placeholderRequest = placeholderRequest.placeholder(R.drawable.defaultuser);

                    Glide.with(getApplicationContext())
                            .setDefaultRequestOptions(placeholderRequest)
                            .load(image)
                            .into(setupImage);

                }

            } else {

                String error = task.getException().getMessage();

                Toast.makeText(SetupActivity.this, "C'è stato un problema, riprova per favore.", Toast.LENGTH_LONG).show();

            }

            progressBar.setVisibility(View.INVISIBLE);
            setupButton.setEnabled(true);
        }
    });

    setupButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            final String user_name = setupName.getText().toString();
            final String about = setupAbout.getText().toString();
            final String userSkills = setupSkills.getText().toString();


            if (!TextUtils.isEmpty(user_name) && mainImageUri != null) {
            progressBar.setVisibility(View.VISIBLE);

            if (isChanged) {

                    user_id = firebaseAuth.getCurrentUser().getUid();
                    final StorageReference image_path = storageReference.child("profile_images").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(task, user_name, about, userSkills, image_path);
                            } else {

                                Toast.makeText(SetupActivity.this, "C'è stato un problema, riprova per favore.", Toast.LENGTH_LONG).show();
                                progressBar.setVisibility(View.INVISIBLE);
                            }


                        }
                    });

                } else {


                storeFirestore(null, user_name, about, userSkills, null);
            }

            } else {

             if(TextUtils.isEmpty(user_name))
                {
                    Toast.makeText(SetupActivity.this, "Per favore, inserisci un nickname!", Toast.LENGTH_LONG).show();
                } else
                {
                    Toast.makeText(SetupActivity.this, "Per favore, inserisci una foto profilo!", Toast.LENGTH_LONG).show();
                }

            }
        }
    });

    setupImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                if (ContextCompat.checkSelfPermission(SetupActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_DENIED) {
                    Snackbar snackbar = Snackbar.make(view, "Hai autorizzato l'app ad accedere al tuo archivio esterno?", Snackbar.LENGTH_SHORT);
                    snackbar.show();
                    ActivityCompat.requestPermissions(SetupActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                } else {
                   BringImagePicker();
                }
            } else {
                BringImagePicker();
            }
        }
    });

}

private void storeFirestore(Task<UploadTask.TaskSnapshot> task, String user_name,
                            String userSkills, String about, StorageReference image_path){

    Uri download_uri = null;
    if(task != null) {

         task.getResult().getStorage().getDownloadUrl();

    } else {

       download_uri = mainImageUri;

    }
    Map<String, String> userMap = new HashMap<>();
     userMap.put("skills", userSkills);
    userMap.put("name", user_name);
    userMap.put("about", about);
    userMap.put("image", download_uri.toString());
    userMap.put("user_id", user_id);


    firebaseFirestore.collection("Users").document(user_id).set(userMap).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()){

                Toast.makeText(SetupActivity.this, "Le impostazioni sono state aggiornate!", Toast.LENGTH_LONG).show();
                Intent mainIntent = new Intent(SetupActivity.this, MainActivity.class);
                startActivity(mainIntent);
                finish();
            } else {

                Toast.makeText(SetupActivity.this, "C'è stato un problema, riprova per favore.", Toast.LENGTH_LONG).show();

            }

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

第一行中的“user_id”是“firebaseAuth.getCurrentUser().getUid();”

onActivityResult 的代码:

https://i.stack.imgur.com/BTRJv.png

【问题讨论】:

    标签: java android google-cloud-firestore firebase-storage


    【解决方案1】:

    这看起来不对:

    Uri download_uri = null;
    if(task != null) {
    
         task.getResult().getStorage().getDownloadUrl();
    
    } else {
    
       download_uri = mainImageUri;
    
    }
    

    我建议研究getting a download URL(或here)上的文档,因为这是获取下载 URL 的唯一方法。

    在你的情况下,应该是这样的:

    private void storeFirestore(Task<UploadTask.TaskSnapshot> task, String user_name,
                                String userSkills, String about, StorageReference image_path){
        image_path.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri download_uri) {
                Map<String, String> userMap = new HashMap<>();
                userMap.put("skills", userSkills);
                userMap.put("name", user_name);
                userMap.put("about", about);
                userMap.put("image", download_uri.toString());
                userMap.put("user_id", user_id);
        
                firebaseFirestore.collection("Users").document(user_id).set(userMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
            
                            Toast.makeText(SetupActivity.this, "Le impostazioni sono state aggiornate!", Toast.LENGTH_LONG).show();
                            Intent mainIntent = new Intent(SetupActivity.this, MainActivity.class);
                            startActivity(mainIntent);
                            finish();
                        } else {
            
                            Toast.makeText(SetupActivity.this, "C'è stato un problema, riprova per favore.", Toast.LENGTH_LONG).show();
            
                        }
            
                        progressBar.setVisibility(View.INVISIBLE);
                    }
                });   
            }
        });
    }
    

    【讨论】:

    • 感谢您的回答" userMap.put("图像", download_uri.toString());" to "userMap.put("image", image_path.toString());"...我真的卡在这里了...
    • 这是一个新问题,在这种情况下听起来你没有初始化image_path。在这种情况下你也可以拨打task.getResult().getStorage().getDownloadURL()
    • 嘿@Johnny1994 这里还有更新吗?
    • 我有一些问题,我无法为这个错误发布我的应用程序...我要推翻我的项目...无论如何感谢您的帮助:)
    • 什么是错误?您获取下载 URL 的方式有误,我指出了如何修复。你实施了改变吗? userMap.put("image", download_uri.toString()); 现在在调试器中检查时是否包含正确的值?
    【解决方案2】:

    根据文档,您需要使用 onSuccessListener 来确保下载 URL 已实际填写并可以使用。

    我看到您调用了两次 storeFirestore 函数,第 79 行的一次使用带有 null 值的 image_path 参数。这可能是您在上面的 cmets 中提到的崩溃的原因。

    你可以试试这样的:

    private void storeFirestore(Task<UploadTask.TaskSnapshot> task, String user_name,
                                String userSkills, String about, StorageReference image_path){
        Uri download_uri = null;
        if (image_path != null) {
           download_uri = image_path.getDownloadUrl();
        }
        else if(task != null) {
           download_uri = task.getResult().getStorage().getDownloadUrl();
        } else {
           download_uri = mainImageUri;
        }
        
        download_uri.addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri downloaded_uri) {
                Map<String, String> userMap = new HashMap<>();
                userMap.put("skills", userSkills);
                userMap.put("name", user_name);
                userMap.put("about", about);
                userMap.put("image", downloaded_uri.toString());
                userMap.put("user_id", user_id);
    
                firebaseFirestore.collection("Users").document(user_id).set(userMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()){
    
                            Toast.makeText(SetupActivity.this, "Le impostazioni sono state aggiornate!", Toast.LENGTH_LONG).show();
                            Intent mainIntent = new Intent(SetupActivity.this, MainActivity.class);
                            startActivity(mainIntent);
                            finish();
                        } else {
    
                            Toast.makeText(SetupActivity.this, "C'è stato un problema, riprova per favore.", Toast.LENGTH_LONG).show();
    
                        }
    
                        progressBar.setVisibility(View.INVISIBLE);
                    }
                });
            }
        });
    }
    

    【讨论】:

    • 感谢您的回答,我试过了,但 logcat 说我“不兼容的类型:Task 无法转换为 Uri”...如果我尝试迁移到 Task 我有新问题:“不兼容的类型:Uri 无法转换为 Task”...我不知道问题出在哪里...可能在 onActivityResult 方法中...我将附上带有该代码的新屏幕截图。 ..还是谢谢...
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2013-08-12
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多