你如何下载并在Android中给定的URL保存图像?
Answer 1:
编辑为二○一五年十二月三十零日的 - 终极指南下载图像
最后一个主要更新:2016年3月31日
TL; DR又名停止说话,只是给我的代码!
跳转到这个帖子的底部,复制
BasicImageDownloader
(javadoc的版本在这里 )到项目,落实OnImageLoaderListener
接口,你就大功告成了。注 :虽然
BasicImageDownloader
处理可能出现的错误,并会阻止你的应用程序崩溃的情况下,出现任何错误,它不会对下载进行任何后期处理(如裁员)Bitmaps
。
由于这个职位已经收到了相当多的关注,我已经决定彻底返工,以防止人们从使用过时的技术,好的编程问题或只是在做愚蠢的事情 - 就像寻找“黑客”在主线程上运行的网络或接受所有SSL证书。
我创建了一个名为“图片下载”演示项目,演示如何使用我自己下载的实现下载(和保存)的图像,在Android内置的DownloadManager
以及一些流行的开源库。 您可以查看完整的源代码或下载该项目在GitHub上 。
注 :我还没有调整权限管理SDK 23+(棉花糖),然而,因此该项目的目标是SDK 22(棒棒堂)。
在我的这个帖子的末尾最后,我将分享我对正确使用情况下对我所提到的图像下载的每个特定的方式愚见 。
让我们先从一个自己的实现(你可以找到在文章最后的代码)。 首先,这是一个基本 ImageDownloader,就是这样。 它所做的是连接到给定的URL,读取数据,并试图将其作为一个解码Bitmap
,触发OnImageLoaderListener
接口回调时适当。 这种方法的优点 - 它很简单,你有什么事情都一目了然。 去一个好方法,如果你需要的是下载/显示和保存一些图像,而你不关心保持存储/磁盘缓存。
注:在大图像的情况下,可能需要扩展下来 。
-
Android的下载管理器是一种能够让系统下载适合你。 它实际上能够下载任何类型的文件,不只是图像的。 你可以让你的下载默默无形的发生给用户,也可以使用户能够看到下载在通知区域。 您也可以注册一个BroadcastReceiver
下载完成后得到通知。 安装程序是非常简单的,请参阅示例代码链接的项目。
使用DownloadManager
是通常不是一个好主意,如果你也想显示的图像,因为你需要阅读和解码,而不是仅仅设定下载保存的文件Bitmap
到ImageView
。 该DownloadManager
还为您应用中跟踪的下载进度不提供任何API。
-
现在引进的伟大的东西 - 库。 他们能做的不仅仅是下载和显示图像,其中包括更多的:创建和管理存储/磁盘缓存,调整图像大小,改变他们等等。
我将开始乱射 ,由谷歌创建,并由官方文档涵盖了功能强大的库。 虽然是不专业的图片上通用的网络库,排功能来管理图像相当强大的API。
您需要实现一个单例类管理凌空请求,你是好去。
您可能要取代你ImageView
与排球的NetworkImageView
,所以下载基本上变成一个班轮:
((NetworkImageView) findViewById(R.id.myNIV)).setImageUrl(url, MySingleton.getInstance(this).getImageLoader());
如果您需要更多的控制,这是它看起来像创建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
}
});
值得一提的是,凌空通过提供具有出色的错误处理机制VolleyError
类,可以帮助您确定错误的确切原因。 如果你的应用程序做了很多联网和管理图像不是主要目的,那么它凌空一个完美的适合你。
-
广场的毕加索是一个众所周知的库,将尽一切的图像加载的东西给你。 只显示使用毕加索是非常简单的图像:
Picasso.with(myContext)
.load(url)
.into(myImageView);
默认情况下,毕加索管理磁盘/内存缓存,这样你就不需要担心。 欲了解更多的控制,你可以实现的Target
接口,并用它来你的图像加载到-这将提供类似凌空例子回调。 检查的例子演示项目。
毕加索,您还可以将转换应用于下载的图像,甚至有其他库周围扩展这些API。 也工作得很好的RecyclerView
/ ListView
/ GridView
。
-
通用图像装载机是另一种非常流行的图书馆服务形象管理的目的。 它使用自己的ImageLoader
是(一旦被初始化)具有全局实例可以用来下载图像中的一行代码:
ImageLoader.getInstance().displayImage(url, myImageView);
如果你想跟踪下载进度或访问下载的Bitmap
:
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
}
});
所述opts
在该示例参数是一个DisplayImageOptions
对象。 请参阅示范项目,以了解更多信息。
类似抽射,UIL提供FailReason
类,使您可以检查出了什么问题上下载失败。 默认情况下,UIL保持存储/磁盘高速缓存,如果你不明确告诉它不这样做。
注 :笔者已经提到,他不再保持该项目为11月27,2015年的,但因为有许多贡献者,我们可以希望通用图像装载机将居住。
-
Facebook的壁画是最新的和(IMO)的最先进的库需要图像管理再上新台阶:从保留Bitmaps
关闭Java堆(前棒棒堂)支持的动画格式和渐进式JPEG流 。
要了解更多有关想法和技术落后壁画,请参阅这篇文章 。
基本用法是相当简单的。 请注意,您需要调用Fresco.initialize(Context);
只有一次,优选在Application
类。 初始化壁画不止一次可能会导致不可预知的行为和OOM错误。
壁画使用Drawee
s到显示图像,你可以把它们作为ImageView
S:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/drawee"
android:layout_width="match_parent"
android:layout_height="match_parent"
fresco:fadeDuration="500"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/placeholder_grey"
fresco:failureImage="@drawable/error_orange"
fresco:placeholderImageScaleType="fitCenter"
fresco:failureImageScaleType="centerInside"
fresco:retryImageScaleType="centerCrop"
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"
fresco:roundAsCircle="false" />
正如你所看到的,很多东西(包括转换选项)的XML被已经被定义,因此,所有你需要做的,显示图像是一个班轮:
mDrawee.setImageURI(Uri.parse(url));
壁画提供了一个扩展的定制API,这下情况下,可以说是相当复杂的,需要用户仔细阅读文档(是的,有时你需要 RTFM)。
我已经包括了渐进式JPEG的例子和动画图像导入示例项目。
结论 - “我已经了解了伟大的东西,我现在应该怎么用?”
请注意,以下的文字反映了我个人的意见,而不应被视为一个假设。
- 如果你只需要下载/保存/显示一些图像,不打算在使用它们
Recycler-/Grid-/ListView
,不需要一大堆的图像,其将显示准备时,BasicImageDownloader应该适合你的需要。 - 如果您的应用程序保存图像(或其它文件)作为用户或自动操作的结果,则不需要进行经常显示的图像,使用Android 下载管理器 。
- 如果你的应用程序做了很多联网,发送/接收
JSON
数据,与图像的作品,但这些都不是应用程序的主要目的,去截击 。 - 您的应用图像/媒体中心,你想一些转换应用到图像,不想复杂的API打扰:使用毕加索 (注:不提供任何API来跟踪中间下载状态)或通用图片装载机
- 如果您的应用程序是所有关于影像,需要先进的功能,如显示的动画格式,你准备阅读的文档,用壁画去。
如果你错过了,在Github上链接的示范项目。
而这里的BasicImageDownloader.java
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Set;
public class BasicImageDownloader {
private OnImageLoaderListener mImageLoaderListener;
private Set<String> mUrlsInProgress = new HashSet<>();
private final String TAG = this.getClass().getSimpleName();
public BasicImageDownloader(@NonNull OnImageLoaderListener listener) {
this.mImageLoaderListener = listener;
}
public interface OnImageLoaderListener {
void onError(ImageError error);
void onProgressChange(int percent);
void onComplete(Bitmap result);
}
public void download(@NonNull final String imageUrl, final boolean displayProgress) {
if (mUrlsInProgress.contains(imageUrl)) {
Log.w(TAG, "a download for this url is already running, " +
"no further download will be started");
return;
}
new AsyncTask<Void, Integer, Bitmap>() {
private ImageError error;
@Override
protected void onPreExecute() {
mUrlsInProgress.add(imageUrl);
Log.d(TAG, "starting download");
}
@Override
protected void onCancelled() {
mUrlsInProgress.remove(imageUrl);
mImageLoaderListener.onError(error);
}
@Override
protected void onProgressUpdate(Integer... values) {
mImageLoaderListener.onProgressChange(values[0]);
}
@Override
protected Bitmap doInBackground(Void... params) {
Bitmap bitmap = null;
HttpURLConnection connection = null;
InputStream is = null;
ByteArrayOutputStream out = null;
try {
connection = (HttpURLConnection) new URL(imageUrl).openConnection();
if (displayProgress) {
connection.connect();
final int length = connection.getContentLength();
if (length <= 0) {
error = new ImageError("Invalid content length. The URL is probably not pointing to a file")
.setErrorCode(ImageError.ERROR_INVALID_FILE);
this.cancel(true);
}
is = new BufferedInputStream(connection.getInputStream(), 8192);
out = new ByteArrayOutputStream();
byte bytes[] = new byte[8192];
int count;
long read = 0;
while ((count = is.read(bytes)) != -1) {
read += count;
out.write(bytes, 0, count);
publishProgress((int) ((read * 100) / length));
}
bitmap = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());
} else {
is = connection.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
}
} catch (Throwable e) {
if (!this.isCancelled()) {
error = new ImageError(e).setErrorCode(ImageError.ERROR_GENERAL_EXCEPTION);
this.cancel(true);
}
} finally {
try {
if (connection != null)
connection.disconnect();
if (out != null) {
out.flush();
out.close();
}
if (is != null)
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if (result == null) {
Log.e(TAG, "factory returned a null result");
mImageLoaderListener.onError(new ImageError("downloaded file could not be decoded as bitmap")
.setErrorCode(ImageError.ERROR_DECODE_FAILED));
} else {
Log.d(TAG, "download complete, " + result.getByteCount() +
" bytes transferred");
mImageLoaderListener.onComplete(result);
}
mUrlsInProgress.remove(imageUrl);
System.gc();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public interface OnBitmapSaveListener {
void onBitmapSaved();
void onBitmapSaveError(ImageError error);
}
public static void writeToDisk(@NonNull final File imageFile, @NonNull final Bitmap image,
@NonNull final OnBitmapSaveListener listener,
@NonNull final Bitmap.CompressFormat format, boolean shouldOverwrite) {
if (imageFile.isDirectory()) {
listener.onBitmapSaveError(new ImageError("the specified path points to a directory, " +
"should be a file").setErrorCode(ImageError.ERROR_IS_DIRECTORY));
return;
}
if (imageFile.exists()) {
if (!shouldOverwrite) {
listener.onBitmapSaveError(new ImageError("file already exists, " +
"write operation cancelled").setErrorCode(ImageError.ERROR_FILE_EXISTS));
return;
} else if (!imageFile.delete()) {
listener.onBitmapSaveError(new ImageError("could not delete existing file, " +
"most likely the write permission was denied")
.setErrorCode(ImageError.ERROR_PERMISSION_DENIED));
return;
}
}
File parent = imageFile.getParentFile();
if (!parent.exists() && !parent.mkdirs()) {
listener.onBitmapSaveError(new ImageError("could not create parent directory")
.setErrorCode(ImageError.ERROR_PERMISSION_DENIED));
return;
}
try {
if (!imageFile.createNewFile()) {
listener.onBitmapSaveError(new ImageError("could not create file")
.setErrorCode(ImageError.ERROR_PERMISSION_DENIED));
return;
}
} catch (IOException e) {
listener.onBitmapSaveError(new ImageError(e).setErrorCode(ImageError.ERROR_GENERAL_EXCEPTION));
return;
}
new AsyncTask<Void, Void, Void>() {
private ImageError error;
@Override
protected Void doInBackground(Void... params) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(imageFile);
image.compress(format, 100, fos);
} catch (IOException e) {
error = new ImageError(e).setErrorCode(ImageError.ERROR_GENERAL_EXCEPTION);
this.cancel(true);
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onCancelled() {
listener.onBitmapSaveError(error);
}
@Override
protected void onPostExecute(Void result) {
listener.onBitmapSaved();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public static Bitmap readFromDisk(@NonNull File imageFile) {
if (!imageFile.exists() || imageFile.isDirectory()) return null;
return BitmapFactory.decodeFile(imageFile.getAbsolutePath());
}
public interface OnImageReadListener {
void onImageRead(Bitmap bitmap);
void onReadFailed();
}
public static void readFromDiskAsync(@NonNull File imageFile, @NonNull final OnImageReadListener listener) {
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
return BitmapFactory.decodeFile(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null)
listener.onImageRead(bitmap);
else
listener.onReadFailed();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, imageFile.getAbsolutePath());
}
public static final class ImageError extends Throwable {
private int errorCode;
public static final int ERROR_GENERAL_EXCEPTION = -1;
public static final int ERROR_INVALID_FILE = 0;
public static final int ERROR_DECODE_FAILED = 1;
public static final int ERROR_FILE_EXISTS = 2;
public static final int ERROR_PERMISSION_DENIED = 3;
public static final int ERROR_IS_DIRECTORY = 4;
public ImageError(@NonNull String message) {
super(message);
}
public ImageError(@NonNull Throwable error) {
super(error.getMessage(), error.getCause());
this.setStackTrace(error.getStackTrace());
}
public ImageError setErrorCode(int code) {
this.errorCode = code;
return this;
}
public int getErrorCode() {
return errorCode;
}
}
}
Answer 2:
我刚刚从上解决这一问题来了,我想和大家分享的完整代码,可以下载,保存到SD卡中(隐藏文件名),以及获取图像,最后它会检查如果图像已经存在。 该URL来自数据库,以便在文件名可以是唯一使用容易ID。
先下载图片
private class GetImages extends AsyncTask<Object, Object, Object> {
private String requestUrl, imagename_;
private ImageView view;
private Bitmap bitmap ;
private FileOutputStream fos;
private GetImages(String requestUrl, ImageView view, String _imagename_) {
this.requestUrl = requestUrl;
this.view = view;
this.imagename_ = _imagename_ ;
}
@Override
protected Object doInBackground(Object... objects) {
try {
URL url = new URL(requestUrl);
URLConnection conn = url.openConnection();
bitmap = BitmapFactory.decodeStream(conn.getInputStream());
} catch (Exception ex) {
}
return null;
}
@Override
protected void onPostExecute(Object o) {
if(!ImageStorage.checkifImageExists(imagename_))
{
view.setImageBitmap(bitmap);
ImageStorage.saveToSdCard(bitmap, imagename_);
}
}
}
然后创建一个类保存和检索文件
public class ImageStorage {
public static String saveToSdCard(Bitmap bitmap, String filename) {
String stored = null;
File sdcard = Environment.getExternalStorageDirectory() ;
File folder = new File(sdcard.getAbsoluteFile(), ".your_specific_directory");//the dot makes this directory hidden to the user
folder.mkdir();
File file = new File(folder.getAbsoluteFile(), filename + ".jpg") ;
if (file.exists())
return stored ;
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
stored = "success";
} catch (Exception e) {
e.printStackTrace();
}
return stored;
}
public static File getImage(String imagename) {
File mediaImage = null;
try {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root);
if (!myDir.exists())
return null;
mediaImage = new File(myDir.getPath() + "/.your_specific_directory/"+imagename);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mediaImage;
}
public static boolean checkifImageExists(String imagename)
{
Bitmap b = null ;
File file = ImageStorage.getImage("/"+imagename+".jpg");
String path = file.getAbsolutePath();
if (path != null)
b = BitmapFactory.decodeFile(path);
if(b == null || b.equals(""))
{
return false ;
}
return true ;
}
}
然后访问图像首先检查它是否已经存在,如果没有则下载
if(ImageStorage.checkifImageExists(imagename))
{
File file = ImageStorage.getImage("/"+imagename+".jpg");
String path = file.getAbsolutePath();
if (path != null){
b = BitmapFactory.decodeFile(path);
imageView.setImageBitmap(b);
}
} else {
new GetImages(imgurl, imageView, imagename).execute() ;
}
Answer 3:
为什么你真的需要自己的代码来下载呢? 如何只通过你的URI来下载管理器?
public void downloadFile(String uRl) {
File direct = new File(Environment.getExternalStorageDirectory()
+ "/AnhsirkDasarp");
if (!direct.exists()) {
direct.mkdirs();
}
DownloadManager mgr = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
Uri downloadUri = Uri.parse(uRl);
DownloadManager.Request request = new DownloadManager.Request(
downloadUri);
request.setAllowedNetworkTypes(
DownloadManager.Request.NETWORK_WIFI
| DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false).setTitle("Demo")
.setDescription("Something useful. No, really.")
.setDestinationInExternalPublicDir("/AnhsirkDasarp", "fileName.jpg");
mgr.enqueue(request);
}
Answer 4:
它可以帮助你..
Button download_image = (Button)bigimagedialog.findViewById(R.id.btn_downloadimage);
download_image.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
boolean success = (new File("/sdcard/dirname")).mkdir();
if (!success)
{
Log.w("directory not created", "directory not created");
}
try
{
URL url = new URL("YOUR_URL");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
String data1 = String.valueOf(String.format("/sdcard/dirname/%d.jpg",System.currentTimeMillis()));
FileOutputStream stream = new FileOutputStream(data1);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG, 85, outstream);
byte[] byteArray = outstream.toByteArray();
stream.write(byteArray);
stream.close();
Toast.makeText(getApplicationContext(), "Downloading Completed", Toast.LENGTH_SHORT).show();
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
Answer 5:
我这是工作非常简单的解决方案。 该代码是不是我的,我觉得这个对链接 。 下面是需要遵循的步骤:
1.在下载图像,让我们写保存位图到在机器人内部存储的图像文件的方法。 它需要一个背景下,更好地getApplicationContext使用通在应用程序上下文()。 这种方法可以倒入你的Activity类或其他UTIL类。
public void saveImage(Context context, Bitmap b, String imageName)
{
FileOutputStream foStream;
try
{
foStream = context.openFileOutput(imageName, Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, foStream);
foStream.close();
}
catch (Exception e)
{
Log.d("saveImage", "Exception 2, Something went wrong!");
e.printStackTrace();
}
}
2.现在我们有一个方法来保存位图到Andorid的图像文件,让我们写的AsyncTask通过URL下载图像。 这个私有类需要被放置在你的Activity类的子类。 图像被下载后,在onPostExecute方法,它调用上述定义的保存图像的saveImage方法。 注意,图像名称被硬编码为“my_image.png”。
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
private String TAG = "DownloadImage";
private Bitmap downloadImageBitmap(String sUrl) {
Bitmap bitmap = null;
try {
InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL
bitmap = BitmapFactory.decodeStream(inputStream); // Decode Bitmap
inputStream.close();
} catch (Exception e) {
Log.d(TAG, "Exception 1, Something went wrong!");
e.printStackTrace();
}
return bitmap;
}
@Override
protected Bitmap doInBackground(String... params) {
return downloadImageBitmap(params[0]);
}
protected void onPostExecute(Bitmap result) {
saveImage(getApplicationContext(), result, "my_image.png");
}
}
3.下载图像的的AsyncTask的定义,但我们需要以运行的AsyncTask来执行它。 要做到这一点,写在你的onCreate方法这条线在你的Activity类,或在按钮或其他地方的一个onClick方法你认为合适的。
new DownloadImage().execute("http://developer.android.com/images/activity_lifecycle.png");
图像应保存在/data/data/your.app.packagename/files/my_image.jpeg,检查这个职位该目录从您的设备访问。
IMO这解决了问题! 如果您想进一步的措施,例如负载可以按照以下额外的步骤图像:
图像被下载4之后,我们需要一种方式来加载从内部存储图像的位图,所以我们可以使用它。 让我们写加载图像的位图的方法。 这个方法有两个paramethers,上下文和图像文件名,不完整的路径,在context.openFileInput(imageName)将查找在保存目录中的文件时,该文件名保存在上述saveImage方法。
public Bitmap loadImageBitmap(Context context, String imageName) {
Bitmap bitmap = null;
FileInputStream fiStream;
try {
fiStream = context.openFileInput(imageName);
bitmap = BitmapFactory.decodeStream(fiStream);
fiStream.close();
} catch (Exception e) {
Log.d("saveImage", "Exception 3, Something went wrong!");
e.printStackTrace();
}
return bitmap;
}
5.现在我们有我们需要设置一个ImageView的,或者您想使用的图像的任何其他意见的形象一切。 当我们保存图像,我们硬编码的映像名称“my_image.jpeg”,现在我们可以这样形象的名字传递给上述loadImageBitmap方法来获取位图,并将其设置为一个ImageView的。
someImageView.setImageBitmap(loadImageBitmap(getApplicationContext(), "my_image.jpeg"));
6.要获取图像的名称图像完整路径。
File file = getApplicationContext().getFileStreamPath("my_image.jpeg");
String imageFullPath = file.getAbsolutePath();
7.检查图像文件是否存在。
文件file =
getApplicationContext().getFileStreamPath("my_image.jpeg");
if (file.exists()) Log.d("file", "my_image.jpeg exists!");
要删除的图像文件。
文件文件= getApplicationContext()getFileStreamPath( “my_image.jpeg”); 如果(file.delete())Log.d( “文件”, “删除my_image.jpeg!”);
Answer 6:
这个代码在我的项目完美运行
downloadImagesToSdCard(imagepath,imagepath);
private void downloadImagesToSdCard(String downloadUrl,String imageName)
{
try
{
URL url = new URL("www.xxx.com"+downloadUrl);
/* making a directory in sdcard */
// String sdCard=Environment.getExternalStorageDirectory().toString();
ContextWrapper cw = new ContextWrapper(getActivity());
// path to /data/data/yourapp/app_data/imageDir
File directory = cw.getDir("files", Context.MODE_PRIVATE);
File myDir = new File(directory,"folder");
/* if specified not exist create new */
if(!myDir.exists())
{
myDir.mkdir();
Log.v("", "inside mkdir");
}
/* checks the file and if it already exist delete */
String fname = imageName;
File file = new File (myDir, fname);
Log.d("file===========path", ""+file);
if (file.exists ())
file.delete ();
/* Open a connection */
URLConnection ucon = url.openConnection();
InputStream inputStream = null;
HttpURLConnection httpConn = (HttpURLConnection)ucon;
httpConn.setRequestMethod("GET");
httpConn.connect();
inputStream = httpConn.getInputStream();
/*if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
{
inputStream = httpConn.getInputStream();
}*/
FileOutputStream fos = new FileOutputStream(file);
int totalSize = httpConn.getContentLength();
int downloadedSize = 0;
byte[] buffer = new byte[1024];
int bufferLength = 0;
while ( (bufferLength = inputStream.read(buffer)) >0 )
{
fos.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
}
fos.close();
Log.d("test", "Image Saved in sdcard..");
viewimage();
}
catch(IOException io)
{
io.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void viewimage()
{
String path = serialnumber+".png";
ContextWrapper cw = new ContextWrapper(getActivity());
//path to /data/data/yourapp/app_data/dirName
File directory = cw.getDir("files", Context.MODE_PRIVATE);
File mypath=new File(directory,"folder/"+path);
Bitmap b;
try {
b = BitmapFactory.decodeStream(new FileInputStream(mypath));
// b.compress(format, quality, stream)
profile_image.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Answer 7:
试试这个
try
{
Bitmap bmp = null;
URL url = new URL("Your_URL");
URLConnection conn = url.openConnection();
bmp = BitmapFactory.decodeStream(conn.getInputStream());
File f = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis() + ".jpg");
if(f.exists())
f.delete();
f.createNewFile();
Bitmap bitmap = bmp;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
FileOutputStream fos = new FileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();
Log.e(TAG, "imagepath: "+f );
}
catch (Exception e)
{
e.printStackTrace();
}
Answer 8:
public class testCrop extends AppCompatActivity {
ImageView iv;
String imagePath = "https://style.pk/wp-content/uploads/2015/07/omer-Shahzad-performed-umrah-600x548.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testcrpop);
iv = (ImageView) findViewById(R.id.testCrop);
imageDownload image = new imageDownload(testCrop.this, iv);
image.execute(imagePath);
}
class imageDownload extends AsyncTask<String, Integer, Bitmap> {
Context context;
ImageView imageView;
Bitmap bitmap;
InputStream in = null;
int responseCode = -1;
//constructor.
public imageDownload(Context context, ImageView imageView) {
this.context = context;
this.imageView = imageView;
}
@Override
protected void onPreExecute() {
}
@Override
protected Bitmap doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setDoOutput(true);
httpURLConnection.connect();
responseCode = httpURLConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
in = httpURLConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(in);
in.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap data) {
imageView.setImageBitmap(data);
saveImage(data);
}
private void saveImage(Bitmap data) {
File createFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"test");
createFolder.mkdir();
File saveImage = new File(createFolder,"downloadimage.jpg");
try {
OutputStream outputStream = new FileOutputStream(saveImage);
data.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
OUTPUT
确保写入内存中的数据您添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Answer 9:
由于谷歌告诉,现在,不要忘记也增加可读性在该清单外部存储:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
来源: http://developer.android.com/training/basics/data-storage/files.html#GetWritePermission