Android:如何管理项目中的图像(现有与未存在)

时间:2012-12-17 10:57:53

标签: android android-canvas android-sdcard android-image

标题似乎很暧昧,但我的目标很容易理解。

  • 我的项目中有一定数量的图片位于res / drawable-hdpi下。

  • 在我的应用中,我正在从服务器中找到一个名单列表,我将它们保存在本地数据库中。

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

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

直到这里一切都很好。

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

为了避免用户在galery中看到“黑色图像”(因为图像不存在),我想用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();
                }

            }

1 个答案:

答案 0 :(得分:2)

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

Here is a good example of how to download the image.

The developer website has methods on how to store data to the device.您要么在内部存储,要么(更优选地)将其存储在SD卡外部。建议您首先检查SD卡是否已安装在设备上并可用。如果SD不可用,请在内部存储图像。

然后,您必须在下载后跟踪图像的URI。可以使用应用跟踪临时图像,然后在onDestroy()时删除。永久图片URI应通过SharedPreferencesSQLite databaseContentProvider存储。首选ContentProvider,因为它为您希望存储图像的方式添加了一个抽象层。它通常由SQLite数据库支持,但其他应用程序不需要知道。它还允许其他应用程序轻松访问图像(例如,图库)。如果您愿意,可以阻止访问。如果您只有几张图片,SharedPreferences会更容易实现。但它是最不值得推荐的。