android项目实战之使用框架 集成多图片、视频的上传

这篇具有很好参考价值的文章主要介绍了android项目实战之使用框架 集成多图片、视频的上传。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果图

android中多图片上传和展示,androidandroid中多图片上传和展示,android

 实现方式,本功能使用PictureSelector 第三方库  。作者项目地址:https://github.com/LuckSiege/PictureSelector

 

1. builder.gradle 增加

implementation 'io.github.lucksiege:pictureselector:v3.11.1'

implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'
implementation 'io.reactivex.rxjava2:rxjava:2.0.0'

2. XML布局

<RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <View
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_alignTop="@+id/recycler"
                    android:layout_alignBottom="@+id/recycler"
                    android:background="@color/app_color_white" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recycler"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="8dp"
                    android:layout_marginRight="8dp"
                    android:overScrollMode="never" />

            </RelativeLayout>

3. 适配器,这里对GridImageAdapter进行了改进。

public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.ViewHolder> {
    public static final String TAG = "PictureSelector";
    public static final int TYPE_CAMERA = 1;
    public static final int TYPE_PICTURE = 2;
    private final LayoutInflater mInflater;
    private  ArrayList<LocalMedia> list = new ArrayList<>();
    private int selectMax = 9;

    /**
     * 删除
     */
    public void delete(int position) {
        try {

            if (position != RecyclerView.NO_POSITION && list.size() > position) {
                list.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, list.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public GridImageAdapter(Context context, List<LocalMedia> result) {
        this.mInflater = LayoutInflater.from(context);
        this.list.addAll(result);
    }

    public void setSelectMax(int selectMax) {
        this.selectMax = selectMax;
    }

    public void setList(ArrayList<LocalMedia> list) {
        this.list = list;
    }

    public int getSelectMax() {
        return selectMax;
    }

    public ArrayList<LocalMedia> getData() {
        return list;
    }

    public void remove(int position) {
        if (position < list.size()) {
            list.remove(position);
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        ImageView mImg;
        ImageView mIvDel;
        TextView tvDuration;

        public ViewHolder(View view) {
            super(view);
            mImg = view.findViewById(R.id.fiv);
            mIvDel = view.findViewById(R.id.iv_del);
            tvDuration = view.findViewById(R.id.tv_duration);
        }
    }

    @Override
    public int getItemCount() {
        if (list.size() < selectMax) {
            return list.size() + 1;
        } else {
            return list.size();
        }
    }

    @Override
    public int getItemViewType(int position) {
        if (isShowAddItem(position)) {
            return TYPE_CAMERA;
        } else {
            return TYPE_PICTURE;
        }
    }

    /**
     * 创建ViewHolder
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = mInflater.inflate(R.layout.item_filter_image, viewGroup, false);
        return new ViewHolder(view);
    }

    private boolean isShowAddItem(int position) {
        int size = list.size();
        return position == size;
    }

    /**
     * 设置值
     */
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        //少于MaxSize张,显示继续添加的图标
        if (getItemViewType(position) == TYPE_CAMERA) {
            viewHolder.mImg.setImageResource(R.drawable.ic_add_image);
            viewHolder.mImg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mItemClickListener != null) {
                        mItemClickListener.openPicture();
                    }
                }
            });
            viewHolder.mIvDel.setVisibility(View.INVISIBLE);
        } else {
            viewHolder.mIvDel.setVisibility(View.VISIBLE);
            viewHolder.mIvDel.setOnClickListener(view -> {
                int index = viewHolder.getAbsoluteAdapterPosition();
                if (index != RecyclerView.NO_POSITION && list.size() > index) {
                    list.remove(index);
                    notifyItemRemoved(index);
                    notifyItemRangeChanged(index, list.size());
                }
            });
            LocalMedia media = list.get(position);
            int chooseModel = media.getChooseModel();
            String path = media.getAvailablePath();
            long duration = media.getDuration();
            viewHolder.tvDuration.setVisibility(PictureMimeType.isHasVideo(media.getMimeType())
                    ? View.VISIBLE : View.GONE);
            if (chooseModel == SelectMimeType.ofAudio()) {
                viewHolder.tvDuration.setVisibility(View.VISIBLE);
                viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds
                        (R.drawable.ps_ic_audio, 0, 0, 0);

            } else {
                viewHolder.tvDuration.setCompoundDrawablesRelativeWithIntrinsicBounds
                        (R.drawable.ps_ic_video, 0, 0, 0);
            }
            viewHolder.tvDuration.setText(DateUtils.formatDurationTime(duration));
            if (chooseModel == SelectMimeType.ofAudio()) {
                viewHolder.mImg.setImageResource(com.luck.picture.lib.R.drawable.ps_audio_placeholder);
            } else {
                RequestOptions options = RequestOptions.centerCropTransform()
                        .centerCrop()
                        .placeholder(R.color.app_color_f6)
                        .diskCacheStrategy(DiskCacheStrategy.ALL);

                Glide.with(viewHolder.itemView.getContext())
                        .load(PictureMimeType.isContent(path) && !media.isCut() && !media.isCompressed() ? Uri.parse(path)
                                : path)
                        .apply(options)
                        .into(viewHolder.mImg);
            }
            //itemView 的点击事件
            if (mItemClickListener != null) {
                viewHolder.itemView.setOnClickListener(v -> {
                    int adapterPosition = viewHolder.getAbsoluteAdapterPosition();
                    mItemClickListener.onItemClick(v, adapterPosition);
                });
            }

            if (mItemLongClickListener != null) {
                viewHolder.itemView.setOnLongClickListener(v -> {
                    int adapterPosition = viewHolder.getAbsoluteAdapterPosition();
                    mItemLongClickListener.onItemLongClick(viewHolder, adapterPosition, v);
                    return true;
                });
            }
        }
    }

    private OnItemClickListener mItemClickListener;

    public void setOnItemClickListener(OnItemClickListener l) {
        this.mItemClickListener = l;
    }

    public interface OnItemClickListener {
        /**
         * Item click event
         *
         * @param v
         * @param position
         */
        void onItemClick(View v, int position);

        /**
         * Open PictureSelector
         */
        void openPicture();
    }

    private OnItemLongClickListener mItemLongClickListener;

    public void setItemLongClickListener(OnItemLongClickListener l) {
        this.mItemLongClickListener = l;
    }
}
4. 布局空间初始化
 FullyGridLayoutManager manager = new FullyGridLayoutManager(mContext, 3, GridLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(manager);
        adapter = new GridImageAdapter(getContext(), mData);
        adapter.setSelectMax(maxSelectNum);
        mRecyclerView.setAdapter(adapter);
        imageEngine = GlideEngine.createGlideEngine();

5. 点击增加弹框布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_album"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_album"
            android:gravity="center"
            android:padding="15dp"
            android:text="相册"
            android:textSize="16sp"/>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#f5f5f5"/>

        <TextView
            android:id="@+id/tv_camera"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_camera"
            android:gravity="center"
            android:padding="15dp"
            android:text="拍照"
            android:textSize="16sp"/>

        <TextView
            android:id="@+id/tv_cancel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="@drawable/shape_cancel"
            android:gravity="center"
            android:padding="15dp"
            android:text="取消"
            android:textSize="16sp"/>

    </LinearLayout>

</LinearLayout>

6. 弹框页面初始化

 View bottomView = View.inflate(mContext, R.layout.layout_bottom_dialog, null);
        TextView mAlbum = bottomView.findViewById(R.id.tv_album);
        TextView mCamera = bottomView.findViewById(R.id.tv_camera);
        TextView mCancel = bottomView.findViewById(R.id.tv_cancel);

        pop = new PopupWindow(bottomView, -1, -2);
        pop.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        pop.setOutsideTouchable(true);
        pop.setFocusable(true);
        WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
        lp.alpha = 0.5f;
        getActivity().getWindow().setAttributes(lp);
        pop.setOnDismissListener(new PopupWindow.OnDismissListener() {

            @Override
            public void onDismiss() {
                WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
                lp.alpha = 1f;
                getActivity().getWindow().setAttributes(lp);
            }
        });
        pop.setAnimationStyle(R.style.main_menu_photo_anim);
        pop.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);

7.  弹框页面监听初始化

View.OnClickListener clickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()) {
                    case R.id.tv_album:
                        //相册
                        Log.d("打开相册","sss");
                        PictureSelector.create(GoodItemTitleFragment.this)
                                .openGallery(SelectMimeType.ofImage())
                                .setImageEngine(GlideEngine.createGlideEngine())
                                .setMaxSelectNum(maxSelectNum)
                                .setMinSelectNum(1)
                                .setImageSpanCount(4)
                                .forResult(new OnResultCallbackListener<LocalMedia>() {

                                               @Override
                                               public void onResult(ArrayList<LocalMedia> result) {
                                                   selectList.addAll(result);
                                                   //Log.d("ceshi"+RESULT_OK, String.valueOf(images));
                                                   adapter.setList(selectList);
                                                   adapter.notifyDataSetChanged();
                                               }

                                               @Override
                                               public void onCancel() {

                                               }
                                           });
                       /** PictureSelector.create(GoodItemTitleFragment.this)
                                .openGallery(PictureMimeType.ofImage())
                                .maxSelectNum(maxSelectNum)
                                .minSelectNum(1)
                                .imageSpanCount(4)
                                .selectionMode(PictureConfig.MULTIPLE)
                                .forResult(PictureConfig.CHOOSE_REQUEST);**/
                        break;
                    case R.id.tv_camera:
                        //拍照
                        Log.d("打开拍照","sss");
                        PictureSelector.create(GoodItemTitleFragment.this)
                                .openCamera(SelectMimeType.ofVideo())
                                .forResultActivity(PictureConfig.REQUEST_CAMERA);
                        /**PictureSelector.create(GoodItemTitleFragment.this)
                                .openCamera(PictureMimeType.ofImage())
                                .forResult(PictureConfig.CHOOSE_REQUEST);**/
                        break;
                    case R.id.tv_cancel:
                        //取消
                        closePopupWindow();
                        break;
                }
                closePopupWindow();
            }
        };

8. 增加拍照回调,不加这个图片回调不成功哦。

@SuppressLint("RestrictedApi")
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("ceshi"+requestCode,"111");
        Log.d("ceshi"+resultCode,"222");
        //Log.d("ceshi"+RESULT_OK,"333");
        List<LocalMedia> images;
        if (resultCode == -1) {
            //Log.d("ceshi"+RESULT_OK,"111");
            if (requestCode == PictureConfig.REQUEST_CAMERA) {// 图片选择结果回调
                images = PictureSelector.obtainSelectorList(data);
                selectList.addAll(images);
                //Log.d("ceshi"+RESULT_OK, String.valueOf(images));
                adapter.setList(selectList);
                adapter.notifyDataSetChanged();
            }
        }
    }

本功能涉及的功能较多,用了几天的时间算集成完。欢迎点赞、转发、首次。文章来源地址https://www.toymoban.com/news/detail-818226.html

到了这里,关于android项目实战之使用框架 集成多图片、视频的上传的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用minio实现图片和视频的上传

    ps:因为业务上遇到了用minio实现图片的上传所以记录一下使用 MinIO是一个开源的 对象存储服务器 ,可以用来存储和检索任何类型的文件,包括图片、视频、文档等。MinIO的设计目标是为了 提供高性能、高可用性和可扩展性的对象存储服务 ,同时保持简单易用和低成本。 为

    2024年02月12日
    浏览(25)
  • Vue中使用wangEditor实现自定义上传图片和视频

    之前没用过wangEditor真是一脸懵,做自己没做过的东西总是心里没谱,既然项目已经结束了那来总结一下吧 看着官网的demo发现简单了好多 官网地址:快速开始 | wangEditor 这里可以选自己的框架,我用的vue2.0 然后按照demo示例一步步开整!

    2024年02月12日
    浏览(32)
  • 使用Vue + FormData + axios实现图片上传功能实战

    前言 上节回顾 上一小节中,我们添加了 Vue-router 的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了 ElementUI 的 el-menu 做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个

    2024年02月09日
    浏览(29)
  • 13 使用Vue + FormData + axios实现图片上传功能实战

    前言 上节回顾 上一小节中,我们添加了 Vue-router 的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了 ElementUI 的 el-menu 做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个

    2024年02月16日
    浏览(27)
  • 【Android入门到项目实战-- 7.4】—— 如何播放音频和视频

    目录 一、播放音频  MediaPlayer的工作流程 具体代码实现 二、播放视频 具体代码实现         学完本篇文章可以收获如何播放音频和视频。         播放音频需要使用MediaPlayer类实现,它对各种格式的音频文件提供了全面的控制方法,下面是MediaPlayer类较为常用的控制方

    2024年02月01日
    浏览(36)
  • Vue +vue-quill-editor+ Element UI使用富文本编辑器,上传图片,上传视频

    如果你们有问题,可以发评论提问,我看见一定回复!!!!! 一、基本使用 1、下载vue-quill-editor组件 2、引入· 富文本组件 方式一:全局引入 (在 main.js 文件中) 方式二:按需引入 (在 单个组件 中引用) 3、工具栏相关配置 4、设置工具栏中文提示 5、修改vue-quill-editor字体

    2024年02月08日
    浏览(41)
  • Android App开发实战项目之给用户推荐旅游信息图片(附源码 简单易懂)

    需要全部源码请点赞关注收藏后评论区留言~~~ 假定用户打开一个旅游App想看看哪里风景比较优美,那么App应当展示各地的风景名声图片,为了让界面不太呆板,可以考虑交错显示风景图片,接着用户向下拉动页面,想要刷新界面浏览更多的图片,此时App界面响应下拉刷新手势

    2024年02月08日
    浏览(32)
  • Puppeteer 使用教程-实战篇(爬取图片、视频、音频,页面数据)

    目录 前言 一、 获取实体店铺信息 二、 获取全国各省市县地图json数据 三、 cookies 四、 获取网络图片、视频资源 五、 自动化测试 总结         续上篇,我们简单讲述一下puppeteer常见的应用场景,包括静态页面数据获取,网络请求获取截取、图片、视频资源下载、自动化

    2024年02月06日
    浏览(32)
  • uniapp上传手机相册图片、视频或拍摄图片、视频上传

    一开始想用现成组件uView的u-upload来实现,做到一半发现使用这个组件上传图片没有问题,可以满足从相册上传、直接拍摄、预览功能。但是,视频好像不支持预览,不知道是我写法不对还是怎么回事/(ㄒoㄒ)/~~ 最终图片使用的u-upload组件,视频用了uniapp API 的 uni.chooseVideo()方法

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包