![](/img/trans.png)
[英]How do I save user session using SharedPreferences in Cloud Firestore when I'm not using Firebase authentication?
[英]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 中的該圖像。
if request.auth;= null;
或 -> 如果您不是首先驗證用戶,則使用if request.auth == null;
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.