如何从具有私人访问权限的毕加索加载aws图像

时间:2017-09-26 09:22:59

标签: android amazon-s3 picasso

我正在尝试使用Picasso将存储在aws S3上的图像加载到我的Android应用程序中,但是我得到的空白图像在我的logcat中没有错误,对于我来说,通过相关代码行进行一般调试没有任何问题。 我们对图片进行私密访问,因此图片网址无法在浏览器上运行。 我需要使用Picasso将图像显示到我的Android应用程序中。但它不起作用。

我的代码段

  new Picasso.Builder(getApplicationContext()).downloader(new S3Downloader(getApplicationContext(), s3Client, bucket))
                .build()
                .load("https://s3-ea-east-8.amazonaws.com/music/MusicApp_3.jpg")
                .placeholder(R.drawable.img_placeholder)
                .memoryPolicy(MemoryPolicy.NO_CACHE)
                .networkPolicy(NetworkPolicy.NO_CACHE)
                .into(imageView);

通过使用上面的代码,图像只在安装应用程序后第一次显示。下一次它只显示占位符图像

我正在使用this library来显示图片。

问题不在于毕加索,而在于从“私人”网址加载图片。

请提出解决方案

4 个答案:

答案 0 :(得分:1)

只需使用:

Picasso.with(getApplicationContext()).load(your_url).noFade().into(imageView);

答案 1 :(得分:0)

write below code to load image in Picasso. 
variables:-  
String file_path                          -->> this is your image file path 
Imageview mViewHolder.img_post_photo      -->> this is your imageview to load image.
                        Picasso.with(context)
                                .load(file_path)
                                .placeholder(R.mipmap.ic_launcher)
                                .error(R.mipmap.ic_launcher)
                                .into(mViewHolder.img_post_photo, new Callback() {
                                    @Override
                                    public void onSuccess() {

                                    }

                                    @Override
                                    public void onError() {
                                        Picasso.with(context)
                                                .load(file_path)
                                                .placeholder(R.mipmap.ic_launcher)
                                                .error(R.mipmap.ic_launcher)
                                                .into(mViewHolder.img_post_photo);
                                    }
                                });
Set dependencies in your app build.gradle file:-
compile 'com.squareup.picasso:picasso:2.5.2'

hope this code helps you.

答案 2 :(得分:0)

您需要从S3客户端生成预先签名的Url,然后您可以将该网址传递给picasso。 该网址将公开,并且会有一个明确的日期。

答案 3 :(得分:0)

您可以使用以下代码集,这是一个aynctask,它将使用glide通过生成presignedurl来附加s3的私有图像。

Anonymous type can be replaced with lambda

可以这样称呼

  public class sets3imageasync extends AsyncTask<Object, Void, String> {
    // The list of objects we find in the S3 bucket

static final String s3bucket=bucket_name;


Context scontext;
ImageView image;


@Override
protected String doInBackground(Object... objects) {
    // Queries files in the bucket from S3.
    Calendar cal = Calendar.getInstance();
    Log.d(TAG, "doInBackground: in progress");
    cal.setTime(new Date());
    cal.add(Calendar.HOUR, +1);
    Date oneHourLater = cal.getTime();
    AmazonS3Client s3 =  (AmazonS3Client) objects[0];
    scontext= (Context) objects[1];
    image=(ImageView) objects[2];
    String imagekey=(String) objects[3]; 
    GeneratePresignedUrlRequest generatePresignedUrlRequest =
            new GeneratePresignedUrlRequest(s3bucket, imagekey)
                    .withMethod(HttpMethod.GET)
                    .withExpiration(oneHourLater);
    URL url = s3.generatePresignedUrl(generatePresignedUrlRequest);

    Log.e("url was", url.toString());
    return url.toString();
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);


    Log.d(TAG, "onPostExecute: completed "+s);

    Glide.with(scontext).load(s)
            .apply(new RequestOptions()
                    .centerCrop())
            .placeholder(scontext.getResources().getDrawable(R.drawable.progress_animation))
            .into((image));

}