BÀI 93 - TEDBOTTOMPICKER NẠP HÌNH ẢNH TRONG ANDROID
Đầu tiên, thêm thư viện này: source
implementation 'gun0912.ted:tedbottompicker:2.0.1'
Còn thư viện này sẽ nhắc người dùng cấp quyền cho ứng dụng mỗi khi truy cập thuộc tính gì đó.
implementation 'io.github.ParkSangGwon:tedpermission-rx3:3.3.0'
Thêm một số quyền cho ứng dụng của bạn, thường sẽ là
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Tạo một layout để chứa hình ảnh như này
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:cardCornerRadius="5dp"
android:layout_margin="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView_layoutImportImage"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="100dp"
tools:ignore="ContentDescription" />
</androidx.cardview.widget.CardView>
Tạo một Adapter để đổ hình ảnh đã chọn vào RecyclerView
public class AdapterImportImage extends RecyclerView.Adapter<AdapterImportImage.ViewHolderImportImage> {
private final Context context;
private List<Uri> listImage;
public AdapterImportImage(Context context) {
this.context = context;
}
@SuppressLint("NotifyDataSetChanged")
public void SetImage(List<Uri> list) {
this.listImage = list;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolderImportImage onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_import_image, parent, false);
return new ViewHolderImportImage(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolderImportImage holder, int position) {
Uri uri = listImage.get(position);
if (uri == null) return;
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
if (bitmap != null) holder.imgPhoto.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int getItemCount() {
if (listImage != null) return listImage.size();
else return 0;
}
public static class ViewHolderImportImage extends RecyclerView.ViewHolder {
private final ImageView imgPhoto;
public ViewHolderImportImage(@NonNull View itemView) {
super(itemView);
imgPhoto = itemView.findViewById(R.id.imageView_layoutImportImage); }
}
}
Code Java như sau:
Cụ thể, mình sẽ dùng một ImageView imgImportImage. Khi bấm vào ImageView này thì sẽ abc như dưới
private void SetActionImportImage() {
adapterImportImage = new AdapterImportImage(ActivityThongTinMayTra.this);
GridLayoutManager manager = new GridLayoutManager(this, 2);
rvImportImage.setLayoutManager(manager);
rvImportImage.setAdapter(adapterImportImage);
imgImportImage.setOnClickListener(view -> RequestPermissionImport());
rvImportImage.addOnItemTouchListener(new RecyclerTouchListener(this, rvImportImage, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
// Phóng bự ảnh được chọn
}
@Override
public void onLongClick(View view, int position) {
RequestPermissionImport();
}
}));
}
private void RequestPermissionImport() {
PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
SelectImageFromGallery();
}
@Override
public void onPermissionDenied(List<String> deniedPermissions) {
DialogNotificationWarning warning = new DialogNotificationWarning();
warning.ShowDialog(ActivityThongTinMayTra.this, "Ứng dụng cần bạn cấp quyền để truy cập bộ sưu tập hình ảnh. Nếu bạn không cấp quyền thì đừng dùng chức năng này. OK !");
}
};
TedPermission.create()
.setPermissionListener(permissionlistener)
.setDeniedMessage("Một hoặc một số quyền chưa được cấp cho ứng dụng\n\nBạn cần cấp quyền truy cập bộ sưu tập và máy ảnh cho ứng dụng.")
.setPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
.check();
}
private void SelectImageFromGallery() {
TedBottomPicker.with(ActivityThongTinMayTra.this)
.setPeekHeight(1600)
.showTitle(false)
.setCompleteButtonText("Chọn")
.setEmptySelectionText("Thoát")
.setSelectMaxCountErrorText("Quá giới hạn tải lên")
.setSelectMaxCount(4)
.showMultiImage(uriList -> {
if (uriList != null && !uriList.isEmpty()) {
imgImportImage.setVisibility(View.GONE);
rvImportImage.setVisibility(View.VISIBLE);
adapterImportImage.SetImage(uriList);
}
});
}