首页 > 解决方案 > 如何将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();
            }
        });
    }

标签: javaandroidfirebasefirebase-realtime-databasefirebase-storage

解决方案


您的问题仍然有点混乱,就我而言,我从您那里了解到,您想以 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);

推荐阅读