如何将相机或图库中的图片添加到 recyclerView?

how to add picture from camera or gallery to recyclerView?

我想让用户拍下他的照片 phone 或从图库中获取照片并将其添加到 recyclerView 列表,每次他拍照时回收站列表都会自动增加 如果我从 drawable 获取照片现在我想从相机或画廊获取它。 如何实现谢谢

 public void dialogShowPhoto() {
    String takephoto = getString(R.string.take_photo);
    String chooseFromLibrary = getString(R.string.choose_from_library);
    String cancel = "cancel";
    String addPhoto = "add photo";
    final CharSequence[] items = {takephoto, chooseFromLibrary, cancel};
    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this);
    builder.setTitle(addPhoto);
    final String finalTakephoto = takephoto;
    final String finalChooseFromLibrary = chooseFromLibrary;
    final String finalCancel = cancel;
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals(finalTakephoto)) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, REQUEST_CAMERA);
            } else if (items[item].equals(finalChooseFromLibrary)) {
                Intent intent = new Intent(
                        Intent.ACTION_PICK,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, RESULT_LOAD_IMAGE);
            } else if (items[item].equals(finalCancel)) {
                dialog.dismiss();
            }
        }
    });
    builder.show();

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CAMERA && resultCode == Activity.RESULT_OK) {
        selectedImageWork.setAlpha(1f);
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        // selectedImage.setImageBitmap(photo);
        Matrix mat = new Matrix();
        mat.postRotate(Integer.parseInt("270"));
        Bitmap bMapRotate = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), mat, true);
        selectedImageWork.setImageBitmap(bMapRotate);


    }
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null) {
        Uri selectedImageURI = data.getData();
        PlaceWorkModel placeWorkModel = new PlaceWorkModel(); // the model between activity and adapter
        placeWorkModel.setPhoto(Integer.parseInt(convertImage2Base64()));  // here i pass the photo
        picturesList.add(placeWorkModel);
        mAdapter.notifyDataSetChanged();

    }
}



// this method will convert the image to base64
public String convertImage2Base64() {
    Bitmap  bitmap = ((BitmapDrawable) selectedImageWork.getDrawable()).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
    byte[] image = stream.toByteArray();
    return ("data:image/jpeg;base64," + Base64.encodeToString(image, 0));
}

型号Class

public class PlaceWorkModel {

private int photo;

public PlaceWorkModel(int photo) {
    this.photo = photo;
}

public PlaceWorkModel() {
}

public int getPhoto() {
    return photo;
}

public void setPhoto(int photo) {
    this.photo = photo;
}

适配器

private Context mContext;
private List<PlaceWorkModel> picturesList;


public class MyViewHolder extends RecyclerView.ViewHolder {
    private ImageView picture;



    public MyViewHolder(View view) {
        super(view);
        picture = (ImageView) view.findViewById(R.id.PlaceWorkRecycler_imageview_Picture);

    }
}


public PlaceWorkRecyclerAdapter(Context mContext, ArrayList<PlaceWorkModel> picturesList) {
    this.mContext = mContext;
    this.picturesList = picturesList;

}

@Override
public PlaceWorkRecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.placework_recycler_adapterlayout, parent, false);
    return new PlaceWorkRecyclerAdapter.MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final PlaceWorkRecyclerAdapter.MyViewHolder holder, int position) {
    PlaceWorkModel listOfPictures = picturesList.get(position);
    // loading picturesList using Glide library
    Glide.with(mContext).load(listOfPictures.getPhoto())
            .into(holder.picture);


}

@Override
public int getItemCount() {
    return picturesList.size();
}

这里是错误LogCat

    12-16 17:50:47.630 11450-11476/com.foodservices.index.foodservices E/FA: Failed to send current screen to service
12-16 17:50:47.636 11450-11476/com.foodservices.index.foodservices E/FA: Discarding data. Failed to send event to service
12-16 17:50:49.317 11450-11450/com.foodservices.index.foodservices E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                     Process: com.foodservices.index.foodservices, PID: 11450
                                                                                     java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/62/ORIGINAL/NONE/681675800 flg=0x1 clip={text/uri-list U:content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F62/ORIGINAL/NONE/681675800} }} to activity {com.foodservices.index.foodservices/com.index.foodServices.common.view.activities.PlaceWorkActivity}: java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
                                                                                         at android.app.ActivityThread.deliverResults(ActivityThread.java:4268)
                                                                                         at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
                                                                                         at android.app.ActivityThread.-wrap19(Unknown Source:0)
                                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                         at android.os.Looper.loop(Looper.java:164)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:6494)
                                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                                         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                                                                                      Caused by: java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
                                                                                         at com.index.foodServices.common.view.activities.PlaceWorkActivity.convertImage2Base64(PlaceWorkActivity.java:196)
                                                                                         at com.index.foodServices.common.view.activities.PlaceWorkActivity.onActivityResult(PlaceWorkActivity.java:184)
                                                                                         at android.app.Activity.dispatchActivityResult(Activity.java:7267)
                                                                                         at android.app.ActivityThread.deliverResults(ActivityThread.java:4264)
                                                                                         at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312) 
                                                                                         at android.app.ActivityThread.-wrap19(Unknown Source:0) 
                                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644) 
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                         at android.os.Looper.loop(Looper.java:164) 
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:6494) 
                                                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                                                     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

您没有将更新列表设置到适配器中。

在您的适配器中,添加功能更新

public void updateList(List<PlaceWorkModel> picturesList) {
     this.picturesList = picturesList;
     notifyDataSetChanged();
}

那么,

 if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null) {
        Uri selectedImageURI = data.getData();
        PlaceWorkModel placeWorkModel = new PlaceWorkModel(); // the model between activity and adapter
        placeWorkModel.setPhoto(Integer.parseInt(convertImage2Base64()));  // here i pass the photo
        picturesList.add(placeWorkModel);

        mAdapter.updateList(picturesList); // add this

        mAdapter.notifyDataSetChanged();

    }

也许 easyImage 库能帮到你

easyImage library

这是一个示例,说明如何使用该库从设备拍摄照片并将其保存到您的应用程序中,之后您可以将其设置为您的视图

    private void OpenImage() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Options");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            if (items[i].equals("Camera")) {
                EasyImage.openCamera(EditorActivity.this, REQUEST_CODE_CAMERA);
            } else if (items[i].equals("Gallery")) {
                EasyImage.openGallery(EditorActivity.this, REQUEST_CODE_GALLERY);
            }
        }
    });

    AlertDialog dialog = builder.create();
    dialog.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() {
        @Override
        public void onImagePicked(File imageFile, EasyImage.ImageSource source, int type) {
            switch (type) {
                case REQUEST_CODE_CAMERA:
                    Glide.with(EditorActivity.this)
                            .load(imageFile)
                            .centerCrop()
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .into(img);
                    saveImage(imageFile.getAbsolutePath());
                    break;
                case REQUEST_CODE_GALLERY:
                    Glide.with(EditorActivity.this)
                            .load(imageFile)
                            .centerCrop()
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .into(img);
                    saveImage(imageFile.getAbsolutePath());
                    break;
            }
        }
    });
}

private void saveImage(String imagePath) {
    pictureChanged = true;
    try {
        FileInputStream file = new FileInputStream(imagePath);
        byte[] image = new byte[file.available()];
        file.read(image);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我认为问题出在您的 convertImage2Base64 尝试将其更改为如下内容

public byte[] convertImage2Base64() {
    Bitmap  bitmap = ((BitmapDrawable) selectedImageWork.getDrawable()).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
    byte[] image = Base64.decode(stream.toByteArray(), Base64.DEFAULT);
    return image;
}

并对您的模型进行如下更改。

    public class PlaceWorkModel {

private byte[] photo;

public PlaceWorkModel(byte[] photo) {
    this.photo = photo;
}

public PlaceWorkModel() {
}

public byte[] getPhoto() {
    return photo;
}

public void setPhoto(byte[] photo) {
    this.photo = photo;
}

我假设您可以调用 fragment/activity 中的函数并从图库或相机中获取图像,唯一的问题是 glide 没有加载图像。试试这个,让我知道它是否有效。