0

标题似乎模棱两可,但我的目标很容易理解。

  • 我在 res/drawable-hdpi 下的项目中有一定数量的图像。

  • 在我的应用程序中,我从服务器获取名称列表,并将它们保存在本地数据库中。

  • 每个名称对应于图像的名称,末尾带有“.png”。

  • 我正在使用画廊,用户可以通过单击相应的图像从数据库中选择其中一个名称。

一切都很好,直到这里。

但是现在,假设将在服务器端添加一个新名称,因此图像不会出现在应用程序中。在这种情况下,我必须更新我的应用程序并将正确的图像放入其中。

为了避免用户在图库中看到“黑色图像”(因为该图像不存在),我想用 android 创建这个图像。

如果图像在项目中不存在,我实际上能够捕捉并创建一个新图像(白色背景,中间有名称)。

现在,问题是如何以及在哪里存储这个新图像。显然,不可能将其存储在 res/drawable 文件夹中。那么,在哪里以及如何存储?

这是我创建新图像的代码部分:

if (imageId == 0)
            {
                Bitmap journal_template = BitmapFactory.decodeResource(context.getResources(), R.drawable.journals_template).copy(Bitmap.Config.ARGB_8888, true);
                Canvas myCanvas = new Canvas(journal_template);

                Paint myPaint = new Paint();
                myPaint.setColor(Color.BLACK);
                myPaint.setTextSize(25);

                String journal_name = publicJournalsNameSystem.get(i).toLowerCase(); 

                Paint textPaint = new Paint();
                textPaint.setARGB(200, 254, 0, 0);
                textPaint.setTextAlign(Align.CENTER);

                int xPos = (myCanvas.getWidth() / 2);
                int yPos = (int) ((myCanvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2)) ;

                myCanvas.drawText("Your text", xPos, yPos, myPaint);

                try {
                       FileOutputStream out = new FileOutputStream("/journals_"+journal_name+".png");
                       journal_template.compress(Bitmap.CompressFormat.PNG, 90, out);
                } catch (Exception e) {
                       e.printStackTrace();
                }

            }
4

1 回答 1

2

为了使用来自网络服务器的图像,您需要首先将图像下载到设备上,然后将其存储。

这是如何下载图像的一个很好的例子。

开发者网站提供了如何将数据存储到设备的方法。 您将希望将其存储在内部或(更优选)外部存储到 SD 卡。建议您首先检查 SD 卡是否已安装在设备上并且是否可用。如果 SD 不可用,请在内部存储图像。

You must then keep track of the image's URI after downloading. Temporary images can simply be tracked with the app then deleted upon onDestroy(). Permanent image URIs should be stored via either SharedPreferences, SQLite database, or ContentProvider. A ContentProvider is preferred as it adds a layer of abstraction for how you want to store the image. It's usually backed by an SQLite database anyway, but other apps don't need to know that. It also allows other applications to easily access the image if you want (say, the Gallery for example). You can prevent access if you choose. SharedPreferences is easier to implement if you only have a few images. It's least recommended though.

于 2012-12-17T14:22:32.980 回答