android - Kotlin:如何将图像从 Internet 保存到内部存储
问题描述
我是 Android Studio 的新手,尤其是 Kotlin。我需要从互联网加载图像,然后将其保存到手机。我尝试使用 Glide 作为位图加载图像,然后将其保存。但它不起作用。这段代码是我发现的最好的东西,但它不起作用。
try {
var bitmap = Glide.with(this)
.asBitmap()
.load("https://s3.amazonaws.com/appsdeveloperblog/Micky.jpg")
.apply(RequestOptions().override(100).downsample(DownsampleStrategy.CENTER_INSIDE).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE))
.submit().get()
val wrapper = ContextWrapper(applicationContext)
var file = wrapper.getDir("Images", Context.MODE_PRIVATE)
file = File(file, "img.jpg")
val out = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out)
out.flush()
out.close()
}
catch (e: Exception) {
println(e)
}
我如何理解问题在于 Glide 的“.submit().get()”部分。但是如果我把它拿走,那么压缩就不起作用了。
解决方案
submit():
返回可用于在后台线程上执行阻塞获取的未来。
get():
如有必要,等待计算完成,然后检索其结果。
在您从 url 下载图像并将其保存到内部存储的情况下,您应该使用后台线程来执行此操作。如果您在主线程上调用,您的应用程序可能会抛出 ANR 对话框。
这里我将演示如何使用 AsyncTask API 下载和保存图像
首先编写一个类来下载和保存图像。
class DownloadAndSaveImageTask(context: Context) : AsyncTask<String, Unit, Unit>() {
private var mContext: WeakReference<Context> = WeakReference(context)
override fun doInBackground(vararg params: String?) {
val url = params[0]
val requestOptions = RequestOptions().override(100)
.downsample(DownsampleStrategy.CENTER_INSIDE)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
mContext.get()?.let {
val bitmap = Glide.with(it)
.asBitmap()
.load(url)
.apply(requestOptions)
.submit()
.get()
try {
var file = it.getDir("Images", Context.MODE_PRIVATE)
file = File(file, "img.jpg")
val out = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out)
out.flush()
out.close()
Log.i("Seiggailion", "Image saved.")
} catch (e: Exception) {
Log.i("Seiggailion", "Failed to save image.")
}
}
}
}
然后在活动中调用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DownloadAndSaveImageTask(this).execute("https://s3.amazonaws.com/appsdeveloperblog/Micky.jpg")
}
}
如果要保存到内部存储
var file = File(it.filesDir, "Images")
if (!file.exists()) {
file.mkdir()
}
file = File(file, "img.jpg")
它将图像保存在路径中data/data/yourapppackagename/files/Images/img.jpg
推荐阅读
- c - C语言中的字节顺序和移位运算符,我做对了吗?
- python - 设置 python 时无法使用特定的 gcc 版本
- c# - 将 NULL 值从数据库映射到对象的属性
- reactjs - 下一个 js 获取在 componentdidmount 上失败
- elasticsearch - 在弹性搜索过滤器中实现 Array.Except(Array2) > 0 查询?
- python - numpy 中的条件。如何使用 pandas 或 numpy 将 3 个或更多放入我的数据框中?
- xamarin - 如何更改 Xamarin Forms 中导航栏标题区域的字体大小?
- json - 仅在 JSON 之后加载 tableView
- uml - UML 状态图中是否允许没有直接转换的状态?
- android - 未找到 Azure Jenkins Android SDK