In Google's Material Design, Google introduce Bottom sheets.(Components – Bottom sheets)
Bottom sheets slide up from the bottom of the screen to reveal more content.
If you want pick image from gallery or take picture, this library can help easily.
TedBottomPicker provide 3 options:
MediaStore.ACTION_IMAGE_CAPTURE intent)Intent.ACTION_PICK intent)MediaStore.Images.Media.EXTERNAL_CONTENT_URI cursor)TedBottomPicker is simple image picker using bottom sheet.

dependencies {
implementation 'gun0912.ted:tedbottompicker:x.y.z'
//implementation 'gun0912.ted:tedbottompicker:2.0.0-alpha1'
}
If you think this library is useful, please press star button at upside.

You have to grant WRITE_EXTERNAL_STORAGE permission from user.
If your targetSDK version is 23+, you have to check permission and request permission to user.
Because after Marshmallow(6.0), you have to not only decalare permisions in AndroidManifest.xml but also request permissions at runtime.
There are so many permission check library in Android-Arsenal
I recommend TedPermission
TedPermission is super simple and smart permission check library.
RxJava and Listener styleYou have to use TedRxBottomPicker - Single image
TedRxBottomPicker.with(MainActivity.this)
.show()
.subscribe(uri ->
// here is selected image uri
}, Throwable::printStackTrace);
TedRxBottomPicker.with(MainActivity.this)
//.setPeekHeight(getResources().getDisplayMetrics().heightPixels/2)
.setPeekHeight(1600)
.showTitle(false)
.setCompleteButtonText("Done")
.setEmptySelectionText("No Select")
.setSelectedUriList(selectedUriList)
.showMultiImage()
.subscribe(uris -> {
// here is selected image uri list
}, Throwable::printStackTrace);
You have to use TedBottomPicker - Single image
TedBottomPicker.with(MainActivity.this)
.show(new TedBottomSheetDialogFragment.OnImageSelectedListener() {
@Override
public void onImageSelected(Uri uri) {
// here is selected image uri
}
});
TedBottomPicker.with(MainActivity.this)
.setPeekHeight(1600)
.showTitle(false)
.setCompleteButtonText("Done")
.setEmptySelectionText("No Select")
.setSelectedUriList(selectedUriList)
.showMultiImage(new TedBottomSheetDialogFragment.OnMultiImageSelectedListener() {
@Override
public void onImagesSelected(List<Uri> uriList) {
// here is selected image uri list
}
});
You can customize something ...
showVideoMedia() : Not only load image, but also load videosetPreviewMaxCount(Int) (default: 25)setPeekHeight(Int)setPeekHeightResId(R.dimen.xxx)showCameraTile(Boolean) (default: true)setCameraTile(R.drawable.xxx or Drawable)setCameraTileBackgroundResId(R.color.xxx)setGalleryTile(R.drawable.xxx or Drawable)showGalleryTile(Boolean) (default: true)setGalleryTileBackgroundResId(R.color.xxx)setSpacing(Int)setSpacingResId(R.dimen.xxx)setOnErrorListener(OnErrorListener)setTitle(String or R.string.xxx) (default: 'Select Image','사진 선택')showTitle(Boolean) (default: true)setTitleBackgroundResId(R.color.xxx)setImageProvider(ImageProvider)
: If you want load grid image yourself, you can use your ImageProvidersetSelectedUri(Uri)setDeSelectIcon(R.drawable.xxx or Drawable)setSelectedForeground(R.drawable.xxx or Drawable)setSelectMaxCount(Int)setSelectMinCount(Int)setCompleteButtonText(String or R.string.xxx) (default: 'Done','완료')setEmptySelectionText(String or R.string.xxx) (default: 'No Image','이미지가 선택되지 않았습니다')setSelectMaxCountErrorText(String or R.string.xxx)setSelectMinCountErrorText(String or R.string.xxx)setSelectedUriList(ArrayList<Uri>)```code Copyright 2017 Ted Park
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.```
$ claude mcp add TedBottomPicker \
-- python -m otcore.mcp_server <graph>