【问题标题】:Get Byte Array From Image in ImageView Android [duplicate]从ImageView Android中的图像获取字节数组[重复]
【发布时间】:2017-12-21 13:44:59
【问题描述】:

我已将图像从我的应用上传到服务器并在 imageview 中显示该图像。当我想将 imageview 中的现有图像重新上传到服务器时发生错误。显示此错误:

ava.lang.NullPointerException: Attempt to get length of null array
                                                                           at com.billionusers.tingting.activities.MyPictureActivity$3.onClick(MyPictureActivity.java:145)
                                                                           at android.view.View.performClick(View.java:5690)
                                                                           at android.view.View$PerformClick.run(View.java:22693)
                                                                           at android.os.Handler.handleCallback(Handler.java:836)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                           at android.os.Looper.loop(Looper.java:203)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6269)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

到目前为止我的代码:

uploadTV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Drawable avatar_drawable = new BitmapDrawable(getResources(), decBitmap);

            if (userImage.getDrawable() != null){ //I'm trying to check if imageview has image or not
                Intent editProfileIntent = null;

                if (userImage.getDrawable() == avatar_drawable || imgBytes.length == 0) { // error occurs here. I'm trying to check if imageview's image is same as retrieved image

                    Bitmap imageViewBitmap = ((BitmapDrawable) userImage.getDrawable()).getBitmap();

                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    imageViewBitmap.compress(Bitmap.CompressFormat.PNG, 10, baos);
                    imgBytes = baos.toByteArray();

                    upLoadImageBytes(imgBytes);
                    editProfileIntent = new Intent(MyPictureActivity.this, EditProfileActivity.class);
                    startActivity(editProfileIntent);

                }

            } else {
                Snackbar.make(findViewById(android.R.id.content), "Select an Image From Camera or Gallery", Snackbar.LENGTH_LONG).show();
            }
        }
    });

通过改造上传图片的方法,效果很好:

private void upLoadImageBytes(byte[] imgBytes) {

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request originalReq = chain.request();

            Request request = originalReq.newBuilder()
                    .addHeader("x-access-token", key_token)
                    .method(originalReq.method(), originalReq.body())
                    .build();

            return chain.proceed(request);
        }
    });

    OkHttpClient client = builder.build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();

    ImageService anInterface = retrofit.create(ImageService.class);

    RequestBody imageFileBody = RequestBody.create(MediaType.parse("image/*"), imgBytes);

    MultipartBody.Part partBody = MultipartBody.Part.createFormData("avatar", "avatar.jpg", imageFileBody);

    Call<ImageResponse> imageCall = anInterface.upLoadImage(partBody);
    imageCall.enqueue(new Callback<ImageResponse>() {
        @Override
        public void onResponse(Call<ImageResponse> call, retrofit2.Response<ImageResponse> response) {
            Log.d(TAG, "Response body is:\t" + response.body().toString());
        }

        @Override
        public void onFailure(Call<ImageResponse> call, Throwable t) {
            Log.d(TAG, "Response error message is:\t" + t.getMessage().toString());
        }
    });

}

PS:我要做的是在单击按钮时重新上传包含在我的图像视图中的图像。有人可以说有什么问题吗?谢谢

【问题讨论】:

    标签: android arrays android-imageview android-bitmap


    【解决方案1】:

    您的“imgBytes”数组为空,正如异常所说,您无法检查空数组的长度。

    试试这个:

    if (userImage.getDrawable() == avatar_drawable || imgBytes == null || imgBytes.length == 0) {
       ....
    }
    

    【讨论】:

    • 它会抛出同样的错误。我能做些什么来解决它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多