使用BASE64.EncodeString[Android][Java]将多媒体资料照片转换为BASE64时,获取损坏的图像字符串

使用BASE64.EncodeString[Android][Java]将多媒体资料照片转换为BASE64时,获取损坏的图像字符串,java,android,image,bitmap,base64,Java,Android,Image,Bitmap,Base64,当使用Base64编码器从活动转换画廊照片时,我得到一个错误的Base64字符串。当使用一个站点来测试这一点时,它是一个损坏的图像。尝试发布此字符串时,ExpressAPI也会在字符串上显示验证错误 我已经尝试过使用不同的位图变体,如工厂等 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //call super super.

当使用Base64编码器从活动转换画廊照片时,我得到一个错误的Base64字符串。当使用一个站点来测试这一点时,它是一个损坏的图像。尝试发布此字符串时,ExpressAPI也会在字符串上显示验证错误

我已经尝试过使用不同的位图变体,如工厂等

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //call super
        super.onActivityResult(requestCode, resultCode, data);
        Uri imageUri = data.getData();
        InputStream imageStream = null;
        try {
            imageStream = getContentResolver().openInputStream(imageUri);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
        encodedString = encodeImage(selectedImage);
    }
我显然希望使用Base64字符串,但我得到的是:

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB: AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAONA1wDASIA
AhEBAxEB/8QAHwAAAQQDAQEBAQAAAAAAAAAAAAQFBgcICQoBAgML/8QAhRAAAAEHBwgGBQYHBg4M
CQEZAQACAwQFESEGBzFBUWHwCBRxgZGhscEJEhMk0eEKFSM08Ro5UpKXuBYiM0RXctgXMkNUgtIY
GSU4OkJid3iIorK3wjZWWFlkaHOVlrTU4iY1dHV2ttXW1ygqN1VmlJintbPyJ0VGR0hTZXmFhoeo
xMbH/8QAGwEBAAMBAQEBAAAAAAAAAAAAAAQFBgEDAgf/xABIEQACAAIGBwYEBQMDAgUEAwEAAQQR
ITFBUWGRAhRxgaHB8BKCorHR4QWS0vEiMkJSYgMGchWywhY1JDRUVfIjJUXiE0NTc//aAAwDAQAC EQMRAD8A7+CCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCAC
CCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACC
CCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCC
CACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCC
ACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCA
CCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCAC
CCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACC
CCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCC
CACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCC
ACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCA
CCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCAC
CCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACC
CCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCC
CACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCCACCCC
ACCCCACCCCACCCCACCCCACCCCACCCCACCCCAqOdOdGSEzM2s4M7U4zTMk3Iia6R0opwpYtmHVZcn
pKMMZSyjSC+IgahRif1QcCURE3rGiACGlHoTZZZSuVlJmfPpD8oSXcvEEm8qCcBuIMnDJ7aEo22M
30zUykm0hyJSFEr9QxFnDTWgWRzgQRowSIEyI0wEicEiDHz0oGe2VTIyUZl8jWbYw0ZysuOe+T82
Cv1DRHsVcTkYpTzjniBpqZOcgRR6oPQInCInR6JJiZoJJ5PczE1cyUi1XM5KTTyDk3N2wDRF4gxp
MsBCqoBChxoig6wgLxA4BiQHOj0C2XjlZ5YWUt0l0jcoidhBOJJqYecWT7CmpVEUjGBJ05kKq1Ku
e9CsmmirAaIiKJnqRhoHQAxUQIjjzEBhxpdS5cWvotP9eB0yf99aQ/8ApGyhC7SiAC5aMrPLpytZ
ufSDsjrIrkVO0mY+TlOvNoxGrLiboJHyCaqVrJUqCfQ1IBq4kNFeQGH+r1E0T3GpgBUVjzkfaoEf
V6ly4tMuv+ywOj5/vUTV/wCZlAkBsU6WCfmfHo7cqzI9y91acacJfyJW3KX+h3yxJqPwpTNGbSSC
vLDtBkhPOdJo/roxW1cOuiSnIj+1NAxEkSI0Ip3H9CrOaTMbCgptJlrKqvMpdUQaCivKR5nqpfMP
e494dYBNeBpwPOH8V4iLzRNDC/pKsl9Wyx8hDKbycczNWmvOBNa3fwOMMcIfh3JnqSum0OeIxdLS
TcmxOvoB7gHXF6OJlVpcqPo0ZtFOVp+dS5ye262snyVCQAA0T0jOSKQIDj4PPOSIkqM0DxERFCgM
AIOcAwqOUBl2ndPm1cnJInnBN6PtTmbMauaDNmxDZuQlMM0Zq8agCWZsmgWOp60A1yoC/wBicc5V
ihEDCXdOBlF9IBk/SkyHgyGEsv8ANJwp4mux58jZBzQMOdA46TJgSW7I9YRJzAEw8Tki2jEwOuJ5
vUE9Mf1RRGZYq3SnyDX+lJafRbmzXy0Nl+oTchLgJ1gW2F6j7D8Gvwq7EFYRBKBwIPZmmAaaIJfx
83f7EvnpKulNkF0bDVyamPLebCWU5I5S84zWm0YAyTaLBZQyaTGIUKXrnnphEUgOOR9UTRE4BMER
S9oImogNuBBBBAc2XpI2WplP5CeSXMnONkpzkmTZy1lTPwxpFNNtpZIsCUINNhpJv5VrAmmmLIJD
EZoJkSFIaBhgGGnIzAMNNNRI39EEllpYWpNMBbWwAF1ZYLEXVwa/x0BiU5wWu6z6AgNYw5R/TB/6
wrJu/wALtif6E51yzJylemwZU0k4yvklZGOS1O3l75UMgWUxwl1JCZVE2zpEzagKMDHSrlQlQpgO
ADDRNABDqj1gNSCKM3qkB0OEFyTt70ifKQyYpQsJB0ivRWT6ZMk3zfXhZRk6DHlYjlArI0gB+IlS
IwRIUqU0DnHHIwXTX0B2cBDptmYnfmyygZq5FTxzOyqY0uZsZwZOMeUUjJWM4esx2qwzhDqHmHC4
TRAOsHVE1xpwuDrGmgJwGj/JOyg8viW3TZ5b8xs8J8uEORhNpNk2GnMMot2ac1gyMTyjOlBMWEng
k9OUZJZDnwGKq61FjsEyZYNMPPTrZpiVOYBw7z5050ZITMzazgztTjNMyTciJrpHSinCli2YdVly
ekowxlLKNIL4iBqFGJ/VBwJRETesaIAIa6Jg+lJkDP30juUv0dLEmvllJyW+TFJFpS1lDLporrBP
YMpDQSSKR9mrI0QikRGifOQiSGgcckRo0gddJ+J1zg1y+lAz2yqZGSjMvkazbGGjOVlxz3yfmwV+
oaI9iricjFKecc8QNNTJzkCKPVB6BE4RE6IGQfQmyyylcrKTM+fSH5Qku5eIJN5UE4DcQZOGT20J
RtsZvpmplJNpDkSkKJX6hiLOGmtAsjnAgjRgkQJkRpgJE4JEGkSZvKk6ejLmy8MvTJ0yQcuaambi
TuTNPHOgpMlTnvm+mjX1BTkQrTwJJLyUBhrkmcmpZXFtMCsqpTj1leTpU6c80e0TJFhKHX7XJiZo
JJ5PczE1cyUi1XM5KTTyDk3N2wDRF4gxpMsBCqoBChxoig6wgLxA4BiXJD6PN88R01n99WdP7yEr
SAvn+g49LH/30DIv/wChknP2BSP6Dj0sf/fQMi//AKGSc/YFLrOIIDmZnHyaemeU+jIyh0c8uWcr
tvLfmtnCXJ9pkZwsmJbPYzOb0gZNybV0v7jEoZOhIubZBmqyKNsJkyM9VTpE5ydTAxcSChTJFzal
0ZGW/JnpBsjCafKVZmYqUoJTM31XOfJ9nOdJedCTIIglXJw4x7xORHmgcAg4wE
看看这个请求:

请求如下:

private void uploadMeme() {
        RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
        String url = "Hiding this for personal reasons";
        final MemeCreateActivity activity = (MemeCreateActivity) getActivity();
        assert activity != null;
        try {
            JSONObject jsonBody = new JSONObject();
            jsonBody.put("Title", title);
            jsonBody.put("Longtitude", activity.getLon());
            jsonBody.put("Lattitude", activity.getLat());
            jsonBody.put("Picture", activity.getEncodedString());
            final String mRequestBody = jsonBody.toString();
            Log.d(mRequestBody, "Request:");
            JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    activity.nextView();

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    parseVolleyError(error);
                }
            }) {
                @Override
                public String getBodyContentType() {
                    return "application/json; charset=utf-8";
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    //Sets Request headers
                    Map<String, String> headers = new HashMap<>();
                    headers.put("Accept", "application/json");
                    headers.put("Content-Type", "application/json");
                    headers.put("Authorization", "Bearer " + activity.getUser().getJwt());
                    return headers;
                }

                @Override
                public byte[] getBody() {
                    try {
                        return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
                    } catch (UnsupportedEncodingException uee) {
                        VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, "utf-8");
                        return null;
                    }
                }
            };

            requestQueue.add(stringRequest);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
private void uploadMeme(){
RequestQueue RequestQueue=Volley.newRequestQueue(getActivity().getApplicationContext());
String url=“出于个人原因隐藏此信息”;
final MemeCreateActivity=(MemeCreateActivity)getActivity();
断言活动!=null;
试一试{
JSONObject jsonBody=新的JSONObject();
jsonBody.put(“Title”,Title);
jsonBody.put(“Longtitude”,activity.getLon());
jsonBody.put(“latitude”,activity.getLat());
jsonBody.put(“Picture”,activity.getEncodedString());
最后一个字符串mRequestBody=jsonBody.toString();
Log.d(请求主体,“请求:”);
JsonObjectRequest stringRequest=新的JsonObjectRequest(Request.Method.POST,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONObject响应){
activity.nextView();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
截击错误;
}
}) {
@凌驾
公共字符串getBodyContentType(){
返回“application/json;charset=utf-8”;
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
//设置请求头
Map headers=newhashmap();
headers.put(“接受”、“应用程序/json”);
headers.put(“内容类型”、“应用程序/json”);
headers.put(“授权”、“承载者”+activity.getUser().getJwt());
返回标题;
}
@凌驾
公共字节[]getBody(){
试一试{
返回mRequestBody==null?null:mRequestBody.getBytes(“utf-8”);
}捕获(不支持的编码异常uee){
wtf(“尝试使用%s获取%s的字节时不支持编码”,mRequestBody,“utf-8”);
返回null;
}
}
};
添加(stringRequest);
}捕获(JSONException e){
e、 printStackTrace();
}
}
试试这个:

public String encodeTobase64(Bitmap image) {
    Bitmap immagex=image;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] b = baos.toByteArray();
    String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);

    Log.e("EncodedImage: ", imageEncoded);
    return imageEncoded;
}
在onActivityResult()中使用以下代码


您可以尝试通过拾取的文件路径获取位图:

在你的onActivityResult中

InputStream imageStream = null;
        try {
            imageStream = this.getContentResolver().openInputStream(selectedImage);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
        encodeTobase64(yourSelectedImage);

对。。我找到了答案。基本上,Android认为在我的字符串中插入多个空格很有趣

通过执行此操作,您可以将其全部删除:

activity.getEncodedString().replaceAll("\s+","")

Java用base64字符串中的空格解码位图,请尝试以下操作:
encodedString.replaceAll(“\\s+”,”)

可能无法在日志中显示整个字符串!或者可能是你的图像已损坏。我尝试了不同的图像。但这里是字符串:是的,日志有一个限制,您应该尝试将数据直接保存在txt文件中,以尝试将其转换回原始帖子中我也将函数写入api这给了我一个权限错误:E/BitmapFactory:无法解码流:java.io.FileNotFoundException:/storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20190404-WA0009.jpg(权限被拒绝)我修复了权限,但仍然得到一个错误的base64字符串。每当我尝试解码它时,我只会得到一个损坏的图像。我使用的代码与您在
encodeImage()
中使用的代码完全相同,它对我有效,也许您的解码器有故障?或者你有错误的文件格式?(即,尝试转换PNG文件,但您使用
bm.compress(Bitmap.CompressFormat.JPEG,100,baos)
我只使用已压缩的WhatsApp图像我相信,它们是JPG检查原始帖子中我的请求图像
Uri targetUri = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(targetUri,
    filePathColumn, null, null, null);
cursor.moveToFirst();

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
//getting the actual path of the file
String path = cursor.getString(columnIndex);
cursor.close();

Bitmap bm = BitmapFactory.decodeFile(path);

//your encoding function is ok
encodedString = encodeImage(selectedImage);
activity.getEncodedString().replaceAll("\s+","")