4

我正在使用 Asynctask 从互联网下载图像。

我想将此图像保存到内部存储中,稍后我想使用此图像。

我可以成功下载,但我找不到它存储的内部存储路径。

这个下载Images.java

private class DownloadImages extends AsyncTask<String,Void,Bitmap> {

        private Bitmap DownloadImageBitmap(){
            HttpURLConnection connection    = null;
            InputStream is                  = null;

            try {
                URL get_url     = new URL("http://www.medyasef.com/wp-content/themes/medyasef/images/altlogo.png");
                connection      = (HttpURLConnection) get_url.openConnection();
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.connect();
                is              = new BufferedInputStream(connection.getInputStream());
                final Bitmap bitmap = BitmapFactory.decodeStream(is);
               // ??????????

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            finally {
                connection.disconnect();
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            return null;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            return DownloadImageBitmap();
        }

    }

任何帮助将不胜感激。:)

谢谢你。

4

6 回答 6

15

您可以像这样在内部存储中保存和加载图像: 保存:

public static void saveFile(Context context, Bitmap b, String picName){ 
    FileOutputStream fos; 
    try { 
        fos = context.openFileOutput(picName, Context.MODE_PRIVATE); 
        b.compress(Bitmap.CompressFormat.PNG, 100, fos);  
    }  
    catch (FileNotFoundException e) { 
        Log.d(TAG, "file not found"); 
        e.printStackTrace(); 
    }  
    catch (IOException e) { 
        Log.d(TAG, "io exception"); 
        e.printStackTrace(); 
    } finally {
        fos.close();
    }
}

加载:

public static Bitmap loadBitmap(Context context, String picName){ 
    Bitmap b = null; 
    FileInputStream fis; 
    try { 
        fis = context.openFileInput(picName); 
        b = BitmapFactory.decodeStream(fis);   
    }  
    catch (FileNotFoundException e) { 
        Log.d(TAG, "file not found"); 
        e.printStackTrace(); 
    }  
    catch (IOException e) { 
        Log.d(TAG, "io exception"); 
        e.printStackTrace(); 
    } finally {
        fis.close();
    }
    return b; 
} 

但是,如果您想在应用程序关闭时再次找到它,则需要以某种方式保存 imageName。我会推荐一个 SQLLite 数据库,它将 imageNames 映射到数据库中的条目。

于 2013-11-14T13:07:29.903 回答
1

尝试这个:

String path = Environment.getExternalStorageDirectory().toString();
OutputStream fOut = null;
String imageName = "yourImageName";
File file = new File(path, imageName);
try {
    fOut = new FileOutputStream(file);
    if (!yourBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fOut)) {
        Log.e("Log", "error while saving bitmap " + path + imageName);
    }
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
于 2013-11-14T12:57:10.513 回答
1

我在 Kotlin 上的解决方案。(基于另一个答案)

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException

class InternalStorageProvider(var context: Context) {

fun saveBitmap(bitmap: Bitmap, imageName: String) {
    var fileOutputStream: FileOutputStream? = null
    try {
        fileOutputStream = context.openFileOutput(imageName, Context.MODE_PRIVATE)
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
    } catch (e: IOException) {
        e.printStackTrace()
    } finally {
        fileOutputStream?.close()
    }
}

fun loadBitmap(picName: String): Bitmap? {
    var bitmap: Bitmap? = null
    var fileInputStream: FileInputStream? = null
    try {
        fileInputStream = context.openFileInput(picName)
        bitmap = BitmapFactory.decodeStream(fileInputStream)
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
    } catch (e: IOException) {
        e.printStackTrace()
    } finally {
        fileInputStream?.close()
    }

    return bitmap
}
}
于 2017-07-20T11:54:37.890 回答
1

您是否考虑过使用 Glide 库(或 Picasso)来下载图像?这样,您就可以抽象出 Http 连接、磁盘保存、内存和磁盘缓存、离线功能等所有低级细节。此外,如果您选择 Glide,您会在图像加载时自动获得一些整齐的淡入淡出动画。

示例(科特林)

下载到磁盘:

Glide.with(applicationContext)
   .load(user.picUrl)
   .downloadOnly(object : SimpleTarget<File>() {
      override fun onResourceReady(res: File, glideAnimation: GlideAnimation<in File>) {}
   })

从缓存加载,或者如果缓存不可用则下载:

Glide.with(callingActivity.applicationContext)
   .load(wallPostViewHolder.mUser!!.picUrl)
   .skipMemoryCache(true)
   .diskCacheStrategy(DiskCacheStrategy.SOURCE)
   .into(wallPostViewHolder.vPic)
于 2017-07-20T14:21:59.977 回答
0

当您对此进行编程并运行该应用程序时,有时需要从您的模拟器/手机中卸载该应用程序(如果您已将文件定义为文件夹,并且您更正了该文件,但在模拟器/手机的内存中仍为文件夹)

于 2018-01-12T15:54:07.207 回答
0

如果您使用的是 kotlin,请使用以下函数。你必须提供一个存储图像的路径,一个位图(转换你的图像,然后将该位图传递给这个函数),如果你想降低图像的质量,那么提供 %age 即 10%。

fun cacheToLocal(localPath: String, bitmap: Bitmap, quality: Int = 100) {
        val file = File(localPath)
        file.createNewFile()
        val ostream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, ostream)
        ostream.flush()
        ostream.close()
    }
于 2019-07-30T05:50:57.043 回答