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カードの場合もあります。ユーザーがカメラで作成した写真を保存するために選択した保存場所を知っているといいのですが。
getExternalStoragePublicDirectory()
をパラメーターDIRECTORY_PICTURESとともに使用します
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
DIRECTORY_DCIMは、デバイスをカメラとしてマウントするときの写真とビデオの従来の場所です。
DIRECTORY_PICTURESは、ユーザーが利用できる画像を配置するための標準ディレクトリです。
それが役に立てば幸い !
ドキュメントによると、2つのオプションがあります
DIRECTORY_DCIMデバイスをカメラとしてマウントするときの写真とビデオの従来の場所。
File musicDirectory = new File( getExternalFilesDir(Environment.DIRECTORY_DCIM));
DIRECTORY_PICTURESユーザーが使用できる画像を配置する標準のディレクトリ。
File musicDirectory = new File( getExternalFilesDir(Environment.DIRECTORY_PICTURES));
getExternalFilesDir()はFileオブジェクトを返します
ここで参照できます 開発者ページ
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.
}
Environment.getExternalStoragePublicDirectory
は、内部ストレージ上のディレクトリのみを取得するために使用されます。
セカンダリストレージ(存在する場合)にDCIMフォルダーを取得するには、次のコードに従う必要があります。
String secondStorage = System.getenv("SECONDARY_STORAGE");
File file = new File(secStore + "/DCIM");
File[] listFiles = file.listFiles();
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());
}
}
}