java - 如何将base 64转换图像的gridview上传到firebase?
问题描述
这是我正在处理的代码,在一个名为 ImageList 的 gridview 数组中选择多个图像,但我建议将图像转换为 base64 以在上传和显示图像时提高效率,所以我查找示例和文档,我找到了一种转换它们的方法,但我有些困惑,因为存储图像的数组已准备好图像列表我必须将其传递给链链,但我不太了解以及如何将它们上传到存储和数据库的firebase,因为它们是将保存在商店中显示的产品的图像这是代码
这是将上传数据的活动,名称价格和描述等数据已经上传到数据库,而图像没有。
public class adminActivity extends AppCompatActivity {
private EditText nombreP, precioP, infoP;
int PICK_IMAGE = 100;
Uri imagenUri;
Button btnCargar;
Button btnEditar;
GridView gvImagenes;
List<Uri> listaImagenes = new ArrayList<>();
List<Uri> listaBase64Imagenes = new ArrayList<>();
GridViewAdapter baseAdapter;
FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;
StorageReference mStorageRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin);
/*INICIALIZAMOS LA CONEXION CON FIREBASE*/
FirebaseApp.initializeApp(this);
firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference = firebaseDatabase.getReference();
mStorageRef = FirebaseStorage.getInstance().getReference();
nombreP = (EditText) findViewById(R.id.nameProducto);
precioP = (EditText) findViewById(R.id.precioProducto);
infoP = (EditText) findViewById(R.id.infoProducto);
gvImagenes = findViewById(R.id.gvImagenes);
btnEditar = findViewById(R.id.editar);
btnCargar = (Button) findViewById(R.id.cargar);
btnEditar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
abrirGaleria();
}
});
btnCargar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nombre = nombreP.getText().toString();
String precio = precioP.getText().toString().trim();
String infor = infoP.getText().toString();
if (!nombre.isEmpty() && !precio.isEmpty() && !infor.isEmpty()){
cargarUsuario();
limpiarCaja();
}else {
Toast.makeText(adminActivity.this,"Deben llenarse todos los campos.",Toast.LENGTH_SHORT).show();
return;
}
}
});
}
private void limpiarCaja() {
nombreP.setText("");
precioP.setText("");
infoP.setText("");
}
public void cargarUsuario() {
listaBase64Imagenes.clear();
for (int i = 0 ; i < listaImagenes.size() ; i++){
try {
InputStream is = getContentResolver().openInputStream(listaImagenes.get(i));
Bitmap bitmap = BitmapFactory.decodeStream(is);
String cadena = convertirUriToBase64(bitmap);
enviarImagen(cadena);
bitmap.recycle();
} catch (IOException e){
}
}
//Toast.makeText(this, "Producto Registrado", Toast.LENGTH_LONG).show();
String nombre = nombreP.getText().toString();
String precio = precioP.getText().toString();
String infor = infoP.getText().toString();
productos p = new productos();
p.setUid(UUID.randomUUID().toString());
p.setNombre(nombre);
p.setPrecio(precio);
p.setInformacion(infor);
databaseReference.child("Productos").child(p.getUid()).setValue(p);
Toast.makeText(adminActivity.this,"Agregado.",Toast.LENGTH_SHORT).show();
}
private void enviarImagen(final String cadena) {
StorageReference folderRef = mStorageRef.child("imagenesProductos");
folderRef.putFile((Uri) listaImagenes).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl();
while (!uriTask.isSuccessful());
Uri downloadUri = uriTask.getResult();
}
});
}
private String convertirUriToBase64(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
String encode = Base64.encodeToString(bytes, Base64.DEFAULT);
return encode;
}
private void abrirGaleria() {
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "SELECCIONA LAS IMAGENES"),PICK_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ClipData clipData = data.getClipData();
if (resultCode == RESULT_OK && requestCode == PICK_IMAGE){
/*PARA UNA SOLA IMAGEN*/
if (clipData == null){
imagenUri = data.getData();
listaImagenes.add(imagenUri);
}
}else {
/*PARA VARIAS IMAGENES*/
for (int i = 0; i < clipData.getItemCount(); i++){
listaImagenes.add(clipData.getItemAt(i).getUri());
}
}
baseAdapter = new GridViewAdapter(adminActivity.this, listaImagenes);
gvImagenes.setAdapter(baseAdapter);
}
}
这是gridview适配器代码
@Override
public int getCount() {
return listaImagenes.size();
}
@Override
public Object getItem(int position) {
return listaImagenes.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
if (view == null){
layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.item_carga_imagenes, null);
}
ImageView ivImagen = view.findViewById(R.id.ivImagen);
ImageButton ibtnEliminar = view.findViewById(R.id.ibtnEliminar);
ivImagen.setImageURI(listaImagenes.get(position));
ibtnEliminar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listaImagenes.remove(position);
notifyDataSetChanged();
}
});
return view;
}
}
在这里,我指出了我尝试连接到 firebase 存储的方法,他们可以帮助重建它,以便能够将它们上传到存储以及带有各自名称、价格和描述的数据库
private void enviarImagen(final String cadena) {
StorageReference folderRef = mStorageRef.child("imagenesProductos");
folderRef.putFile((Uri) listaImagenes).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl();
while (!uriTask.isSuccessful());
Uri downloadUri = uriTask.getResult();
}
});
}
解决方案
您的问题仍然有点混乱,就我而言,我从您那里了解到,您想以 BASE64 格式将图像存储到 firebase。
String encode = Base64.encodeToString(bytes, Base64.DEFAULT);
现在,您不必存储字符串,您可以简单地将 byte[] 存储在 firbase 中并检索它并将其转换为位图,这是一个示例:
byte[] byteImage = Base64.decode(encode, Base64.DEFAULT);
Bitmap imageBitmap = BitmapFactory.decodeByteArray(byteImage, 0, decodedString.length);
推荐阅读
- azure - Azure 应用注册更改/切换目录
- prisma - 如何在 prisma 中创建与同一字段的多个关系
- hadoop - Sqoop 工作智能
- python - 使用正则表达式提取列表中的部分字符串
- postgresql - 在表格中按规范化电子邮件查找 Id
- angular - Angular:构建后是否可以读取json文件
- firebase - ipfs 模块不适用于 firebase 功能
- laravel - Laravel 5.6 barryvdh dompdf 版本 0.8.4 将印度卢比符号显示为“?”
- debugging - Visual Studio 2017 无法正确编辑和继续调试
- ios - 如何使用 Firebase 数据库在 Xcode/Swift 的表视图中显示多个路由/子节点