Android 阻止将照片保存在 DCIM/公共文件夹中

2024-03-30

我正在开发一个 Android 应用程序。用户单击按钮后可以拍照。这张照片将通过以下方法保存到内部包存储(data/data/package/...):

private String saveToInternalSorage(Bitmap bitmapImage){
    ContextWrapper cw = new ContextWrapper(getApplicationContext());
    File directory = cw.getDir("TEST", Context.MODE_PRIVATE);
    File pod = new File(directory, object.getTitle() + "" +
object.getName() + "" + object.getAge() + ".jpg");

    FileOutputStream fos = null;
    try {           

        fos = new FileOutputStream(pod);
        bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return pod.getAbsolutePath();
} 

也可以从该目录中删除图片。这就像一个魅力。在模拟器和 root 的手机上进行了测试。但照片也保存到公用文件夹DCIM中。我正在使用 HTC ONE mini 进行测试(没有 SD 卡?)。下面的代码显示了拍摄和获取照片的方法。

public void takePhoto() {

    cameraintent = new Intent("android.media.action.IMAGE_CAPTURE");
    startActivityForResult(cameraintent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {

             Bundle extras = data.getExtras();
             Bitmap bmp  = (Bitmap) extras.get("data");

             setPath(saveToInternalSorage(bmp));

我想防止将照片存储在公共文件夹中。我删除 DCIM 文件夹中最新文件的方法失败了,因为getExternalStorageDirectory() 为我提供了 HTC One mini 上的模拟路径(例如 emulated/sdcard/...)。这绝对不是正确的道路。那么我如何确定照片只会存储到内部包结构中,而不是(没有 SD 卡/有 SD 卡)存储在公共文件夹中。当我必须删除公共文件夹中的照片时,如何获得正确的路径(针对/在不同设备上)?

我找不到“从一开始”就阻止存储在公共文件夹中的解决方案。

提前致谢!

EDIT

下面的方法应该能够从 DCIM/公共文件夹中删除照片。

private void deleteLatestFromDCIM() {

    File f = new File(Environment.getExternalStorageDirectory() + "");

    File [] files = f.listFiles();

    Arrays.sort( files, new Comparator<Object>()
            {
        public int compare(Object o1, Object o2) {

            if (((File)o1).lastModified() > ((File)o2).lastModified()) {
                   return -1;
            } else if (((File)o1).lastModified() < ((File)o2).lastModified()) {
                   return 1;
            } else {
                   return 0;
            }
            ...
    if(files[0].exists())
    files[0].delete();

问题是 DCIM/公共文件夹中的照片具有通用名称。见下图:

那么,如何删除我不“知道”名称的图像呢?将照片存储在内存中效果很好!我不会将它们放在公共文件夹中。通过 getExternalStorageDirectory() 方法,我得到了如上所述的模拟路径。这真的是 DCIM/public 文件夹的路径吗?


很抱歉回答我自己的问题,希望这对其他开发人员有帮助: 我的策略:按照问题中的描述捕获照片,将其保存到内存中(data/data/com.package...) 之后,使用以下方法将其从公共文件夹(DCIM/MEDIA/100MEDIA)中删除(从该文件夹中删除最后拍摄的照片...):

  private void deleteLastPhotoTaken() {
    String[] projection = new String[] {
            MediaStore.Images.ImageColumns._ID,
            MediaStore.Images.ImageColumns.DATA,
            MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
            MediaStore.Images.ImageColumns.DATE_TAKEN,
            MediaStore.Images.ImageColumns.MIME_TYPE };

    final Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,
            null,null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");

    if (cursor != null) {
      cursor.moveToFirst();

      int column_index_data =
              cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

      String image_path = cursor.getString(column_index_data);

      File file = new File(image_path);
      if (file.exists()) {
        file.delete();
      }
    }
  }

正如其他解决方案中提到的:不要关闭光标! Android 会为你做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 阻止将照片保存在 DCIM/公共文件夹中 的相关文章

随机推荐

  • ui-bootstrap 模态范围错误

    我注意到 ui bootstrap 模态范围有一些奇怪的地方 似乎在其中使用 ng model 时 您必须引用 parent 才能到达模态控制器的范围 请注意 在我的 plunker 中 其他属性 例如 ng options 不需要 par
  • 如何在电子邮件主题中添加链接(gmail)

    有没有办法在电子邮件主题中添加链接 以下是 YouTube 的示例 在我的代码中 我正在尝试以下但结果仍然不令人满意 下面的代码发送主题 因为它打印了主题中的整个锚标记 public function contact us data fro
  • 如何以编程方式将 Google Sheet 脚本发布/部署为 API 可执行文件? [复制]

    这个问题在这里已经有答案了 我有一个包含脚本的谷歌工作表 我想以编程方式执行以下操作 制作这个 Google 电子表格public以编程方式 我想以编程方式为任何用户 公众 执行与上述电子表格关联的脚本 我可以表演 Publish gt D
  • Google Play 开发者 API - “当前用户没有足够的权限来执行请求的操作。”

    我有一个 Google 开发控制台进程 启用了 Google Play Developer API 并且该项目链接到 Google Play 项目 在 Google Dev 控制台项目中 创建了 OAuth 客户端 ID Web 应用程序
  • 如何指示Lucene中的StandardAnalyzer不删除停用词?

    简单问题 如何制作Lucene的StandardAnalyzer在分析我的句子时不要删除停用词 答案取决于版本 为了Lucene 3 0 3 当前 http lucene apache org java 3 0 3 api core org
  • 如何添加链接到 Flash 横幅

    我主要是一名开发人员 不知道如何使用 Adob e Flash CS4 有没有一种简单的方法可以将链接添加到 Flash 横幅 我有 flv 文件 其中包含库和两层中的一些项目 请给我一步一步的指示 编辑 我找到简单的解决方案 步骤如下 G
  • 放置项和对齐项有什么区别?

    想知道使用有什么区别 display flex align items center or display flex place items center 视觉上看起来是一样的 place items 有 90 的浏览器支持 align i
  • 具有 .htaccess 和 mod_rewrite 的静态 HTML 文件的语义 URL

    mod rewrite 总是让我困惑 谁能告诉我获得以下干净 URL 所需的规则 左边是所需的 URL 右边是真实的 URL our work gt our work html our work some project gt our wo
  • 使用 CORS 和 OpenShift 上的节点应用程序通过 POST 清空请求正文

    我正在 OpenShift 上使用 Express 创建一个简单的 Node 应用程序 我只是修改 OpenShift 的默认示例 Node 应用程序 我想要 CORS 支持 var cors require cors Initialize
  • 在Python中计算元音

    def main print count def countVowels string vowel aeiouAEIOU count 0 string input enter a string for i in string if i in
  • 文本区域和超链接?

    我有两个关于 Visual Studio 中的 C 的快速 简单的问题 首先 除了程序中的文本区域之外 是否有类似标签的东西 我想在我的程序中包含多行文本 但似乎只能使用打开自动换行的 DotNetBar 标签来完成它 其次 有没有办法在不
  • 是否存在任何危险,例如使用 pip 的 --ignore-installed 标志导致冲突?

    我无法找到 pip 的良好文档 ignore installed flag pip install help简单地说 忽略已安装的软件包 而是重新安装 除了系统上存在更多问题的副作用之外 因为安装的软件包在升级时不会被卸载 是否还有其他已知
  • PHP 评估 $a="$a"?

    我正在查看一些工作代码 并发现了这一行 eval element element 我真的很困惑为什么 PHP 开发人员会写这行代码 除了为自身设置一个变量之外 这还有什么目的 幸运的是 该行所在的函数从未被调用 上面的例子将输出 This
  • 在 Woocommerce 结帐页面中添加信息丰富的自定义消息

    我有一个基于 WP Woocommerce 的网站 我想告诉我的客户 每当他们在我的商店购买东西时 他们订单的 3 都会捐赠给慈善协会 我想显示根据总数计算的确切金额 例如 总计 150 欧元 5 欧元将被下放等 我该如何管理它 您可以将其
  • > 无法在 /opt/android-sdk-linux 中找到哈希字符串“android-26”的目标

    乌班图16 04 android sdk 位于 opt android sdk linux android home 配置 导出 ANDROID HOME opt android sdk linux opt android sdk linu
  • C++ 中真正的异步文件 IO

    我有一个超快的 M 2 驱动器 有多快 没关系 因为我无论如何也无法利用这个速度 这就是我问这个问题的原因 我有一个需要大量内存的应用程序 太多了 以至于内存装不下 幸运的是 并不是一下子就需要它 相反 它用于保存计算的中间结果 不幸的是
  • AdMob - Android 活动中的更好性能

    我有一个 Android 应用程序 我在其中实现了 AdMob 广告 我的布局代码非常简单 将 AdView 添加到 LinearLayout 中
  • 访问者模式对于动态类型语言有用吗?

    访问者模式允许在不扩展对象类的情况下编写对对象的操作 当然 但为什么不直接编写一个全局函数或静态类来从外部操作我的对象集合呢 基本上 在像 java 这样的语言中 accept 出于技术原因需要方法 但在一种语言中我可以实现相同的设计而无需
  • 替换字符串中最后一次出现的字符[重复]

    这个问题在这里已经有答案了 我有一个像这样的字符串 Position fix dial 我想用转义双引号 替换最后一个双引号 字符串的结果是 Position fix dial 我怎样才能做到这一点 我知道要替换字符串的第一次出现 但不知道
  • Android 阻止将照片保存在 DCIM/公共文件夹中

    我正在开发一个 Android 应用程序 用户单击按钮后可以拍照 这张照片将通过以下方法保存到内部包存储 data data package private String saveToInternalSorage Bitmap bitmap