vendredi 9 octobre 2015

Having problems decoding an image from MySQL/SQLite database to show in ImageView

i've got a simple app that saves a user's information on registration to a database, including an image, using the following code

//Converting image to base64 string
public String getStringImage(Bitmap bmp){
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG,100,baos);
    byte[] imageBytes = baos.toByteArray();
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return encodedImage;
}

The above code takes care of encoding the image into a base64 string.

Then, I upload it to a MySQL database and a local SQLite database:

    /**
 * Function to store user in MySQL database will post params(tag, name,
 * email, password) to register url
 * */
private void registerUser(final String name, final String phone, final String email,
                          final String password) {
    // Tag used to cancel the request
    String tag_string_req = "req_register";

    pDialog.setMessage("Registering ...");
    showDialog();

    StringRequest strReq = new StringRequest(Method.POST,
            AppConfig.URL_REGISTER, new Response.Listener<String>()
    {

        @Override
        public void onResponse(String response) {
            Log.d(TAG, "Register Response: " + response.toString());
            hideDialog();

            try {
                JSONObject jObj = new JSONObject(response);
                boolean error = jObj.getBoolean("error");
                if (!error) {
                    // User successfully stored in MySQL
                    // Now store the user in sqlite
                    String uid = jObj.getString("uid");

                    JSONObject user = jObj.getJSONObject("user");
                    String name = user.getString("name");
                    String phone = user.getString("phone");
                    String email = user.getString("email");
                    String image = user.getString("image");
                    String created_at = user
                            .getString("created_at");

                    // Inserting row in users table
                    db.addUser(name, phone, email, image, uid, created_at);

                    Toast.makeText(getApplicationContext(), "User successfully registered. Try logging in now!", Toast.LENGTH_LONG).show();

                    // Launch login activity
                    Intent intent = new Intent(
                            RegisterActivity.this,
                            LoginActivity.class);
                    startActivity(intent);
                    finish();
                } else {

                    // Error occurred in registration. Get the error
                    // message
                    String errorMsg = jObj.getString("error_msg");
                    Toast.makeText(getApplicationContext(),
                            errorMsg, Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Registration Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_LONG).show();
            hideDialog();
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting params to register url
            Map<String, String> params = new HashMap<String, String>();
            params.put("name", name);
            params.put("phone", phone);
            params.put("email", email);
            params.put("password", password);

                params.put("image", getStringImage(profileBitmap));


            return params;
        }

    };

So far, I think everything is good, as I can see the image stored as a 64 KiB Blob in my database.

Then, in another activity, after logging in, I try to decode the image:

    public class MainActivity extends Activity {

private TextView txtName;
private TextView txtEmail;
private Button btnLogout;
private ImageView profileImg;

private SQLiteHandler db;
private SessionManager session;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtName = (TextView) findViewById(R.id.name);
    txtEmail = (TextView) findViewById(R.id.email);
    btnLogout = (Button) findViewById(R.id.btnLogout);
    profileImg = (ImageView) findViewById(R.id.profileImage);

    // SqLite database handler
    db = new SQLiteHandler(getApplicationContext());

    // session manager
    session = new SessionManager(getApplicationContext());

    if (!session.isLoggedIn()) {
        logoutUser();
    }

    // Fetching user details from SQLite
    HashMap<String, String> user = db.getUserDetails();

    String name = user.get("name");
    String email = user.get("email");
    String image = user.get("image");

    //Decode Base64 bitmap


    // Displaying the user details on the screen
    txtName.setText(name);
    txtEmail.setText(email);
    profileImg.setImageBitmap(decodeBase64(image));

    // Logout button click event
    btnLogout.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            logoutUser();
        }
    });
}

public static Bitmap decodeBase64(String input)
{
    byte[] imageAsBytes = Base64.decode(input.getBytes(),0);
    Bitmap bp = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
    return bp;
}

However, this only shows a white square where the image should be. Am I missing something?

Aucun commentaire:

Enregistrer un commentaire