天道酬勤,学无止境

Android - downloading image from web, saving to internal memory in location private to app, displaying for list item

What I'm trying to do is this: I want my application to download an image from the Internet and save it to the phone's internal memory in a location that is private to the application. If there is no image available for the list item (i.e. it can't be found on the Internet), I want a default placeholder image to display. This is the image that I have defined in my list_item_row.xml file as the default.

In my ListActivity file, I am calling an instance of a CustomCursorAdapter class I have written. It is in CustomCursorAdapter where I am iterating through all the list items and defining what content needs to be mapped to the views, including the image file by trying to read it from internal memory.

I've seen several questions on this subject, but the examples either are specific to external phone memory (e.g. SDCard), involve saving strings instead of images, or involve using Bitmap.CompressFormat to reduce the resolution of the file (which is unnecessary in my case, as these images will be small thumbnails of already-small resolution). Trying to piece together code from each example has been difficult, hence my asking about my specific example.

At the moment, I believe I've written valid code, but no image is displaying for my list items, including the default placeholder image. I don't know if the problem is being caused by invalid download/save code, or invalid read code - it doesn't help that I don't know how to check internal memory to see if the image exists.

Anyways, here's my code. Any help would be greatly appreciated.

ProductUtils.java

public static String productLookup(String productID, Context c) throws IOException {
    URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg");
    URLConnection connection = url.openConnection();
    InputStream input = connection.getInputStream();
    FileOutputStream output = 
        c.openFileOutput(productID + "-thumbnail.jpg", Context.MODE_PRIVATE);
    byte[] data = new byte[1024];

    output.write(data);
    output.flush();
    output.close();
    input.close();
}

CustomCursorAdapter.java

public class CustomCursorAdapter extends CursorAdapter {
    public CustomCursorAdapter(Context context, Cursor c) {
        super(context, c);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail);

        String fileName = 
                cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_IMAGE_FILE_PATH));

        Bitmap bMap = BitmapFactory.decodeFile(fileName);
        thumbnail.setImageBitmap(bMap);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.list_item_row, parent, false);
        bindView(v, context, cursor);
        return v;
    }
}

评论

it seems that some code is left out, I re-wrote it like this:

ProductUtils.java

public static String productLookup(String productID, Context c) throws IOException {

    URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg");

    InputStream input = null;
    FileOutputStream output = null;

    try {
        String outputName = productID + "-thumbnail.jpg";

        input = url.openConnection().getInputStream();
        output = c.openFileOutput(outputName, Context.MODE_PRIVATE);

        int read;
        byte[] data = new byte[1024];
        while ((read = input.read(data)) != -1)
            output.write(data, 0, read);

        return outputName;

    } finally {
        if (output != null)
            output.close();
        if (input != null)
            input.close();
    }
}

Looks like simply referring to the image file name when trying to read it was not enough, and I had to call getFilesDir() to get the path of the file storage. Below is the code I used:

String path = context.getFilesDir().toString();
String fileName = cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_PRODUCT_ID));

if (fileName != null && !fileName.equals("")) {
    Bitmap bMap = BitmapFactory.decodeFile(path + "/" + fileName);
    if (bMap != null) {
        thumbnail.setImageBitmap(bMap);
    }
}

void  writeToFile(Bitmap _bitmapScaled)
    {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        _bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);
        try{
        File f;
        //you can create a new file name "test.jpg" in sdcard folder.
        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
            f =new File(android.os.Environment.getExternalStorageDirectory(),"FamilyLocator/userimages/"+imageName);
        else
         f = new File(Environment.getDataDirectory(),"FamilyLocator/userimages/"+imageName);

        f.createNewFile();
        //write the bytes in file
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());
        // remember close de FileOutput
        fo.close();
        }catch(Exception e){e.printStackTrace();}
    }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何访问/ storage / emulated / 0 /(How to access /storage/emulated/0/)
    问题 我已经写了一个代码来录制音频并将其保存到以下文件位置。 private String getFilename() { String filepath = Environment.getExternalStorageDirectory().getPath(); File file = new File(filepath, AUDIO_RECORDER_FOLDER); if (!file.exists()) { file.mkdirs(); } return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + file_exts[currentFormat]); } 在Logcat中,它为我提供了以下文件位置: /storage/emulated/0/AudioRecorder/1436854479696.mp4 我无法在SD卡上找到此文件位置。 如何访问位置? 回答1 正如Hiren所说,您将需要一个文件资源管理器来查看您的目录。 如果您是root用户,我强烈建议您使用root Explorer,否则ES File Explorer是一个不错的选择。 回答2 无需第三方应用 我的Android 6.0允许我浏览内部存储器,而无需第三方应用程序。 我只是这样做*: “设置” “存储和USB” “实习生”
  • Android权限警告(Signature|privileged permissions not in privapp-permissions whitelist)
    1.现象 模块使用了 co.sitic.pp (/system/priv-app/ SysdllAA3 ) 之后,单编模块push到手机里面重启,发现手机卡在开机logo界面,开不了机 2.抓取logcat看log打印会发现如下图片中的打印,主要的关键词为Privileged permissions not in privapp-permissions whitelist 03-04 01:22:12.906 4708 4708 E System : ****************************************** 03-04 01:22:12.906 4708 4719 W JHwRemoteBinder: BinderProxy is being destroyed but the application did not call unlinkToDeath to unlink all of its death recipients beforehand. Releasing leaked death recipient: com.android.server.usb.UsbDeviceManager$UsbHandlerHal$UsbGadgetDeathRecipient 03-04 01:22:12.907 4708 4708 E System : *
  • v4l2框架(CSI用,配合csi_module.c代码)
    1、概述 Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。就像公司的老板一般都不会直接找底层的员工谈话,而是找部门经理了解情况,一个是因为底层屌丝人数多,意见各有不同,措辞也不准,部门经理会把情况汇总后再向上汇报;二个是老板时间宝贵。 V4L2支持三类设备:视频输入输出设备、VBI设备和radio设备(其实还支持更多类型的设备,暂不讨论),分别会在/dev目录下产生videoX、radioX和vbiX设备节点。我们常见的视频输入设备主要是摄像头,也是本文主要分析对象。下图V4L2在Linux系统中的结构图: Linux系统中视频输入设备主要包括以下四个部分: 字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间; V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数; 平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。 具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2
  • Android-存储从网络下载的图像(Android - Storing images downloaded from the web)
    问题 我有一个问题与是否(以及如何)存储从网络加载的图像有关。 假设我正在从我的Android应用程序调用网络服务。 在此Web服务中,我获得了Web上图像的URL。 我下载此图像并将其显示在ListView中列表项的左侧。 我的问题是,应该使用哪种方法存储图像? 我是不是该: 将其保存到SDCard,检查创建ListView时是否存在(在后续请求中),并根据需要重新下载(有时会更新映像,以防更改)。 使用Context.getCacheDir()将其存储在缓存中,但是由于我不能依赖于保留在缓存中的映像,因此可能被迫更频繁地重新下载它。 始终下载它,永远不要存储图像。 图像文件本身很小,但是我希望一些用户可以下载/存储许多这样的小图像。 哪种方法效果最好,和/或首选方法是什么? 作为附带的问题,我应该首先将所有图像加载到ListView中(并可能锁定UI一段时间)还是异步加载它们,但同时显示一个占位符图形(可能会更“丑陋”)? 这里的标准是什么? 回答1 关于存储位置:答案取决于要下载的内容和下载量。 然后,您做出选择。 例如:如果您要下载的是临时的,数量少(较少的远程获取)和大小(较少的内存)并且是Activity本地的内容,则应考虑使用SoftReferences将图像保存在内存中。 SoftReferences可能会导致重新引用,但是由于项目数量很少,因此应该可以负担得起。
  • 内部存储,外部存储,SD卡和可移动存储之间有什么区别?(What are the differences among Internal storage, external storage, sd card and removable storage?)
    问题 从官方文档中: 使用外部存储每个与Android兼容的设备都支持一个共享的“外部存储”,您可以使用该外部存储来保存文件。 这可以是可移动存储介质(例如SD卡)或内部(不可移动)存储... 我对这个问题很困惑。 据我了解,使用外部存储并不一定意味着要使用可移动卡,对吗? 但是,在谈到外部存储时,它始终被称为“ sd卡”。 我正在开发一个可从互联网下载.mp3文件的应用程序。 我想将这些文件保存在手机内存中(不想使用任何可移动设备),但据我了解,这些文件必须保存在外部内存中。不过,我想提供导入文件的可能性。来自可移动设备的文件。 我应该在哪里以及如何保存这些文件? 谢谢 回答1 在构建使用内部存储的应用程序时,Android操作系统会创建一个唯一的文件夹,该文件夹只能从该应用程序访问,因此,其他任何应用程序甚至用户都无法看到该文件夹​​中的内容。 外部存储更像是公共存储,因此,目前,它是sdcard,但可以成为任何其他类型的存储(远程硬盘驱动器或其他任何存储设备)。 内部存储器应仅用于应用程序数据(应用程序使用的首选项文件和设置,声音或图像媒体)。 如果您打算下载许多mp3,建议您将它们保存到外部存储中,因为外部存储通常更大。 此外,将数据存储在内部存储器上可能会阻止用户安装其他应用程序。 回答2 内部存储,外部存储(又称主外部存储)和辅助外部存储之间的区别? 内部存储
  • 一个旧手机的威力
    这里的手机指安卓机。大家都知道安卓机用的是Linux内核,所以理论上Linux可做的事情,手机都能做,下面列举一些有意思的事情。 必备技能: 会Linux。 安装Linux发行版 其实这个比较简单,只需装一个App, 但是有些技巧可以讲讲。 所需材料 安卓手机 必须 拥有公网IP的机器 非必须 无限流量卡 非必须 root权限 必须 Root root手机根据手机信号的不同,会有不同的办法,所以这里就不细讲,请自行百度,或google. 安装linux deploy 通过某个应用市场下载并安装 在线安装 在线安装是比较扯淡的,因为在国内实在是比较慢的,原因你懂的。 离线安装 通过以下地址可下载自己所需的镜像http://sourceforge.net/projects/linuxonandroid/files/ 用户名/密码:android/changeme 推荐安装ssh客户端: JuiceSSH 最好的安卓ssh客户端,没有之一。 个人网站 其实这个这个章节有点泛指的意思,任何你觉得需要在公网上能做的事情,都可以在内网完成,因为在内网里面你可能有旧电脑,旧服务器,旧手机。一切被限制在内网的资源(有内存,cpu。) 所需材料 安卓手机 必须 拥有公网IP的机器 非必须 无限流量卡 非必须 root权限 非必须 系统环境 这里的环境你可以用上面的Linux
  • android—性能优化2—内存优化
    文章目录 性能优化:工具:memory profilerLeakCanaryarthookepic 库 java内存管理机制java 内存回收机制Android内存管理机制Dalvik与 Art区别Low Memory Killer 内存抖动解决内存泄漏解决第一个内存泄漏点内存很大的bitmap第一个地方 生成二维码的时候每隔一定时间会动态创建二维码解决方案: 如何定位问题native 内存一直在增加 分析发现个问题 android studio 插线后使用profile内存自动升高, 感觉是android studio 的bug Bitmap内存模型bitmap 优化内存优化细节优化结果: 性能优化: 工具: memory profiler android studio 自带的. 找不到profile 的话 顶部导航栏 点击下载样式的按钮可以找到当前的内存 这样可以看到当前内存是哪里消耗的最多,还有一些其他的内存信息, 最主要看一个bitmap LeakCanary https://square.github.io/leakcanary/getting_started/ 大致原理 监听Activity生命周期->onDestroy以后延迟5秒判断Activity有没有被回收->如果没有回收,调用GC,再此判断是否回收,如果还没回收,则内存泄露了,反之,没有泄露。 引入
  • save file to internal memory in android?
    I am downloading a file from server with help of a URL provided through web service. I am successful for every version of devices but getting exception in OS 4.1 devices. I am using below code: public static Boolean DownloadFile(String fileURL, File directory) { try { FileOutputStream f = new FileOutputStream(directory); URL u = new URL(fileURL); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ((len1 = in.read(buffer)) > 0) { f
  • 面试题总结(1)
    操作系统之Linux 1、杀掉tomcat进程 ps -ef |grep tomcat kill -9 pid 2、启动http服务 service httpd start 3、查看可用内存,磁盘大小和CPU使用率的命令 free -m df -h top 4、给a.txt文件的属主和其他用户分别增加写和执行权限 chmod u+w,o+x a.txt 5、实时查看a.log日志文件的信息 tail -f a.log 6、查看8888端口是否被占用 netstat -an |grep 8888 7、把a.log文件中的包含 Error 字符串的内容提取出来,追加到b.log文件中 cat a.log |grep Error>>b.log 8、在linux下,安装程序的命令 rpm -ivh 9、查看文件的命令有哪些? cat,more,less,head,tail,vi 10、从远程服务器(192.168.2.1)上把/root/log拷贝到本地的/opt目录下 scp -r root@192.168.2.1:/root/log /opt 11、在vi编辑器中,复制第800行的方法 先输入 :800 定位到第800行,然后输入yy进行复制 12、把当前文件夹中的T01/a.log复制到当前文件夹中的T02 cp T01/a.log T02/ 13、在当前文件夹中查找a.log
  • 如何在活动之间传递绘画(How to pass drawable between activities)
    问题 如何在活动之间传递图像,可绘制类型? 我尝试这样: private Drawable imagen; Bundle bundle = new Bundle(); bundle.putSerializable("imagen", (Serializable) unaReceta.getImagen()); Intent myIntent = new Intent(v.getContext(), Receta.class); myIntent.putExtras(bundle); startActivityForResult(myIntent, 0); 但是它报告了我的执行情况: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable 回答1 1)在意图传递作为额外 在活动A中,您可以解码图像并通过意图将其发送: 使用此方法(附加),图像在162毫秒的时间间隔内通过 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap
  • JVM监控及诊断工具之GUI篇
    目录 工具概述图形化综合诊断工具 jConsole基本概述启动三种连接方式 Visual VM基本概述插件的安装连接方式基本使用 eclipse MAT基本概述获取堆dump文件dump文件内容两点说明获取dump文件 分析堆dump文件histogramthread overview和获取对象间相互引用的关系深堆与浅堆shallow heapRetained Heap对象的实际大小StudentTrace案例分析 支配树(Dominator Tree) 案例:Tomcat堆溢出分析说明分析过程 补充一:再谈内存泄漏内存泄漏的理解与分类Java中内存泄漏的8中情况静态集合类单例模式内部类持有外部类各种连接,如数据库连接、网络连接和IO连接等变量不合理的作用域改变哈希值缓存泄漏监听器和回调 内存泄漏案例分析案例1案例2 补充二:支持使用OQL语言查询对象信息SELECT子句From子句where子句内置对象与方法 JProfiler基本概述安装与配置具体使用数据采集方式遥感检测Telemetries内存视图Live memory堆遍历heap walkerCPU视图CPU views线程视图threads监视器和锁Monitors & locks 案例分析案例1案例2 Arthas基本概述安装与使用相关诊断指令 Java Mission Control历史启动概述功能
  • 每日一道Android 面试题,面试途中不败题
    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。这里会不断收集和更新Android基础相关的面试题,目前已收集100题。 1.Android系统的架构 应用程序 Android会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。 应用程序框架 开发人员可以完全访问核心应用程序所使用的API框架(android.jar)。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。 系统运行库 Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过Android 应用程序框架为开发者提供服务。 Linux 内核 Android的核心系统服务依赖于 Linux 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。 2.Activity的生命周期 Activity生命周期方法 主要有onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(
  • [Linux 基础] -- V4L2 框架分析
    一、概述 Video4Linux2 是 Linux 内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。就像公司的老板一般都不会直接找底层的员工谈话,而是找部门经理了解情况,一个是因为底层屌丝人数多,意见各有不同,措辞也不准,部门经理会把情况汇总后再向上汇报;二是老板时间宝贵。 V4L2 支持三类设备:视频输入输出设备、VBI设备和 radio 设备(其实还支持更多类型的设备,暂不讨论),分别会在 /dev 目录下产生 videX、radioX 和 vbiX 设备节点。我们常见的视频输入设备主要是摄像头,也是本文主要分析对象。 1.1 Linux 系统中视频输入设备主要包括一下四个部分: 字符设备驱动程序核心:V4L2 本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间; V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数; 平台 V4L2 设备驱动:在 V4L2 框架下,根据平台自身的特性时间与平台相关的 V4L2 驱动部分,包括注册 video_device 和 v4l2_dev。 具体的 sensor 驱动:主要上电、提供工作时钟、视频图像裁剪、流 IO 开启等,实现各种设备控制方法供上层调用并注册
  • Android开发者面试一百题
    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。这里会不断收集和更新Android基础相关的面试题,目前已收集100题。 1.Android系统的架构 应用程序 Android会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。 应用程序框架 开发人员可以完全访问核心应用程序所使用的API框架(android.jar)。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块。 系统运行库 Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过Android 应用程序框架为开发者提供服务。 Linux 内核 Android的核心系统服务依赖于 Linux 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。 2.Activity的生命周期 Activity的生命周期 Activity生命周期方法 主要有onCreate()、onStart()、onResume()、onPause()、onStop()
  • MAT(Eclipse内存分析器)-如何从内存转储中查看位图(MAT (Eclipse Memory Analyzer) - how to view bitmaps from memory dump)
    问题 我正在借助Eclipse Memory Analyzer(也称为MAT)来分析Android应用程序的内存使用情况。 有时,我会利用堆的很大一部分来找到android.graphics.Bitmap类的奇怪实例。 问题是我找不到该位图的源,没有文件名,没有resourceID ,什么都没有。 我可以找到的所有有关位图的信息如下: 我假设有一个带有图像像素阵列的mBuffer字段。 但这是一些内部Android格式,而不是PNG。 问题:如何从内存转储中查看由该位图表示的图像? 回答1 我找到了一种查看此类位图的方法: 首先,您需要下载并安装GIMP 接下来,在MAT中找到您的Bitmap对象,右键单击mBuffer字段,在弹出菜单中选择“复制” -> “将值保存到文件”菜单项并将此数组的值保存到某个文件给该文件扩展名.data 推出GIMP,选择“文件” - >“打开”,选择您的.data文件并单击打开按钮将出现“从原始数据加载图像”对话框。 在这里,您需要为位图设置正确的参数首先,选择“图像类型”作为“ RGB Alpha” (大多数Android资源都具有此图像类型,但是您可能需要尝试其他图像类型) 其次,为位图设置正确的宽度和高度(可以在内存转储中找到正确的尺寸) 此时,您应该已经观察到原始图像的预览。 如果没有,您可以尝试在“从原始数据加载图像
  • 在群晖docker上装elmlang可视调试编码器ellie
    本文关键字:elmlang live editor,docker要注意的地方。 在前面发布《elmlang时》我们谈到elmlang的函数FRP和可视调试特征,使得为其装配一个live ide变得可能,elmlang提供的插件,已经使其它能很轻松地接入市面上几大IDE,如本地我们有atom,vscode这样的东西,在业界是推崇用vim的,他命令区和编辑区合一的ui方案使之成为通用ide,那么在远程呢,越来越流行的还有很多web IDE,elmlang for webapp的特性使得其天然就与web ide相生相融,与我的想法颇为迎合的是,elmlang的官方发布了一个ellie:el-li-e,elmlang live editor的意思,它模拟了atom这样的本地编辑器方案,该项目托管在https://github.com/ellie-app/ellie。 下面介绍如何将其安装到docker下。其实上述github repo已有docker支持了,且同时提供了for development和for production的二套方案,然而我测试时发现这二套直接利用生成的image和是存在很多问题的,container最终也运行不起来,所以我自己测试修正了一套。 我选用的测试环境是群晖下vmm出来的纯净ubuntu-16.04.5,安装好docker-ce和docker
  • 图像源和缓存(Image Source and Caching)
    问题 我使用以下代码显示来自网络服务器的图像: <Image Source="{Binding Url}" /> 该图像会自动下载,我假设还存在一些基于Url的缓存。 我的问题是,当应用程序离线时,可能不会显示缓存的图像。 有什么方法可以更改缓存行为,以便在没有可用网络的情况下也可以加载图像? 指向有关缓存的文档的指针也将非常有帮助。 回答1 默认情况下, BitmapImage自动缓存远程图像。 最好与CreateOptions="BackgroundCreation"结合使用,以获得最佳性能。 <Image Height="100" Width="100" Margin="12,0,9,0"> <Image.Source> <BitmapImage UriSource="{Binding ImgURL}" CreateOptions="BackgroundCreation"/> </Image.Source> </Image> 这个MSDN博客文章虽然很旧,但仍然很相关,列出并解释了所有CreationOptions并且在大多数模式下缓存都是自动的。 我使用这些选项来显示许多带有图片的新闻项目,并且效果很好。 我可以加载文章列表,退出应用程序并打开“飞行模式”,然后启动该应用程序的新实例,图像仍会加载。 手动方式 如果您想控制自己的缓存并缓存HTTPS资源,那么有几个很好的例子
  • 如何从毕加索的缓存中检索图像?(How to retrieve images from cache memory in picasso?)
    问题 我正在使用picasso库加载图像。在默认的picasso中,它使用内部缓存加载图像。但是根据我的应用配置,我必须使用外部缓存(磁盘上的缓存)。 所以我将此代码用于磁盘上的缓存 File httpCacheDir = new File(getApplicationContext().getExternalCacheDir(),"http"); long httpCacheSize = 10 * 1024 * 1024; // 10 MiB HttpResponseCache.install(httpCacheDir, httpCacheSize);} 毕加索很灵活。 因此,现在它将图像缓存在外部SD卡中。 缓存存储在sdcard / android / data / packagename / cache / http中。缓存存储在“ .1”,“。0”中。 格式,所以我只是打开它们,然后将其从“ .1”更改为“ .jpg”。它提供了我需要的确切图像。 但是如何以编程方式进行? 但是毕加索本身将我的内存缓存到我的应用程序中以将图像加载到imageview中。但是我必须将它们直接保存为sdcard作为图像/将位图设置为墙纸在离线模式下? 回答1 在构建Picasso实例时,您可以提供自己的Cache实现。 这样,您可以提供额外的方法,可以调用这些方法直接从内存缓存中检索位图。
  • 如果我将我的android应用设置为系统应用,则在恢复出厂设置后会从手机中删除吗?(If i set my android app to a system app, after a factory reset, will it be removed from the phone?)
    问题 我正在创建公司应用,即使用户执行了出厂重置后,也需要将其保留在手机上。 如果我将Android应用设置为系统应用,则在恢复出厂设置后,会从手机中删除该应用吗? 如果不可能,那我该怎么办? 谢谢... 回答1 我不确定这是否行得通,但是您可以尝试。 此方法需要有根设备。 如果您的电话未扎根,则此方法将不起作用。 好的,首先将您的应用程序放置在System / priv-app文件夹中。该位置是所有系统apk的存储位置。 当恢复出厂设置时,Android系统将从priv-app文件夹加载所有系统apk,然后再次创建其odex文件。 因此,如果您的apk文件位于此文件夹中,则可能会发生更改,即您的文件将与系统apks一起安装,但先前的数据将丢失。 还有一件事情,当您将apk放在该文件夹中时,您必须将apk的权限更改为0644,否则它将无法安装apk。 回答2 恢复出厂数据(FRP)仅清除data和cache分区。 系统应用位于system分区内。 因此,它不会删除APK,但会删除应用程序的本地数据。 例如,应用程序在本地数据库(位于data分区内)中保存了一些有关您的信息。 要从Android-Studio Build APK选择“ Build >“ Build APK (不要选择生成签名的APK) 然后将APK复制到/system/priv-app/ ,相应地设置权限
  • 永久隐藏Android状态栏(Permanently hide Android Status Bar)
    问题 我正在尝试在Android 4.4设备上隐藏系统状态栏。 这是针对信息亭模式的,其中我的应用程序将是设备上有史以来唯一运行的应用程序。 目前的目标设备是2013 Nexus 7。 该设备已植根,并且我已经能够完全移除底部的导航栏以及本文中的一些信息。 对于顶部的状态栏,我尝试过的所有操作只会暂时隐藏该栏。 如果我的用户在屏幕顶部向下移动,状态栏将重新出现。 我不想让他们看到时间,进入设置甚至看到通知。 我找到并尝试过的帖子: 在平板电脑中隐藏系统栏永久隐藏活动上的导航栏在Android上隐藏状态栏在Android中禁用/隐藏状态栏 有什么建议? 理想情况下,我希望能够编辑build.prop来执行此操作,因为我已经在导航栏中进行了此操作,并且可以同时执行。 我试图不必建立自己的android图像。 更新: 经过更多工作后,这似乎在某种程度上取决于android的确切版本或运行其的设备。 某些设备(例如我一直在使用的Nexus系列设备)允许用户滑动以重新显示横条。 但是,我最近在Verizon Eclipse上尝试了此操作,并且该栏没有重新出现,这正是我想要的。 我仍在寻找针对所有设备的更好的解决方案,但这可能归结于创建自己的android版本。 回答1 我们无法阻止状态在kitkat设备中以全屏模式显示,因此提出了一种仍然符合要求的技巧,即阻止状态栏扩展。 为此