安卓选取多张手机照片同时可以拍照相片然后预览

一:介绍

这篇博客介绍的功能就是选取多张图片预览并拿到照片路径,大家根据照片路径可以做各种各样的处理(预览,上传,压缩,等等),有这种需求的Android开发攻城狮可以借鉴借鉴.

二:效果图

先贴几张效果图给大伙瞧瞧

1.选择照片界面,第一个拍摄照片就是调用照相机拍照获取照片



2.照片选择完成界面,右上角的对勾是我加上的,点击取消选择,对勾消失,再点击再次选择,对勾再出现,给用户友好的交互体验



3.项目结构图



三:实现步骤

1.新建项目之后,依赖第三方库multi-image-selector demo会在文章末尾贴出,demo中含有这个multi-image-selector库

2.记得加权限

<!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 读写SD卡权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
还要注册选择图片activity

<activity android:name="me.nereo.multi_image_selector.MultiImageSelectorActivity" />

3.在mainactivity的布局文件,里面有一个button用来启动选择图片界面,有一个gridview用于展示选择的图片(预览图片)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zidiv.multiphoto.MainActivity">

    <Button
        android:id="@+id/btn_selectphoto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择照片" />

    <GridView
        android:id="@+id/gv_show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:horizontalSpacing="5dp"
        android:listSelector="#ffffff"
        android:numColumns="3"
        android:verticalSpacing="10dp"></GridView>

</LinearLayout>

4.在mainactivity中,设置按钮的点击事件,startActivityForResult启动intent到选择照片的界面

Intent intent = new Intent(MainActivity.this, MultiImageSelectorActivity.class);
        // 是否显示拍摄图片,显示
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
        // 最大可选择图片数量 30张
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxNum);
        // 选择模式,选取多张
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_MULTI);
        // 默认选择
        if (mSelectPath != null && mSelectPath.size() > 0) {
            intent.putExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, mSelectPath);
        }
        startActivityForResult(intent, REQUEST_IMAGE);

5.重写onActivityResult拿到选择图片的路径

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE) {
            if (resultCode == RESULT_OK) {
                mSelectPath = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                for (String p : mSelectPath) {
                    //加入最后选择的集合
                    finalSelectPaths.add(p);
                    Log.e("路径", p);
                    //加载缩略图
                    Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromSd(p, 200, 240);
                    bitmapList.add(bitmap);
                }
                imgAdapter = new ImgAdapter(context, bitmapList);
                gv_show.setAdapter(imgAdapter);
                //接口回调
                imgAdapter.setOnItemClickLis(new ImgAdapter.onItemClickLis() {
                    @Override
                    public void onItemClick(ImageView img_marke, int position) {
                        flag = !flag;
                        if (!flag) {
                            img_marke.setVisibility(View.INVISIBLE);
                            finalSelectPaths.remove(position);
                            //遍历
                            for (int i = 0; i < finalSelectPaths.size(); i++) {
                                Log.e("最后的路径", finalSelectPaths.get(i));
                            }
                        } else {
                            img_marke.setVisibility(View.VISIBLE);
                            finalSelectPaths.add(position, mSelectPath.get(position));
                            //遍历
                            for (int i = 0; i < finalSelectPaths.size(); i++) {
                                Log.e("最后的路径", finalSelectPaths.get(i));
                            }
                        }
                    }
                });
            }
        }
    }

四:最后的话

好了,有了这个multi-image-selector第三方库实现起来还是很简单的,这里是demo地址,点击下载demo,如果大家有什么意见欢迎提出!




Android平台上,实现拍照或从相册选取图片上传多张可以通过以下步骤实现。首先,需要在AndroidManifest.xml文件中添加相机和存储权限。接着,在相应的Activity中,我们可以使用Intent来启动系统相机应用,或者打开系统相册应用。 如果是拍照上传,我们可以创建一个Intent对象,指定Action为MediaStore.ACTION_IMAGE_CAPTURE,然后使用startActivityForResult方法启动相机应用。拍摄完成后,系统会将照片保存在指定的URI路径上。 如果是从相册选取图片上传,我们同样可以创建一个Intent对象,指定Action为Intent.ACTION_PICK,Type为“image/*”,然后使用startActivityForResult方法启动相册应用。 接着,在onActivityResult方法中,我们可以根据requestCode和resultCode来判断是从相机还是相册返回的数据。如果是从相机返回的数据,我们可以通过指定的URI路径来获取拍摄的照片;如果是从相册返回的数据,我们可以通过data.getData()方法来获取选取图片。 最后,我们可以将获取到的照片进行上传操作,可以是将图片转换成Bitmap对象,然后上传至服务器;或者将图片的URI路径传递给服务器进行上传。如果有多张图片需要上传,可以采用循环的方式依次处理每张图片。 总的来说,实现拍照或从相册选取图片上传多张,需要通过Intent调用系统应用获取图片,然后在onActivityResult方法中处理返回的数据,最后进行图片上传操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值