简体   繁体   English

如何在android studio中使用firebase创建像“编辑个人资料图像”页面的火种/笨蛋?

[英]How to create a tinder/bumble like “Edit Profile Images” page in android studio with firebase?

I'm trying to create an app where you can add profile images from your mobile device, then save it to firebase, and retrieve it from firebase as well, as efficiently as possible. 我正在尝试创建一个应用程序,您可以从移动设备添加配置文件图像,然后将其保存到firebase,并尽可能高效地从firebase检索它。

A few questions: 几个问题:

1: How do these big dating apps such as bumble/tinder create the edit profile image UI where you upload your profile images and rearrange them? 1:这些大型约会应用程序如bumble / tinder如何创建编辑配置文件图像UI,您可以在其中上传配置文件图像并重新排列它们? Do they place cardviews into a gridview, seeing as how these cards have the ability to be dragged to rearrange the position? 他们是否将卡片视图放入网格视图中,看看这些卡片是如何被拖动以重新排列位置的? Also they normally have a small x button attached to delete the image, so it would be a cardview, right? 他们通常还有一个小的x按钮来删除图像,所以它会是一个卡片视图,对吧?

I'm currently using ImageViews for testing and wanted to incorporate the ability to add more, but my code is horrible and it overwrites the images in the firebase DB if I return to the page and add a new image. 我目前正在使用ImageViews进行测试,并希望能够添加更多功能,但我的代码非常糟糕,如果我返回页面并添加新图像,它会覆盖firebase数据库中的图像。

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SettingsActivity"
    android:orientation="vertical">

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/back"
    android:text="Back"
    android:layout_marginBottom="20sp"/>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20sp"
    android:orientation="horizontal">
    <ImageView

        android:layout_width="100sp"
        android:layout_height="100sp"
        android:id="@+id/image1"
        android:src="@mipmap/ic_launcher"
        android:layout_margin="20sp"
        android:layout_gravity="start"
        />
    <ImageView
        android:layout_width="100sp"
        android:layout_height="100sp"
        android:id="@+id/image2"
        android:src="@mipmap/ic_launcher"
        android:layout_margin="20sp"
        android:layout_gravity="center_horizontal"

        />
    <ImageView
        android:layout_width="100sp"
        android:layout_height="100sp"
        android:id="@+id/image3"
        android:src="@mipmap/ic_launcher"
        android:layout_margin="20sp"
        android:layout_gravity="end"
        />

</LinearLayout>



public class SettingsActivity extends AppCompatActivity {
    private Button mBack;
    private ImageView mImage1, mImage2, mImage3;
    private FirebaseAuth mAuth;
    private DatabaseReference mUserDb, mTagsDb;
    private String userId, phone, image1Url, image2Url, image3Url, userSex;
    private Uri resultUri1, resultUri2, resultUri3;
    private ArrayList<Uri> resultUri = new ArrayList<Uri>();
    private ArrayList<ImageView> imageViewsList = new ArrayList<ImageView>();
    final int MaxTags = 5;
    final int MaxImages = 3;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        mImage1 = findViewById(R.id.image1);
        mImage2 = findViewById(R.id.image2);
        mImage3 = findViewById(R.id.image3);
        mBack = findViewById(R.id.back);

        mAuth = FirebaseAuth.getInstance();
        userId = mAuth.getCurrentUser().getUid();
        mUserDb = FirebaseDatabase.getInstance().getReference().child("Users").child(userId);
        getUserInfo();

        mImage1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 1);
            }
        });
        mImage2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 2);
            }
        });
        mImage3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 3);
            }
        });

        mBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveUserInformation();
                finish();

            }
        });

private void saveUserInformation() {
        phone = mPhoneField.getText().toString();

        Map userInfo = new HashMap();
        userInfo.put("phone", phone);
        mUserDb.updateChildren(userInfo);
        if(resultUri != null){
            for(int i = 0; i < resultUri.size(); i++)
            {   String num = String.valueOf(i);
                final StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profileImages").child(userId).child(num);
                Bitmap bitmap = null;

                try {
                    bitmap = MediaStore.Images.Media.getBitmap(getApplication().getContentResolver(), resultUri.get(i));
                } catch (IOException e) {
                    e.printStackTrace();
                }

                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
                byte[] data = baos.toByteArray();
                UploadTask uploadTask = filePath.putBytes(data);
                uploadTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        finish();
                    }
                });
                final int finalI = i+1;
                uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                Map newImage = new HashMap();
                                newImage.put("image"+ finalI +"Url", uri.toString());
                                mUserDb.updateChildren(newImage);

                                finish();
                                return;
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception exception) {
                                finish();
                                return;
                            }
                        });
                    }
                });
            }



        }else{
            finish();
        }
    }


    ArrayAdapter<String> values;
    private void getUserInfo() {

        mUserDb.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists() && dataSnapshot.getChildrenCount()>0){


                    Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
                    if(map.get("phone") != null){
                        phone = map.get("phone").toString();
                        mPhoneField.setText(phone);
                    }
                    if(map.get("sex") != null){
                        userSex = map.get("sex").toString();
                    }

                    Glide.clear(mImage1);
                    Glide.clear(mImage2);
                    Glide.clear(mImage3);
                    if(MaxImages == 3) {
                        imageViewsList.add(mImage1);
                        imageViewsList.add(mImage2);
                        imageViewsList.add(mImage3);
                    }
                    for(int i = 0; i < MaxImages; i ++)
                    {
                        int b = i+1;
                        if(map.get("image"+b+"Url") != null){
                            String url = map.get("image"+b+"Url").toString();
                            switch(url){
                                case "default":
                                    imageViewsList.get(i).setImageResource(R.mipmap.ic_launcher);
                                    //Glide.with(getApplication()).load(R.mipmap.ic_launcher).into(mImage1);
                                    break;
                                default:
                                    Glide.with(getApplication()).load(url).into(imageViewsList.get(i));
                                    break;
                            }
                        }
                    }


                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1 && resultCode == Activity.RESULT_OK){
            final Uri imageUri = data.getData();
            resultUri1 = imageUri;
            mImage1.setImageURI(resultUri1);
            resultUri.add(resultUri1);
        }
        if(requestCode == 2 && resultCode == Activity.RESULT_OK){
            final Uri imageUri = data.getData();
            resultUri2 = imageUri;
            mImage2.setImageURI(resultUri2);
            resultUri.add(resultUri2);
        }
        if(requestCode == 3 && resultCode == Activity.RESULT_OK){
            final Uri imageUri = data.getData();
            resultUri3 = imageUri;
            mImage3.setImageURI(resultUri3);
            resultUri.add(resultUri3);
        }
    }
}

Currently I can upload images to the imageviews fine and save them to firebase, but for example if I upload 2 images, then save and return to upload a 3rd image, that image overwrites image 1. Does anyone have a simpler way of doing this? 目前我可以将图像上传到ima​​geviews,并保存到firebase,但是例如,如果我上传2张图片,然后保存并返回上传第3张图片,该图片会覆盖图片1.有没有人有更简单的方法呢?

So after looking at the other apps at my disposal again, I've realized that it seems they upload the image to firebase after the onResultActivity of the image selection of your phone gallery. 因此,在我再次查看其他应用程序之后,我意识到他们似乎是在手机图库的图像选择的onResultActivity之后将图像上传到firebase。 So i've simplified my code to do the same and it works much better. 所以我简化了我的代码来做同样的事情并且效果更好。 Code now works but I just need to resize the images to fit the imageviews properly, other than that no complaints. 代码现在有效但我只需要调整图像大小以适应图像视图,除此之外没有任何抱怨。

If you have a better and more efficient way of writing this code, please comment, efficiency is key and I would appreciate your input. 如果您有更好,更有效的方式编写此代码,请注释,效率是关键,我将非常感谢您的意见。

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

        mImage1 = findViewById(R.id.image1);
        mImage2 = findViewById(R.id.image2);
        mImage3 = findViewById(R.id.image3);

        mAuth = FirebaseAuth.getInstance();
        userId = mAuth.getCurrentUser().getUid();
        mUserDb = FirebaseDatabase.getInstance().getReference().child("Users").child(userId);

        getUserInfo();
        getUserTags();

            mImage1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, 1);
                }
            });
            mImage2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, 2);
                }
            });
            mImage3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, 3);
                }
            });

    private void getUserInfo() {

            mUserDb.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists() && dataSnapshot.getChildrenCount()>0){

                        Glide.clear(mImage1);
                        if(map.get("image1Url") != null){
                            image1Url = map.get("image1Url").toString();
                            switch(image1Url){
                                case "default":
                                    mImage1.setImageResource(R.mipmap.ic_launcher);
                                    //Glide.with(getApplication()).load(R.mipmap.ic_launcher).into(mImage1);
                                    break;
                                default:
                                    Glide.with(getApplication()).load(image1Url).into(mImage1);
                                    break;
                            }
                        }
                        if(map.get("image2Url") != null){
                            image2Url = map.get("image2Url").toString();
                            switch(image2Url){
                                case "default":
                                    mImage2.setImageResource(R.mipmap.ic_launcher);
                                    //Glide.with(getApplication()).load(R.mipmap.ic_launcher).into(mImage1);
                                    break;
                                default:
                                    Glide.with(getApplication()).load(image2Url).into(mImage2);
                                    break;
                            }
                        }
                        if(map.get("image3Url") != null){
                            image3Url = map.get("image3Url").toString();
                            switch(image3Url){
                                case "default":
                                    mImage3.setImageResource(R.mipmap.ic_launcher);
                                    //Glide.with(getApplication()).load(R.mipmap.ic_launcher).into(mImage1);
                                    break;
                                default:
                                    Glide.with(getApplication()).load(image3Url).into(mImage3);
                                    break;
                            }
                        }
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }

    @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode == 1 && resultCode == Activity.RESULT_OK){
                final Uri imageUri = data.getData();
                final Uri resultUri = imageUri;
                if(resultUri != null){
                    final StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profileImages").child(userId).child("image1");
                    Bitmap bitmap = null;

                    try {
                        bitmap = MediaStore.Images.Media.getBitmap(getApplication().getContentResolver(), resultUri);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
                    byte[] databytes = baos.toByteArray();
                    UploadTask uploadTask = filePath.putBytes(databytes);
                    uploadTask.addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast toast = Toast.makeText(SettingsActivity.this, "Upload Failed! Please try again", Toast.LENGTH_LONG);
                            toast.setGravity(Gravity.CENTER, 0, 0);
                            toast.show();
                        }
                    });
                    uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    Map newImage = new HashMap();
                                    newImage.put("image1Url", uri.toString());
                                    mUserDb.updateChildren(newImage);
                                    mImage1.setImageURI(resultUri);
                                    Toast toast = Toast.makeText(SettingsActivity.this, "Upload Successful!", Toast.LENGTH_LONG);
                                    toast.setGravity(Gravity.CENTER, 0, 0);
                                    toast.show();
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {
                                    Toast toast = Toast.makeText(SettingsActivity.this, "Upload Failed! Please try again", Toast.LENGTH_LONG);
                                    toast.setGravity(Gravity.CENTER, 0, 0);
                                    toast.show();
                                }
                            });
                        }
                    });

                }else{
                    finish();
                }

            }
            if(requestCode == 2 && resultCode == Activity.RESULT_OK){
                final Uri imageUri = data.getData();
                final Uri resultUri = imageUri;
                if(resultUri != null){
                    final StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profileImages").child(userId).child("image2");
                    Bitmap bitmap = null;

                    try {
                        bitmap = MediaStore.Images.Media.getBitmap(getApplication().getContentResolver(), resultUri);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
                    byte[] databytes = baos.toByteArray();
                    UploadTask uploadTask = filePath.putBytes(databytes);
                    uploadTask.addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast toast = Toast.makeText(SettingsActivity.this, "Upload Failed! Please try again", Toast.LENGTH_LONG);
                            toast.setGravity(Gravity.CENTER, 0, 0);
                            toast.show();
                        }
                    });
                    uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    Map newImage = new HashMap();
                                    newImage.put("image2Url", uri.toString());
                                    mUserDb.updateChildren(newImage);
                                    mImage2.setImageURI(resultUri);
                                    Toast toast = Toast.makeText(SettingsActivity.this, "Upload Successful!", Toast.LENGTH_LONG);
                                    toast.setGravity(Gravity.CENTER, 0, 0);
                                    toast.show();
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {
                                    Toast toast = Toast.makeText(SettingsActivity.this, "Upload Failed! Please try again", Toast.LENGTH_LONG);
                                    toast.setGravity(Gravity.CENTER, 0, 0);
                                    toast.show();
                                }
                            });
                        }
                    });

                }else{
                    finish();
                }
            }
            if(requestCode == 3 && resultCode == Activity.RESULT_OK){
                final Uri imageUri = data.getData();
                final Uri resultUri = imageUri;
                if(resultUri != null){
                    final StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profileImages").child(userId).child("image3");
                    Bitmap bitmap = null;

                    try {
                        bitmap = MediaStore.Images.Media.getBitmap(getApplication().getContentResolver(), resultUri);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
                    byte[] databytes = baos.toByteArray();
                    UploadTask uploadTask = filePath.putBytes(databytes);
                    uploadTask.addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast toast = Toast.makeText(SettingsActivity.this, "Upload Failed! Please try again", Toast.LENGTH_LONG);
                            toast.setGravity(Gravity.CENTER, 0, 0);
                            toast.show();
                        }
                    });
                    uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    Map newImage = new HashMap();
                                    newImage.put("image3Url", uri.toString());
                                    mUserDb.updateChildren(newImage);
                                    mImage3.setImageURI(resultUri);
                                    Toast toast = Toast.makeText(SettingsActivity.this, "Upload Successful!", Toast.LENGTH_LONG);
                                    toast.setGravity(Gravity.CENTER, 0, 0);
                                    toast.show();
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {
                                    Toast toast = Toast.makeText(SettingsActivity.this, "Upload Failed! Please try again", Toast.LENGTH_LONG);
                                    toast.setGravity(Gravity.CENTER, 0, 0);
                                    toast.show();
                                }
                            });
                        }
                    });

                }else{
                    finish();
                }
            }
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM