【问题标题】:Android prevent saving photo on DCIM / public folderAndroid 阻止将照片保存在 DCIM/公共文件夹中
【发布时间】:2014-04-18 17:36:21
【问题描述】:

我正在开发一个 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();
} 

也可以从此目录中删除图片。这就像一个魅力。在模拟器和植根手机上测试。但照片也保存到公共文件夹 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 卡)在公共文件夹中。当我必须删除公用文件夹中的照片时,我该如何获得正确的路径(用于/在不同设备上)?

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

提前致谢!

编辑

下面的方法应该可以从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/public 文件夹中的照片获得了通用名称。见下图:

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

【问题讨论】:

  • getExternalStorageDirectory(),在您的链接中提到,并没有给我上面描述的正确路径。
  • 明白了。您是否尝试过通过仿真查看它是否有效。我知道这听起来很奇怪,但是如果我打开我的文件管理器,它会模拟所有内容,但如果我从文件管理器中删除它,它就会从我的记忆中删除。可能是类似的情况,不太确定。抱歉,并没有真正阅读我发布的整个链接,只是看到它与您的思路一致并有解决方案。
  • 您应该知道,在最近的 android 版本中,应用程序和 ddms 文件探索会看到 不同 路径到 same 位置。
  • 与 DDMS 或文件资源管理器无关...

标签: android image path storage


【解决方案1】:

很抱歉回答了我自己的问题,希望这对其他开发者有所帮助: 我的策略:按照问题中的描述拍摄照片,将其保存到内存中(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 会为您做到这一点。

【讨论】:

    【解决方案2】:

    您想用相机拍照并将其存储在内存中,我是否理解正确?然后我有两个建议:

    1. 您是否尝试过中描述的方法 http://developer.android.com/training/camera/photobasics.html 用 Uri 填充 MediaStore.EXTRA_OUTPUT 到内部存储?

    2. 如果这不能帮助将图像直接保存在内部存储中,为什么不从 getExternalStorageDirectory() 返回的模拟路径中删除它呢?据我所知,通过此路径访问文件非常有效,即使它可能只是一个链接。

    【讨论】:

    • 谢谢@JörgEisfeld。我已经更新了我的问题以使事情更清楚。拍摄照片与 Android 的 API 方法非常相似...希望外面有帮助...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2020-05-20
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多