簡體   English   中英

如何將圖像、文本、用戶 ID 和時間戳上傳到 firebase 火庫?

[英]How do I upload image, text, user id and timestamp to firebase firestore?

我一直在嘗試使用Map<>HashMap將圖像、用戶 ID 時間戳和文本上傳到 Firestore,但我不知道代碼有什么問題。每次我嘗試使用文本。

這是 xml 文件

    <?xml version="1.0" encoding="utf-8"?>
<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"
    android:orientation="vertical"
    tools:context=".NewPost">

<androidx.appcompat.widget.Toolbar
    android:id="@+id/new_post_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:titleTextColor="@color/white"
    android:background="@color/colorPrimary"
    android:theme="@style/AppTheme_Toolbar"/>

<ProgressBar
    android:id="@+id/new_post_progressBar"
    android:layout_marginTop="5dp"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:orientation="vertical"
    android:gravity="center">

    <ImageView
        android:id="@+id/new_post_Image"
        android:layout_width="370dp"
        android:layout_height="300dp"
        android:background="@mipmap/insertphoto1"/>

    <EditText
        android:id="@+id/new_post_Desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:textSize="20sp"
        android:maxLength="130"
        android:fontFamily="@font/font2"
        android:hint="Write something..."/>

    <Button
        android:id="@+id/post_Btn"
        android:layout_marginTop="70dp"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_background"
        android:text="Post"
        android:textSize="20sp"
        android:fontFamily="@font/font2"
        android:textAllCaps="false"
        android:textColor="@color/white"/>
</LinearLayout>

這是 java 文件

package com.example.vlog;


public class NewPost extends AppCompatActivity {

    private Toolbar newPostToolbar;

private ImageView newPostImage;
private EditText newPostDesc;
private  Button newPostBtn;
private  Uri postImageURI = null;

private ProgressBar newPostProgress;

private StorageReference storageReference;
private FirebaseFirestore firebaseFirestore;
private FirebaseAuth firebaseAuth;

private String current_user_id;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_post);

    newPostToolbar = findViewById(R.id.new_post_toolbar);
    setSupportActionBar(newPostToolbar);
    getSupportActionBar().setTitle("Add New Post");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    firebaseFirestore = FirebaseFirestore.getInstance();
    storageReference = FirebaseStorage.getInstance().getReference();
    firebaseAuth = FirebaseAuth.getInstance();

    current_user_id = firebaseAuth.getCurrentUser().getUid();

    newPostImage = findViewById(R.id.new_post_Image);
    newPostDesc = findViewById(R.id.new_post_Desc);
    newPostBtn = findViewById(R.id.post_Btn);
    newPostProgress = findViewById(R.id.new_post_progressBar);

    newPostImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            CropImage.activity()
                    .setGuidelines(CropImageView.Guidelines.ON)
                    .setMinCropResultSize(512, 512)
                    .setAspectRatio(1,1)
                    .start(NewPost.this);
        }
    });

    newPostBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final String desc = newPostDesc.getText().toString();

            if (!TextUtils.isEmpty(desc)  && postImageURI != null)
            {
                newPostProgress.setVisibility(View.VISIBLE);

                String randomName = FieldValue.serverTimestamp().toString();

                StorageReference filepath = storageReference
                        .child("post_images")
                        .child(randomName + ".jpg");

                filepath.putFile(postImageURI).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

                        if (task.isSuccessful())
                        {
                            Task<Uri> download_Uri = task.getResult().getStorage().getDownloadUrl();

                            Map<String, Object> postMap = new HashMap<>();
                            postMap.put("image_url", download_Uri);
                            postMap.put("desc", desc);
                            postMap.put("user_id", current_user_id);
                            postMap.put("timestamp", FieldValue.serverTimestamp());

                            firebaseFirestore.collection("Posts")
                                    .add(postMap)
                                    .addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                                        @Override
                                        public void onComplete(@NonNull Task<DocumentReference> task) {

                                            if (task.isSuccessful())
                                            {
                                                Toast.makeText(NewPost.this,"Post uploaded..",Toast.LENGTH_LONG).show();
                                                Intent i = new Intent(NewPost.this, MainActivity.class);
                                                startActivity(i);
                                                finish();

                                            }else {
                                                String error = task.getException().getMessage();
                                                Toast.makeText(NewPost.this,"FIRESTORE Error : " + error,Toast.LENGTH_LONG).show();
                                            }

                                        }
                                    });

                        }
                        else {

                            newPostProgress.setVisibility(View.INVISIBLE);

                        }
                    }
                });
            }
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
    {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);
        if (resultCode == RESULT_OK) {

            postImageURI = result.getUri();
            newPostImage.setImageURI(postImageURI);

        } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
            Exception error = result.getError();
        }
    }
}

}

來自 Logcat 的堆棧跟蹤錯誤

[1]: 2020-07-09 00:54:34.969 24068-24068/com.example.vlog E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.vlog, PID: 24068 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.google.firebase.firestore.util.ApiUtil.invoke(com.google.firebase:firebase-firestore@@21.4.3:65) at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:883) at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:178) at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:140) at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:104) at com.google.firebase.firestore.util.CustomClassMapper.convertToPlainJavaTypes(com.google.firebase:firebase-firestore@@21.4.3:78) at com.google.firebase.firestore.UserDataReader.convertAndParseDocumentData(com.google.firebase:firebase-firestore@@21.4.3:231) at com.google.firebase.firestore.UserDataReader.parseSetData(com.google.firebase:firebase-firestore@@21.4.3:75) at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@21.4.3:166) at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@21.4.3:146) at com.google.firebase.firestore.CollectionReference.add(com.google.firebase:firebase-firestore@@21.4.3:121) at com.example.vlog.NewPost$2$1.onComplete(NewPost.java:116) at com.google.firebase.storage.StorageTask.lambda$new$2(com.google.firebase:firebase-storage@@19.1.1:143) 2020-07-09 00:54:34.969 24068-24068/com.example.vlog E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.vlog, PID: 24068 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.google.firebase.firestore.util.ApiUtil.invoke(com.google.firebase:firebase-firestore@@21.4.3:65) at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:883) at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:178) at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:140) at com.google.firebase.firestore.util.CustomClassMapper.serialize(com.google.firebase:firebase-firestore@@21.4.3:104) at com.google.firebase.firestore.util.CustomClassMapper.convertToPlainJavaTypes(com.google.firebase:firebase-firestore@@21.4.3:78) at com.google.firebase.firestore.UserDataReader.convertAndParseDocumentData(com.google.firebase:firebase-firestore@@21.4.3:231) at com.google.firebase.firestore.UserDataReader.parseSetData(com.google.firebase:firebase-firestore@@21.4.3:75) at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@21.4.3:166) at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@21.4.3:146) at com.google.firebase.firestore.CollectionReference.add(com.google.firebase:firebase-firestore@@21.4.3:121) at com.example.vlog.NewPost$2$1.onComplete(NewPost.java:116) at com.google.firebase.storage.StorageTask.lambda$new$2(com.google.firebase:firebase-storage@@19.1.1:143)

您需要使用 firebase 存儲來存儲圖像,並且他們將 url 與 ID、名稱和時間戳一起存儲到 Firestore 中的該圖像。

檢查這里.. https://firebase.google.com/docs/storage/?gclid=Cj0KCQjw3ZX4BRDmARISAFYh7ZKX57WK_kP0vuxkxgrngT-U7xNalJ5Sj-paSGq0rVHM1Jd5RExfiRcaAopsEAL

  1. 確保相應地設置存儲規則->如果您首先是身份驗證用戶,則使用if request.auth;= null;

或 -> 如果您不是首先驗證用戶,則使用if request.auth == null;

  1. 而是使用uploadTask()。
StorageReference filepath = storageReference
                        .child("post_images")
                        .child(randomName + ".jpg");

uploadTask = filepath.putBytes(profile_byte);

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            
           
           uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                    @Override
                    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                        if (!task.isSuccessful()) {
                            throw task.getException();
                        }

                        // Continue with the task to get the download URL
                        return filepath.getDownloadUrl();
                    }
                }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        if (task.isSuccessful()) 
                           String downloadUri = task.getResult();

                            Map<String, Object> postMap = new HashMap<>();
                            postMap.put("image_url", downloadUri);
                            postMap.put("desc", desc);
                            postMap.put("user_id", current_user_id);
                            
                           postMap.put("timestamp",FieldValue.serverTimestamp());


                           db.collection("SavedDots").document(keyID).set(map, SetOptions.merge())
.addOnSuccessListener(new OnSuccessListener<Void>() {
                                            @Override
                                            public void onSuccess(Void aVoid) {}});
}
});


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM