如何在Android中下载和保存图像
如何在Android中从给定url下载和保存图像?从2015年12月30日起编辑-图像下载终极指南如何在Android中下载和保存图像,android,android-imageview,imagedownload,Android,Android Imageview,Imagedownload,如何在Android中从给定url下载和保存图像?从2015年12月30日起编辑-图像下载终极指南 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 上次重大更新:2016年3月31日 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> TL;a.k.a.博士,
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
上次重大更新:2016年3月31日
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
TL;a.k.a.博士,别说了,给我密码强>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
跳到这篇文章的底部,复制BasicImageDownloader
(javadoc版本)
在项目中,实现OnImageLoaderListener
界面
你完成了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注意:尽管BasicImageDownloader
处理可能的错误
并将防止你的应用程序崩溃,如果出现任何问题,它将不会执行
下载的位图
上的任何后期处理(例如缩小尺寸)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
由于这篇文章受到了相当多的关注,我决定彻底修改它,以防止人们使用不推荐的技术、糟糕的编程实践或只是做一些愚蠢的事情——比如寻找“黑客”在主线程上运行网络或接受所有SSL证书
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我创建了一个名为“Image Downloader”的演示项目,演示如何使用我自己的Downloader实现、Android内置的DownloadeManager
以及一些流行的开源库下载(和保存)图像。您可以查看完整的源代码或下载项目
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注意:我还没有调整SDK 23+(棉花糖)的权限管理,因此该项目的目标是SDK 22(棒棒糖)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在我的结论中,在这篇文章的最后,我将分享我对我提到的每种特定图像下载方式的正确使用案例的拙见
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
让我们从自己的实现开始(您可以在本文末尾找到代码)。首先,这是一个基本的图像下载程序。它所做的只是连接到给定的url,读取数据并尝试将其解码为位图
,在适当的时候触发OnImageLoaderListener
接口回调。
这种方法的优点是:它很简单,而且您对正在发生的事情有一个清晰的概述。如果您只需要下载/显示和保存一些图像,而不需要维护内存/磁盘缓存,那么这是一个很好的方法
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注意:如果是大型图像,您可能需要
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
--
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Android是一种让系统为您处理下载的方式。它实际上可以下载任何类型的文件,不仅仅是图像。您可以让下载以静默方式进行,用户不可见,也可以让用户在通知区域中查看下载。您还可以注册广播接收器
,以便在下载完成后收到通知。设置非常简单,请参考链接项目以获取示例代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果您还想显示图像,使用下载管理器
通常不是一个好主意,因为您需要读取并解码保存的文件,而不仅仅是将下载的位图
设置为图像视图
。DownloadManager
也不为您的应用程序提供任何API来跟踪下载进度
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
--
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
现在我们来介绍一下伟大的东西——图书馆。他们可以做的不仅仅是下载和显示图像,还包括:创建和管理内存/磁盘缓存、调整图像大小、转换图像等等
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
首先,我将介绍一个功能强大的库,它由谷歌创建,并包含在官方文档中。虽然Volley是一个不专门处理图像的通用网络库,但它有一个非常强大的用于管理图像的API
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
您将需要实现一个用于管理截击请求的类,这样就可以开始了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
您可能想用Volley的NetworkImageView
替换您的ImageView
,因此下载基本上变成一行:
((NetworkImageView) findViewById(R.id.myNIV)).setImageUrl(url, MySingleton.getInstance(this).getImageLoader());
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果您需要更多的控制,这就是通过截击创建ImageRequest
的方式:
ImageRequest imgRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//do stuff
}
}, 0, 0, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//do stuff
}
});
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
默认情况下,毕加索管理磁盘/内存缓存,因此您无需担心。要获得更多控制,您可以实现目标
接口,并使用它将图像加载到中-这将提供类似于截取示例的回调。查看演示项目中的示例
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
毕加索还允许您将转换应用到下载的图像,甚至还有其他方法可以扩展这些API。在回收视图
/列表视图
/网格视图
中也能很好地工作
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
--
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
是另一个非常受欢迎的图书馆,用于图像管理。它使用自己的ImageLoader
,该加载程序(一旦初始化)有一个全局实例,可用于在一行代码中下载图像:
ImageLoader.getInstance().displayImage(url, myImageView);
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果要跟踪下载进度或访问下载的位图
:
ImageLoader.getInstance().displayImage(url, myImageView, opts,
new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
//do stuff
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
//do stuff
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//do stuff
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
//do stuff
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
//do stuff
}
});
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
本例中的opts
参数是一个DisplayImageOptions
对象。请参阅演示项目以了解更多信息
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
与Volley类似,UIL提供了FailReason
类,使您能够检查下载失败时出现的错误。默认情况下,如果您没有明确告诉UIL不要这样做,UIL将维护内存/磁盘缓存
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注:作者提到,截至2015年11月27日,他不再维护该项目。但是由于有很多贡献者,我们可以希望Universal Image Loader能够继续存在
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
--
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Facebook是最新且(IMO)最先进的库,它将图像管理提升到了一个新的水平:从将位图保留在java堆之外(在棒棒糖之前)到支持和更新
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要了解有关壁画背后的想法和技术的更多信息,请参阅
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
基本用法很简单。注意,您需要调用Fresco.initialize(上下文)代码>仅一次,最好在应用程序中