简体   繁体   English

毕加索没有从画廊加载图像

[英]Picasso not loading image from gallery

I've tried every answer I've found for this issue without success.我已经尝试了我为这个问题找到的所有答案,但都没有成功。 My users choose an image from their gallery to be displayed in an ImageView using Picasso, but it never get's loaded into the imageview.我的用户从他们的画廊中选择一张图像,以使用 Picasso 显示在 ImageView 中,但它永远不会加载到 imageview 中。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if(resultCode == RESULT_OK){
        if(requestCode == SELECT_PICTURE){

            String selectedImageURI = data.getData().getPath();
            File imageData = new File(String.valueOf(selectedImageURI));
            //selectedImagePath = getPath(selectedImageURI);

            if(!image1_exists){
                Picasso.with(MemoriesActivity.this).load(imageData).noPlaceholder().centerCrop().fit().into(image1);
            }
            else if(!image2_exists){
                //This is executed
                Picasso.with(MemoriesActivity.this).load(imageData).noPlaceholder().centerCrop().fit().into(image2);
            }
            else if(!image3_exists){
                //Picasso.with(MemoriesActivity.this).load(imageData).centerCrop().fit().into(image3);
            }
        }

    }
}

public void addPhoto(View v){

    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);

}

I can't find any explainable cause for this except something must be wrong with onActivityResult together with Picasso, because I load images using exactly the same Picasso build/method when fetching images from my backend.我找不到任何可以解释的原因,除非 onActivityResult 和 Picasso 一起出现问题,因为我在从后端获取图像时使用完全相同的 Picasso 构建/方法加载图像。

EDIT SOLUTION编辑解决方案

public void attachImage(Uri uri, int imageIndex) {

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 0;

    InputStream stream;
    try {

        stream = getContentResolver().openInputStream(uri);

        Bitmap bitmap = BitmapFactory.decodeStream(stream);
        Bitmap image_scaled = Bitmap.createScaledBitmap(bitmap, 800, 800 * bitmap.getHeight() / bitmap.getWidth(), false);


        if (imageIndex == 0) {
            uploadImage(image_scaled, "image1");
            handler.get(imageIndex).loadImageFromUri(this,(ImageView) findViewById(R.id.image1),uri);
            handler.get(imageIndex).loadEnlargedImageFromUri(this,image1_full,uri);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

}

So I created that method (it's under construction, but the solution remains the same) and calls it like this in onActivityResult :所以我创建了这个方法(它正在建设中,但解决方案保持不变)并在onActivityResult 中这样调用它:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {

            Uri selectedImage = data.getData();

            int imageIndex = getFirstNonExistingImage();

            if (imageIndex == 0) {
                attachImage(selectedImage,imageIndex);
            }

        }

    }
}

I load the URI with a custom Picasso class (handler.loadImageFromUri), but same principle.我使用自定义 Picasso 类 (handler.loadImageFromUri) 加载 URI,但原理相同。

Solved by creating an external method and executing that inside onActivityResult instead.通过创建一个外部的方法和执行该内部onActivityResult代替解决 No idea why, but it worked.不知道为什么,但它奏效了。

get real path from URI and set it to Picasso.从 URI 获取真实路径并将其设置为 Picasso。

 Uri selectedImage = data.getData();

 imagePath = getRealPathFromURI(this, selectedImage);

 public String getRealPathFromURI(Context context, Uri contentUri) {

 Cursor cursor = null;

 try {

  String[] proj = {MediaStore.Images.Media.DATA};

   cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

You dont need to make cursor query with picasso.您不需要使用 picasso 进行游标查询。

With picasso you just need to write one line of code I have extended it for better understanding :-使用毕加索,您只需要编写一行代码,我对其进行了扩展以便更好地理解:-

           //Get image Uri
            Uri selectedImageURI = data.getData();

            //Load image from picked Uri
Picasso.with(MainActivity1.this).load(selectedImageURI).noPlaceholder().centerCrop().fit()
                    .into((ImageView) findViewById(R.id.imageView1));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM