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);

}

});

}