4

我有一个列表活动应用程序形成多行。每行打开一个包含视图的活动,其中一个是一个按钮,单击时打开无限图库类(存储在应用程序内的 RES => 可绘制文件夹中的图像),每个图像下方都有按钮,按下时将图像保存到 SD名为 (saved_images) 的文件夹中的 card 目录。

SharedPreferences在画廊类中使用按顺序存储所有图像,效果很好 -

但我正在尝试:

  1. 防止重复保存在 SD 卡文件夹 (saved_images) 中的图像:

    假设您成功保存了 image-1,然后您按下 image-1 下的相同按钮,它将再次保存在 SD 卡文件夹中,所以最后您将两次拥有相同的图像(image-1),

    所以我想要得到:当我按下图像下的按钮时,已经保存的 Toast 图像必须上升,因此所有应用程序图像将在 SD 卡文件夹中保存一次。

  2. 重新安装后继续按顺序保存图像:

    在设备中安装应用程序并将一些图像保存在已在 SD 卡中创建的文件夹 (saved_images) 后,假设您从设备卸载应用程序并将 (saved_images) 文件夹保留在 SD 卡中,然后再次重新安装应用程序并希望保存一些新图像,会发生什么是新图像替换以前保存的图像,

    但我希望它:继续按顺序保存以前保存的图像和新图像。

用于将图像保存到 SDcard 的代码:

public void onClick(View arg0) {
    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/saved_images");
    if (!myDir.exists()) {
        myDir.mkdirs();
        SharedPreferences saveNumber = mContext.getApplicationContext()
                .getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor editorset = saveNumber.edit();
        editorset.putInt("lastsavednumber", 0);
        editorset.commit();
    }
    bm = BitmapFactory.decodeResource(mContext.getResources(),
            images[itemPos]);
    holder.image.setImageBitmap(bm);

    SharedPreferences savedNumber = mContext.getSharedPreferences(
            PREFS_NAME, 0);
    int lastSavedNumber = savedNumber.getInt("lastsavednumber", 0);
    lastSavedNumber++;
    String fname = "Image-" + lastSavedNumber + ".png";
    File file = new File(myDir, fname);
    if (file.exists()) {
        file.delete();
    }
    try {
        FileOutputStream out = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    SharedPreferences saveNumber = mContext.getApplicationContext()
            .getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editorset = saveNumber.edit();
    editorset.putInt("lastsavednumber", lastSavedNumber);
    editorset.commit();
    Toast.makeText(mContext, "Saved", Toast.LENGTH_SHORT).show();
    vi.setTag(holder);
}
4

2 回答 2

1

您可以在保存图像时检查图像是否已经存在。如果您要保存具有不同名称的图像,则将图像矩阵与保存的图像矩阵进行比较,如果它与任何图像矩阵匹配,则显示 Toast 消息。

其次,如果文件夹已经存在,那么您没有删除它。n 当您重新安装应用程序时,文件夹的内容将保留在那里。

试试这个代码来检查图像是否相同我得到这个代码一个 SO 答案

bool imagesAreEqual(Image i1, Image i2)
{

    if (i1.getHeight() != i2.getHeight) return false;
    if (i1.getWidth() != i2.getWidth) return false;

    for (int y = 0; y < i1.getHeight(); ++y)
       for (int x = 0; x < i1.getWidth(); ++x)
            if (i1.getPixel(x, y) != i2.getPixel(x, y)) return false;

    return true;
}

对于代码中的文件夹问题,如果文件夹存在,您没有删除文件夹。

于 2013-05-04T10:27:15.413 回答
1

要从文件夹中获取最后一个文件名,您可以:

String directory = "/parent/of/saved_images/";
File savedImagesDir = new File(directory, "saved_images");
if (savedImagesDir.mkdirs() && savedImagesDir.isDirectory()) {
    // you just created the dir
} else {
    File[] files = savedImagesDir.listFiles();
    if (files == null) {
        // oops savedImagesDir is not a directory
    } else {
        int max = -1;
        Pattern p = Pattern.compile("-[\\d]+");
        for (File file : files) {
            Log.w("file", file.getName());
            Matcher matcher = p.matcher(file.getName());
            if (matcher.find()) {
                final String group = matcher.group();
                final String[] split = group.split("-");
                Log.w("group", file.getName());
                Log.w("split", split[1]);
                int curent = Integer.parseInt(split[1]);
                Log.w("curent", curent + "");
                if (curent > max) max = curent;
            }
        }
        Log.w("max", max + "");
        SharedPreferences saveNumber = mContext.getApplicationContext()
                    .getSharedPreferences(PREFS_NAME, 0);
        SharedPreferences.Editor editorset = saveNumber.edit();
        editorset.putInt("lastsavednumber", 0);
        editorset.commit();
    }
}

卸载后首次运行活动时,您需要执行此操作。当然,如果用户把东西放在那里或者你改变你的命名方案等,我使用的正则表达式可能会失败。你必须小心地这样做

至于“不再保存”,您应该(在共享首选项中)在 saved_images 中存储照片的校验和(哈希)。每当您尝试将文件放入其中时,计算其哈希值,如果哈希值已存储,则显示您的吐司(“图像已保存”),否则将其放入。

为了让您开始使用 Java 中的哈希,请查看此处此处

于 2013-05-06T17:38:44.960 回答