将用户选择的图像中的图像位图加载到图像视图中不会设置图像

Loading Image bitmap from user picked image into imageview doesn't set image

一个初学者这里..

我正在将图像设置到图像视图中,用户将选择该图像,但是当我选择图像时,图像视图没有加载图像。

M 应用程序正在打开文件选择器,我正在选择图像,它只是 不在 imageview 中加载选取的图像。

<ImageView
    android:layout_marginRight="5dp"
    android:id="@+id/logoImageView"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_gravity="center|end"
     />

java..

ImageView logoimage=findViewById(R.id.logoImageView);

我的 Imageview 上有这个 onclick 侦听器..

logoImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent fileChoosingIntent =new Intent(Intent.ACTION_OPEN_DOCUMENT);
                fileChoosingIntent.setType("image/*");
                startActivityForResult(fileChoosingIntent,10);
            }
        });

OnActivityResults 方法

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(resultCode==10){

            logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
        }
    }

androdi studio is giving this warning "Method invocation 'getData' may produce 'NullPointerException'" on data.getData() method...

我也试过滑行

Glide.with(this).load(data.getData()).into(logoImage);

我得到了相同的结果,空白图像视图。

其余代码是保密的(初学者不能有密码吗?:p)

注意 - 它在 logcat 中没有显示任何内容 非常感谢您的支持...:-)

logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));

您没有获取文件,因此 decodeFile() 无法正常工作。

到目前为止,最好的解决方案是将 Glide or Picasso 添加到您的项目中,然后将 Uri (data.getData()) 提供给库以加载到您的 ImageView.直言不讳:这样做的任何人都需要一个很好的理由。

当前代码最直接的等价物是使用 getContentResolver().openInputStream() 获取 InputStreamUri 标识的内容。然后,使用 BitmapFactory.decodeStream() 填充 ImageView。这将在主应用程序线程上完成这项工作(激怒对等 developers/managers)并冻结您的 UI(激怒用户)。这就是为什么您应该只使用 Glide 或 Picasso,因为它们会为您处理后台线程以及许多其他事情(例如,缓存)。

您弄错了 onActivityResult 方法中的代码。 requestCode 是标识您的请求的那个。

来自 Activity 源代码:

requestCode The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.

resultCode The integer result code returned by the child activity through its setResult().

您应该使用 resultCode 来确保您的请求成功。

当涉及到 NullPointerException 警告时,在访问其字段或方法之前,您应该始终检查所使用的可空变量实际上是否 null

因此您使用 Glide 的 startActivityResult() 方法应该更像这样:

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == 10) {
            if (resultCode == RESULT_OK && data != null) {
               Glide.with(this).load(data.getData()).into(logoImage);
            } else {
              // optional null data handling
            }
        }
    }