【问题标题】:How to get the default directory of photo made by camera in android?如何在android中获取相机拍摄的照片的默认目录?
【发布时间】:2016-06-16 01:55:10
【问题描述】:

我希望在android中获取相机拍摄的照片的默认目录。

我认为代码A可以做到这一点,并且/storage/sdcard0/DCIM显示在日志中,

但其实我用相机拍的照片都存放在文件夹/storage/extSdCard/DCIM

如何在android中获取相机拍摄的照片的默认目录?谢谢!

代码 A

File dir10 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
Log.e("MainActivity", "getExternalStoragePublicDirectory() 10:" + dir10.toString());

更多

相机拍摄的照片的默认存储位置似乎是由用户设置的,有时是存储卡,有时是SD卡。我希望知道用户选择了哪个存储位置来存储相机拍摄的照片。

【问题讨论】:

  • 设备操作系统版本是多少?
  • 操作系统:4.1.2 和 5.1
  • 相机拍照的默认磁盘好像是用户设置的
  • 看来你在找这个。 See this

标签: android camera android-sdcard


【解决方案1】:

使用 getExternalStoragePublicDirectory() 带参数 DIRECTORY_PICTURES

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");

DIRECTORY_DCIM 将设备安装为相机时,是图片和视频的传统位置。

DIRECTORY_PICTURES 是放置用户可用图片的标准目录。

希望对你有帮助!

【讨论】:

  • 相机拍摄的照片的默认存储位置似乎是用户设置的,有时是存储卡,有时是SD卡。我希望知道用户为存储相机拍摄的照片设置的存储位置。
  • 确保在使用相机之前先启用对外部存储的访问。你可以在guides.codepath.com/android/… 找到这个
【解决方案2】:

1.这只有在用户没有更改默认相机输出目录时才有效

根据文档,有两个选项

DIRECTORY_DCIM 将设备安装为相机时图片和视频的传统位置。

File musicDirectory = new File( getExternalFilesDir(Environment.DIRECTORY_DCIM));

DIRECTORY_PICTURES 放置用户可用图片的标准目录。

File musicDirectory = new File( getExternalFilesDir(Environment.DIRECTORY_PICTURES));

getExternalFilesDir() 将返回 File 对象

你可以参考这里developer page

2。如果您至少在相机中拍摄了一张照片,您还可以使用另一个技巧

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 = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"); 
if(cursor != null){
    cursor.moveToFirst();
    //you can access last taken pics here. 
 }

【讨论】:

  • 谢谢!您的代码可以运行,但有没有更好的方法?
  • 我不知道其他方法
  • 谢谢!我再次测试您的代码 2,发现它不正确。如果我将图片从我的电脑复制到手机,图片被你的代码2击中,但实际上图片不是通过相机拍摄的
  • 对不起,我在代码 2 中提到它仅适用于您从移动相机拍摄的图像,如果您使用该方法会涉及风险
  • 谢谢! stackoverflow.com/questions/20428866/…好像没人能拿到Android Camera文件夹吧?
【解决方案3】:

Environment.getExternalStoragePublicDirectory 仅用于获取内部存储上的目录。

要在辅助存储(如果存在)上获取 DCIM 文件夹,您需要遵循以下代码:

String secondStorage = System.getenv("SECONDARY_STORAGE");
File file = new File(secStore + "/DCIM");
File[] listFiles = file.listFiles();

【讨论】:

  • 我的 Sony X compact 有一张 SD 卡,但未设置 SECONDARY_STORAGE
【解决方案4】:
public class DefaultMediaRepository implements MediaRepository {
private final AppCompatActivity activity;
private LoaderManager supportLoaderManager;

DefaultMediaRepository(@NotNull AppCompatActivity activity) {
    this.activity = activity;
    supportLoaderManager = activity.getSupportLoaderManager();
}

public void media(int offset, CompletedListener<List<Media>> completedListener) {
    supportLoaderManager.initLoader((int) System.currentTimeMillis(), null,
            new MediaLoader(offset, completedListener));

}

class MediaLoader implements LoaderManager.LoaderCallbacks<Cursor> {
    private static final int LIMIT = 20;
    private Uri uri;
    private String selection;
    private String[] selectionArgs;
    private String sortOrder;
    private CompletedListener<List<Media>> completedListener;

    MediaLoader(int offset, CompletedListener<List<Media>> completedListener) {
        this.completedListener = completedListener;
        uri = MediaStore.Files.getContentUri("external");
        selection = "("
                + FileColumns.MEDIA_TYPE + "="
                + FileColumns.MEDIA_TYPE_IMAGE
                + " OR "
                + FileColumns.MEDIA_TYPE + "="
                + FileColumns.MEDIA_TYPE_VIDEO
                + ")"
                + " AND "
                + ImageColumns.BUCKET_DISPLAY_NAME
                + " = ?";
        selectionArgs = new String[]{"Camera"};
        sortOrder = ImageColumns.DATE_TAKEN + " DESC " +
                " LIMIT " + LIMIT + " offset " + offset;
    }

    @NonNull
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
        return new CursorLoader(activity.getApplicationContext(), uri, null, selection,
                selectionArgs, sortOrder);
    }

    @Override
    public void onLoaderReset(@NonNull Loader<Cursor> loader) {
    }

    @Override
    public void onLoadFinished(@NonNull Loader<Cursor> loader, @NotNull Cursor cursor) {
        @SuppressLint("UseSparseArrays") List<Media> list = new LinkedList<>();
        while (cursor.moveToNext()) {
            long id = cursor.getLong(cursor.getColumnIndexOrThrow(FileColumns._ID));
            int media = cursor.getInt(cursor.getColumnIndexOrThrow(FileColumns.MEDIA_TYPE));
            Uri uri = Uri.withAppendedPath(this.uri, "" + id);
            list.add(new Media(uri.toString(), media == FileColumns.MEDIA_TYPE_VIDEO));
        }
        cursor.close();
        completedListener.completed(list);
        supportLoaderManager.destroyLoader(loader.getId());
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多