#java #android #firebase #android-studio #picasso
#java #Android #огневая база #android-студия #picasso #firebase #android-studio
Вопрос:
Я создаю приложение для чата и использую firebase для загрузки данных, включая имя пользователя, статус и изображение в виде строк. Имя и статус работают нормально, но изображение вообще не загружается. Я думаю, что код правильный, но он не может получить идентификатор изображения. Изображения загружаются в firebase без каких-либо проблем. Я использую Picasso для их извлечения. Пожалуйста, можете ли вы подсказать, почему я не могу получить изображение? Это мой код
public class SettingsActivity extends AppCompatActivity {
private DatabaseReference mUserDatabase;
private FirebaseUser mCurrentUser;
private CircleImageView mDisplayImage;
private TextView mName;
private TextView mStatus;
private Button mStatusBtn;
private Button mImageBtn;
private static final int GALLERY_PICK=1;
private StorageReference mImageStorage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
mDisplayImage=(CircleImageView) findViewById(R.id.settings_image);
mName= (TextView) findViewById(R.id.settings_display_name);
mStatus=(TextView) findViewById(R.id.setting_status);
mStatusBtn=(Button) findViewById(R.id.settings_status_btn);
mImageBtn=(Button)findViewById(R.id.settings_img_btn);
mImageStorage= FirebaseStorage.getInstance().getReference();
mCurrentUser= FirebaseAuth.getInstance().getCurrentUser();
String current_uid=mCurrentUser.getUid();
mUserDatabase= FirebaseDatabase.getInstance().getReference().child("Users").child(current_uid);
mUserDatabase.keepSynced(true);
mUserDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
final String image=dataSnapshot.child("image").getValue().toString();
final String name = dataSnapshot.child("name").getValue().toString();
String status = dataSnapshot.child("status").getValue().toString();
String thumb_image=dataSnapshot.child("thumb_image").getValue().toString();
mName.setText(name);
mStatus.setText(status);
if(!image.equals("default")) {
Picasso.get().load(image).networkPolicy(NetworkPolicy.OFFLINE)
.placeholder(R.drawable.dog).into(mDisplayImage, new Callback() {
@Override
public void onSuccess() {
Toast.makeText(SettingsActivity.this,"Success",Toast.LENGTH_LONG).show();
}
@Override
public void onError(Exception e) {
Picasso.get().load(image).networkPolicy(NetworkPolicy.OFFLINE)
.placeholder(R.drawable.dog).into(mDisplayImage);
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
mStatusBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String status_value=mStatus.getText().toString().trim();
Intent status_intent=new Intent(SettingsActivity.this,StatusActivity.class);
status_intent.putExtra("status_value",status_value);
startActivity(status_intent);
}
});
mImageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent galleryIntent= new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(galleryIntent,"Select Image "),GALLERY_PICK);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==GALLERY_PICKamp;amp; resultCode==RESULT_OK){
Uri imageUri=data.getData();
CropImage.activity(imageUri)
.setAspectRatio(1,1)
.start(SettingsActivity.this);
}
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
final AlertDialog dialog = new AlertDialog.Builder(SettingsActivity.this).create();
dialog.setTitle("Uploading image...");
dialog.setMessage("Please wait while we upload your image");
dialog.setCanceledOnTouchOutside(false);
dialog.show();
Uri resultUri = result.getUri();
final File thumb_filePath= new File(resultUri.getPath());
String current_user_id=mCurrentUser.getUid();
Bitmap thumb_bitmap = new Compressor(SettingsActivity.this)
.setMaxWidth(200)
.setMaxHeight(200)
.setQuality(75)
.compressToBitmap(thumb_filePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
thumb_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
final byte[] thumb_byte = baos.toByteArray();
StorageReference filepath=mImageStorage.child("profile_images").child(current_user_id ".jpg");
final StorageReference thumb_filepath=mImageStorage.child("profile_images").child("thumbs").child(current_user_id ".jpg");
filepath.putFile(resultUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if(task.isSuccessful()){
final String download_url= task.getResult().getStorage().getDownloadUrl().toString();
UploadTask uploadTask=thumb_filepath.putBytes(thumb_byte);
uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> thumb_task) {
String thumb_downloadUrl=thumb_task.getResult().getStorage().getDownloadUrl().toString();
if(thumb_task.isSuccessful()){
Map update_hashMap=new HashMap<>();
update_hashMap.put("image",download_url);
update_hashMap.put("thumb_image",thumb_downloadUrl);
mUserDatabase.updateChildren(update_hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
dialog.dismiss();
Toast.makeText(SettingsActivity.this,"Success Uploading thumbnail", Toast.LENGTH_LONG).show();
}
}
});
}
else {
Toast.makeText(SettingsActivity.this,"Error in uploading thumbnail",Toast.LENGTH_LONG).show();
dialog.dismiss();
}
}
});
mUserDatabase.child("image").setValue(download_url).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
dialog.dismiss();
Toast.makeText(SettingsActivity.this,"Successfuly Uploaded.",Toast.LENGTH_LONG).show();
}
}
});
}
else{
Toast.makeText(SettingsActivity.this,"Error in uploading",Toast.LENGTH_LONG).show();
dialog.dismiss();
}
}
});
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
Это макет XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="#00BCD4"
tools:context=".SettingsActivity">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@ id/settings_image"
android:layout_width="230dp"
android:layout_height="224dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="72dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.491"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"></de.hdodenhof.circleimageview.CircleImageView>
<TextView
android:id="@ id/settings_display_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="326dp"
android:text="Display Name"
android:textSize="30sp" />
<TextView
android:id="@ id/setting_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="301dp"
android:text="@string/default_status"
android:textSize="25sp" />
<Button
android:id="@ id/settings_img_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="204dp"
android:text="Change Image" />
<Button
android:id="@ id/settings_status_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="152dp"
android:layout_marginLeft="152dp"
android:layout_marginBottom="119dp"
android:text="Change Status" />
</RelativeLayout>
Комментарии:
1. Что
dataSnapshot.child("thumb_image").getValue().toString()
возвращает? Пожалуйста, также добавьте свою структуру базы данных в виде файла JSON или, по крайней мере, скриншота.2. Пожалуйста, отправьте данные узла
3. Ниже приведен формат JSON базы данных, на которую я ссылаюсь. «Пользователи»: { «P0EWILTmPZPoTm75agiQNQZ9B5u2»: { «изображение»: «com.google.android.gms.tasks.zzu@d5fd49 «, «имя»: «Чираг Гарг», «онлайн»: 1601449110407, «статус»: «Меня зовут Чираг», «thumb_image»: «com.google.android.gms.tasks.zzu@447865f » },
4. почему URL-адрес изображения является задачей? Я предполагаю, что вам не удалось успешно загрузить и получить URL-адрес изображения.
5. что это должно быть тогда вместо задачи? Однако изображение успешно загружается.
Ответ №1:
Я думаю, что основная проблема заключается networkPolicy(NetworkPolicy.OFFLINE)
в. Вы в основном пропускаете сеть и заставляете Picasso искать на диске. Это означает, что он не взаимодействует с firebase и, следовательно, изображение не загружается. Для справки прочитайте официальную документацию:
https://square.github.io/picasso/2.x/picasso/com/squareup/picasso/NetworkPolicy.html
Комментарии:
1. даже с помощью NetworkPolicy (NetworkPolicy. УДАЛЕНО в автономном режиме, проблема по-прежнему сохраняется. Я даже пытался использовать Glide вместо picasso, и у него была та же проблема.
2. тогда, я думаю, вы не успешно восстанавливаете ссылку на изображение из firebase.