使用 Glide 将图片保存到存储
Save picture to storage using Glide
我正在尝试向我的应用添加 下载 功能,我正在使用 Glide Library 从他们的网站加载图片URL,使用下面的代码,我可以将图片保存到设备存储,但它并没有像我预期的那样工作。
new AsyncTask<FutureTarget<Bitmap>, Void, Bitmap>() {
@Override protected Bitmap doInBackground(FutureTarget<Bitmap>... params) {
try {
return params[0].get();
} catch (Exception ex) {
return null;
}
}
@Override protected void onPostExecute(Bitmap bitmap) {
if(bitmap == null) return;
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Art_"+System.currentTimeMillis());
}
}.execute(Glide.with(getApplicationContext()).load(url).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(width, height));
谁能帮我解决这个问题?
更新
1.Permissions 清单文件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 需要协程做一些后台工作
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
- 滑动获取位图图像
CoroutineScope(Dispatchers.IO).launch {
saveImage(Glide.with(this@MainActivity)
.asBitmap()
.load("https://i.imgur.com/4HFRb2z.jpg") // sample image
.placeholder(android.R.drawable.progress_indeterminate_horizontal) // need placeholder to avoid issue like glide annotations
.error(android.R.drawable.stat_notify_error) // need error to avoid issue like glide annotations
.submit()
.get())
}
- 使用特定名称将图像保存在新创建的文件夹中
private fun saveImage(image: Bitmap): String? {
var savedImagePath: String? = null
val imageFileName = "JPEG_" + "FILE_NAME" + ".jpg"
val storageDir = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.toString() + "/YOUR_FOLDER_NAME"
)
var success = true
if (!storageDir.exists()) {
success = storageDir.mkdirs()
}
if (success) {
val imageFile = File(storageDir, imageFileName)
savedImagePath = imageFile.getAbsolutePath()
try {
val fOut: OutputStream = FileOutputStream(imageFile)
image.compress(Bitmap.CompressFormat.JPEG, 100, fOut)
fOut.close()
} catch (e: Exception) {
e.printStackTrace()
}
// Add the image to the system gallery
galleryAddPic(savedImagePath)
//Toast.makeText(this, "IMAGE SAVED", Toast.LENGTH_LONG).show() // to make this working, need to manage coroutine, as this execution is something off the main thread
}
return savedImagePath
}
- 将图像添加到画廊并发送广播(不提太多,因为这是不可能的)
private fun galleryAddPic(imagePath: String?) {
imagePath?.let { path ->
val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val f = File(path)
val contentUri: Uri = Uri.fromFile(f)
mediaScanIntent.data = contentUri
sendBroadcast(mediaScanIntent)
}
}
原创
1.Permissions 清单文件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.Glide 将图像下载为位图
Glide.with(mContext)
.load("YOUR_URL")
.asBitmap()
.into(new SimpleTarget<Bitmap>(100,100) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
saveImage(resource);
}
});
- 将位图保存到您的内存中
private String saveImage(Bitmap image) {
String savedImagePath = null;
String imageFileName = "JPEG_" + "FILE_NAME" + ".jpg";
File storageDir = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
+ "/YOUR_FOLDER_NAME");
boolean success = true;
if (!storageDir.exists()) {
success = storageDir.mkdirs();
}
if (success) {
File imageFile = new File(storageDir, imageFileName);
savedImagePath = imageFile.getAbsolutePath();
try {
OutputStream fOut = new FileOutputStream(imageFile);
image.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.close();
} catch (Exception e) {
e.printStackTrace();
}
// Add the image to the system gallery
galleryAddPic(savedImagePath);
Toast.makeText(mContext, "IMAGE SAVED", Toast.LENGTH_LONG).show();
}
return savedImagePath;
}
private void galleryAddPic(String imagePath) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(imagePath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
根据 Akshay Nandwana 的回答,我使用该代码写入内部存储器:
Glide.with(context)
.asBitmap()
.load(url)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource,Transition<? super Bitmap> transition) {
write(fileName, resource);
}
});
这里是 write
方法:
public void write(String fileName, Bitmap bitmap) {
FileOutputStream outputStream;
try {
outputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
} catch (Exception error) {
error.printStackTrace();
}
}
SimpleTarget<Bitmap>
现已弃用,请使用 CustomTarget<Bitmap>
,您的 Glide 请求现在变为
kotlin
Glide.with(context)
.asBitmap()
.load(url)
.into(object: CustomTarget<Bitmap>() {
override fun onLoadCleared(placeholder: Drawable?) {
}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
}
})
Java
Glide.with(context)
.asBitmap()
.load(url)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
我使用了下面的代码,它对我有帮助,希望对其他人也有帮助
val bitmap: Bitmap = binding.imvbg.drawable.toBitmap()//bitmapDrawable.bitmap
saveImage(bitmap)
private fun saveImage(bitmap: Bitmap){
binding.progressBar.visibility = View.VISIBLE
val imageFileName = "SMILE_" + Random.nextInt()
val savedImageURL: String = MediaStore.Images.Media.insertImage(
requireContext().contentResolver,
bitmap,
imageFileName,
"Promo Image"
)
Handler().postDelayed({
binding.progressBar.visibility = View.GONE
Toast.makeText(requireContext(),"Image Downloaded",Toast.LENGTH_LONG).show()
},1000*5)
}
我正在尝试向我的应用添加 下载 功能,我正在使用 Glide Library 从他们的网站加载图片URL,使用下面的代码,我可以将图片保存到设备存储,但它并没有像我预期的那样工作。
new AsyncTask<FutureTarget<Bitmap>, Void, Bitmap>() {
@Override protected Bitmap doInBackground(FutureTarget<Bitmap>... params) {
try {
return params[0].get();
} catch (Exception ex) {
return null;
}
}
@Override protected void onPostExecute(Bitmap bitmap) {
if(bitmap == null) return;
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Art_"+System.currentTimeMillis());
}
}.execute(Glide.with(getApplicationContext()).load(url).asBitmap().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(width, height));
谁能帮我解决这个问题?
更新
1.Permissions 清单文件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 需要协程做一些后台工作
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
- 滑动获取位图图像
CoroutineScope(Dispatchers.IO).launch {
saveImage(Glide.with(this@MainActivity)
.asBitmap()
.load("https://i.imgur.com/4HFRb2z.jpg") // sample image
.placeholder(android.R.drawable.progress_indeterminate_horizontal) // need placeholder to avoid issue like glide annotations
.error(android.R.drawable.stat_notify_error) // need error to avoid issue like glide annotations
.submit()
.get())
}
- 使用特定名称将图像保存在新创建的文件夹中
private fun saveImage(image: Bitmap): String? {
var savedImagePath: String? = null
val imageFileName = "JPEG_" + "FILE_NAME" + ".jpg"
val storageDir = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.toString() + "/YOUR_FOLDER_NAME"
)
var success = true
if (!storageDir.exists()) {
success = storageDir.mkdirs()
}
if (success) {
val imageFile = File(storageDir, imageFileName)
savedImagePath = imageFile.getAbsolutePath()
try {
val fOut: OutputStream = FileOutputStream(imageFile)
image.compress(Bitmap.CompressFormat.JPEG, 100, fOut)
fOut.close()
} catch (e: Exception) {
e.printStackTrace()
}
// Add the image to the system gallery
galleryAddPic(savedImagePath)
//Toast.makeText(this, "IMAGE SAVED", Toast.LENGTH_LONG).show() // to make this working, need to manage coroutine, as this execution is something off the main thread
}
return savedImagePath
}
- 将图像添加到画廊并发送广播(不提太多,因为这是不可能的)
private fun galleryAddPic(imagePath: String?) {
imagePath?.let { path ->
val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val f = File(path)
val contentUri: Uri = Uri.fromFile(f)
mediaScanIntent.data = contentUri
sendBroadcast(mediaScanIntent)
}
}
原创
1.Permissions 清单文件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.Glide 将图像下载为位图
Glide.with(mContext)
.load("YOUR_URL")
.asBitmap()
.into(new SimpleTarget<Bitmap>(100,100) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
saveImage(resource);
}
});
- 将位图保存到您的内存中
private String saveImage(Bitmap image) {
String savedImagePath = null;
String imageFileName = "JPEG_" + "FILE_NAME" + ".jpg";
File storageDir = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
+ "/YOUR_FOLDER_NAME");
boolean success = true;
if (!storageDir.exists()) {
success = storageDir.mkdirs();
}
if (success) {
File imageFile = new File(storageDir, imageFileName);
savedImagePath = imageFile.getAbsolutePath();
try {
OutputStream fOut = new FileOutputStream(imageFile);
image.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.close();
} catch (Exception e) {
e.printStackTrace();
}
// Add the image to the system gallery
galleryAddPic(savedImagePath);
Toast.makeText(mContext, "IMAGE SAVED", Toast.LENGTH_LONG).show();
}
return savedImagePath;
}
private void galleryAddPic(String imagePath) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(imagePath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
根据 Akshay Nandwana 的回答,我使用该代码写入内部存储器:
Glide.with(context)
.asBitmap()
.load(url)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource,Transition<? super Bitmap> transition) {
write(fileName, resource);
}
});
这里是 write
方法:
public void write(String fileName, Bitmap bitmap) {
FileOutputStream outputStream;
try {
outputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
} catch (Exception error) {
error.printStackTrace();
}
}
SimpleTarget<Bitmap>
现已弃用,请使用 CustomTarget<Bitmap>
,您的 Glide 请求现在变为
kotlin
Glide.with(context)
.asBitmap()
.load(url)
.into(object: CustomTarget<Bitmap>() {
override fun onLoadCleared(placeholder: Drawable?) {
}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
}
})
Java
Glide.with(context)
.asBitmap()
.load(url)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
我使用了下面的代码,它对我有帮助,希望对其他人也有帮助
val bitmap: Bitmap = binding.imvbg.drawable.toBitmap()//bitmapDrawable.bitmap
saveImage(bitmap)
private fun saveImage(bitmap: Bitmap){
binding.progressBar.visibility = View.VISIBLE
val imageFileName = "SMILE_" + Random.nextInt()
val savedImageURL: String = MediaStore.Images.Media.insertImage(
requireContext().contentResolver,
bitmap,
imageFileName,
"Promo Image"
)
Handler().postDelayed({
binding.progressBar.visibility = View.GONE
Toast.makeText(requireContext(),"Image Downloaded",Toast.LENGTH_LONG).show()
},1000*5)
}