i´m using Picasso and Target for downloading an image and saving it as a bitmap to pass it into an Object which i use for and RecyclerView.
But when I try to download the image the Target also loads the onBitmapFailed or onPrepareLoad and the bitmapis not successfully received...
where´s the bug in my code? The URL is absolutely correct. when i take the passed URL and paste it in chrome browser the image shows...
Code
//Get Bitmap
targetForBitmap = new Target() {
#Override
public void onBitmapLoaded (final Bitmap responseBitmap, Picasso.LoadedFrom from){
bitmap = responseBitmap;
}
#Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
Log.i("prepareLoad", "onPrepereLoad ääääääääääääääääääää ");
}
#Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.i("onBitmapFailed", "onBitmapFailed xxxxxxxxxxxxxxxx");
}
};
String url = "Http://" + server_wan + ":" + port_wan + "/" + server_path + "/Produktbilder/" + product_image + ".png";
Log.i("url", url);
Picasso.with(SpeisekarteActivity.this)
.load(url)
.into(targetForBitmap);
targetForBitmap is string instance at beginning of the class (private Target targetForBitmap)
Please provide the imageview where you want to load the image inside the onBitmapLoaded.
Try using .placeholder(drawable) and .error(drawable) with picasso.Use it after .load function.
Try checking out here:
[1]: Picasso Library, Android: Using Error Listener
Related
Images in a server and I have to download an image from the server. Image Url Stored in ArrayList using Asynctask.
how to download an image from ArrayList URL? I using Download manager and custom download but its give not an actual response.
you can use Picasso library.
for (String url : urlList) {
Picasso.with(this)
.load(url)
.into(new Target() {
#Override
public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){
/* Save the bitmap or do something with it here */
//Set it in the ImageView
theView.setImageBitmap(bitmap);
}
});
}
#Override
public void onBindViewHolder(final ViewHolder holder ,int position) {
Glide.with(c)
.load(images.get(position))
.placeholder(R.mipmap.ic_launcher)
.into(holder.img);
holder.img.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
try{
String fileName = "bitmap.png";
FileOutputStream stream = c.openFileOutput(fileName,Context.MODE_PRIVATE);
Intent showBigPicture = new Intent(c,showBigPicture.class);
Bitmap bitmapImage = BitmapFactory.decodeFile(images.get(position));
bitmapImage.compress(Bitmap.CompressFormat.PNG,100,stream);
stream.close();
bitmapImage.recycle();
showBigPicture.putExtra("image",fileName);
c.startActivity(showBigPicture);
}catch (Exception e){
e.printStackTrace();
}
}
});
}
this is showing in logCat " Unable to decode stream: java.io.FileNotFoundException: android.support.v7.widget.AppCompatImageView{e22d977 V.ED..C. ...P.... 0,0-540,890 #7f0b0061 app:id/img}: open failed: ENOENT (No such file or directory)"
I believe you want to follow this answer on saving Bitmap images. I believe the reason you're getting a FileNotFoundException is because you're providing the URI to a file that doesn't exist yet to the decodeFile function that's quite possibly a URL from what I can tell. In short, to save a bitmap:
Create a new File(filename)
Decode file using getName on the File from step 1
Create FileOutputStream from File
Compress the bitmap image into the FileOutputStream
From what I can surmise from your question, it looks as though you're showing a images in a RecyclerView and when an image is clicked, you want to open another activity which shows a version of the full image. If that's close to your use-case, and you're using Glide, I would recommend taking advantage of its built-in automatic caching feature to reduce network calls instead of manually saving the file.
By default, disk and memory-based caching is enabled in Glide as long as the same filename, path, or URL are used to obtain the image on each Glide.load(...). If you'd like to manipulate how the caching occurs, use the DiskCacheStrategy enum to control that every time you load the image:
Glide.with(c)
.load(images.get(position))
.diskCacheStrategy(DiskCacheStrategy.SOURCE) # Will cache the source downloaded image before any transformations are applied
.placeholder(R.mipmap.ic_launcher)
.into(holder.img);
If you still want to save the file for other reasons, use a SimpleTarget instead of loading directly into your ImageView like so:
Glide.with(c)
.load(images.get(position))
.diskCacheStrategy(DiskCacheStrategy.SOURCE) # Will cache the source downloaded image before any transformations are applied
.placeholder(R.mipmap.ic_launcher)
.asBitmap()
.into(new SimpleTarget<GlideDrawable>() {
#Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
holder.img.setImageDrawable(new BitmapDrawable(bitmap));
saveImage(bitmap); # This being an encapsulation of the steps outlined earlier
}
});
I have spent a lot of time trolling through multiple different threads concerning this topic, but I have yet to find an answer that works well with my code (Android SDK 23, in 2016). A lot of the answers are deprecated, and others just flat-out don't work like they're supposed to, and I was wondering if I could get a solid answer on this:
I am trying to include a Pokemon sprite (static image) in my program from Serebii. nums is a variable indicating the Pokemon's dex number (this one functions correctly, I promise). And this code is running in the main UI thread, which I know is frowned upon, but right now I'm trying to get the image loading, and then the smoothness of the app down. I don't really need a Bitmap, per se, but I need my ImageView to update and display the image given by the URL. How do I do it?
URL url = null;
try {
url = new URL("http://www.serebii.net/xy/pokemon/" + nums + ".png");
} catch (MalformedURLException e) {
e.printStackTrace();
}
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
mImageView.setImageBitmap(bmp);
Just use Picasso library, it will do all your image loading. You only need to provide the url of the image correctly.
String url = "http://www.serebii.net/xy/pokemon/" + nums + ".png";
Picasso.with(yourContext)
.load(url)
.into(mImageView);
You can use Picasso Library to load images.
a) Add Gradle into your project.
compile 'com.squareup.picasso:picasso:2.5.2'
b) Usage
Picasso.with(context).load("http://www.serebii.net/xy/pokemon/" + nums + ".png").into(imageView);
Also there are another libraries, you can use like
Fresco by Facebook, Universal Image loader
You can try using Picasso as:
Picasso.with(context)
.load(url)
.into(imageview);
Or use Universal Image loader as:
ImageLoader imageLoader = new ImageLoader(context);
imageLoader.displayImage(imageUri, imageView);
Use the Piassco library for it..Library link
For setting the Bitmap on the ImageView
Picasso.with(getContext()).load("your url").into(new Target() {
#Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//do what ever you want with your bitmap
imgView.setImageBitmap(loadedImage);///imgView is use to set the image in it
}
#Override
public void onBitmapFailed(Drawable errorDrawable) {
}
#Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
And another method of Picasso :-
Picasso.with(this)
.load("your_image_url")
.placeholder(R.drawable.no_image)
.error(android.R.drawable.stat_notify_error)
.networkPolicy(NetworkPolicy.OFFLINE)//user this for offline support
.into(YOUR_IMAEGVIEW);
OR
You can also use the Universal Image Loader..Here is the link Universal image loader
ImageLoader imageLoader = ImageLoader.getInstance(); // Get singleton instance
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(getActivity()));
imageLoader = com.nostra13.universalimageloader.core.ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.YOUR_DRAWABLE)
.showImageForEmptyUri(R.drawable.YOUR_DRAWABLE)
.showImageOnFail(R.drawable.YOUR_DRAWABLE)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.build();
imageLoader.displayImage("your_image_url", YOUR_IMAGEVIEW, null);
I am currently using Picasso to load image from server side and save it in Internal storage in Android.
I am using the following code to load images from server side:
Handler uiHandler = new Handler(Looper.getMainLooper());
uiHandler.post(new Runnable() {
#Override
public void run() {
System.out.println("start run.....");
Picasso.with(context)
.load(url)
.resize(10, 10)
.into(new Target() {
#Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
System.out.println("start picasso....");
if (bitmap != null) {
// save image in internal memory
String directory = saveToInternalStorage(bitmap, name);
System.out.println(directory);
} else
System.out.println("image return is null.....");
}
#Override
public void onBitmapFailed(Drawable errorDrawable) {
System.out.println("Failure in loading photo from server: " + name);
}
#Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
and the following code to save image in memory:
private String saveToInternalStorage(Bitmap bitmapImage, String imageName){
System.out.println("start saving image......");
ContextWrapper cw = new ContextWrapper(context);
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
// Create imageDir
File mypath=new File(directory,imageName);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(mypath);
// Use the compress method on the BitMap object to write image to the OutputStream
boolean save=bitmapImage.compress(Bitmap.CompressFormat.PNG, 2, fos);
System.out.println(save);
fos.flush();
fos.close();
} catch (Exception e) {
System.out.println("Error in saving photo "+e.toString());
}
System.out.println("Image is successfully saved..."+directory.getAbsolutePath());
return directory.getAbsolutePath();
}
However, my problem is with Garbage Collection. Picasso does not start at all, even I do not get any failure message from Picasso, and I face with following error :
D/dalvikvm: GC_CONCURRENT freed 434K, 11% free 12767K/14215K, paused 14ms+25ms, total 118ms
I would be thankful, if anyone suggest me any solution to avoid this error.
this is not error instead this is information from GC saying GC_CONCURRENT has freed memory which is 434K and took 25ms. There is Google IO talk I would recommend you watch it
"Picasso does not start at all". Are you not able to load image at all ?
I am not sure if you are facing any problem regarding loading of the image or saving to your internal storage. As much I can guess you are able to do it and the message which you think is error is your problem.
If I am not getting it right. I would pledge you to draft you question in more specified way.
hope this will help!
Hello I am using the picasso for downloading the bitmap in android.
Below is my code for this
// make sure to set Target as strong reference
private Target loadtarget;
public void loadBitmap(String url) {
if (loadtarget == null) loadtarget = new Target() {
#Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
// do something with the Bitmap
handleLoadedBitmap(bitmap);
}
#Override
public void onBitmapFailed() {
}
}
Picasso.with(this).load(url).into(loadtarget);
}
I want to cache the bitmap so that later on it will pcik from cache instead of download it again. Does this code cache the downloaded bitmap ? If not how to enable
cache using picasso library for downloading the bitmap ?
Refer: http://square.github.io/picasso/
It will automatically cache the image.