Android中仿微信选择图片和拍照

1.Android6.0系统,对于权限的使用都是需要申请,选择图片和拍照需要申请Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE这两个权限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions((Activity) this,
                    new String[] { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_STORAGE_READ_ACCESS_PERMISSION);
        }
2.通过图片选择器MultiImageSelector来管理: 选择模式、最大选择数量、是否启动相机等功能。
3.点击图片选择按钮跳转到MultiImageSelectorActivity类,其布局如下:(一个Toobar + 一个FrameLayout)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:background="#181819"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/mis_actionbar_color"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:minHeight="?android:attr/actionBarSize">

        <Button
            android:id="@+id/commit"
            android:background="@drawable/mis_action_btn"
            android:minHeight="1dp"
            android:minWidth="1dp"
            android:layout_marginRight="16dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:textColor="@color/mis_default_text_color"
            android:textSize="14sp"
            android:layout_gravity="right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </android.support.v7.widget.Toolbar>

    <FrameLayout
        android:id="@+id/image_grid"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
4.调用如下方法填充展示图片的fragment(MultiImageSelectorFragment)。
         getSupportFragmentManager().beginTransaction()
                    .add(R.id.image_grid, Fragment.instantiate(this, MultiImageSelectorFragment.class.getName(), bundle))
                    .commit();
4.MultiImageSelectorFragment布局用gridview显示从相册获取的图片
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@android:color/black"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <GridView
        android:id="@+id/grid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:horizontalSpacing="@dimen/mis_space_size"
        android:verticalSpacing="@dimen/mis_space_size"
        android:paddingBottom="?android:attr/actionBarSize"
        android:clipToPadding="false"
        android:numColumns="3"/>

    <RelativeLayout
        android:clickable="true"
        android:id="@+id/footer"
        android:background="#cc000000"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize">

        <Button
            android:id="@+id/category_btn"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:layout_centerVertical="true"
            android:textColor="@color/mis_folder_text_color"
            tools:text="所有图片"
            android:textSize="16sp"
            android:gravity="center_vertical"
            android:drawableRight="@drawable/mis_text_indicator"
            android:drawablePadding="5dp"
            android:background="@null"
            android:singleLine="true"
            android:ellipsize="end"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        </RelativeLayout>

</RelativeLayout>
5.调用android.support.v4.app.LoaderManager.class类里面的LoaderCallbacks方法,等加载完成后给mImageAdapter设置数据。
mImageAdapter.setData(images);
6.当允许拍照的时候,显示拍照按钮,调用系统相机功能。
 mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (mImageAdapter.isShowCamera()) {
                    if (i == 0) {
                        showCameraAction();
                    } else {
                        Image image = (Image) adapterView.getAdapter().getItem(i);
                        selectImageFromGrid(image, mode);
                    }
                } else {
                    Image image = (Image) adapterView.getAdapter().getItem(i);
                    selectImageFromGrid(image, mode);
                }
            }
        });

调用相机功能

  /**
     * Open camera
     */
    private void showCameraAction() {
        if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED){
            requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    getString(R.string.mis_permission_rationale_write_storage),
                    REQUEST_STORAGE_WRITE_ACCESS_PERMISSION);
        }else {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
                try {
                    mTmpFile = FileUtils.createTmpFile(getActivity());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (mTmpFile != null && mTmpFile.exists()) {
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
                    startActivityForResult(intent, REQUEST_CAMERA);
                } else {
                    Toast.makeText(getActivity(), R.string.mis_error_image_not_exist, Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(getActivity(), R.string.mis_msg_no_camera, Toast.LENGTH_SHORT).show();
            }
        }
    }

选择图片

  /**
     * notify callback
     * @param image image data
     */
    private void selectImageFromGrid(Image image, int mode) {
        if(image != null) {
            if(mode == MODE_MULTI) {
                if (resultList.contains(image.path)) {
                    resultList.remove(image.path);
                    if (mCallback != null) {
                        mCallback.onImageUnselected(image.path);
                    }
                } else {
                    if(selectImageCount() == resultList.size()){
                        Toast.makeText(getActivity(), R.string.mis_msg_amount_limit, Toast.LENGTH_SHORT).show();
                        return;
                    }
                    resultList.add(image.path);
                    if (mCallback != null) {
                        mCallback.onImageSelected(image.path);
                    }
                }
                mImageAdapter.select(image);
            }else if(mode == MODE_SINGLE){
                if(mCallback != null){
                    mCallback.onSingleImageSelected(image.path);
                }
            }
        }
    }

Demo下载:http://download.csdn.net/detail/zhou114108/9695769

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中实现仿微信朋友圈底部的拍照和拍摄功能,可以通过使用系统自带的相机应用或者自定义相机来进行实现。 首先,可以使用系统自带的相机应用来实现拍照和拍摄的功能。可以通过调用Intent,使用ACTION_IMAGE_CAPTURE和ACTION_VIDEO_CAPTURE来启动相机应用,并通过设置Uri来指定图片或视频的保存路径。在拍摄完成后,可以在onActivityResult()方法中获取拍摄结果进行处理,比如保存图片或视频的Uri,显示预览等。 其次,也可以自定义相机来实现拍照和拍摄的功能。可以通过使用Camera和Camera2 API来实现相机的预览和拍摄功能。首先,需要使用Camera或Camera2 API来启动相机预览,并通过设置SurfaceHolder或SurfaceTexture来显示预览画面。同时,可以监听相机的拍照或拍摄按钮点击事件,在点击时进行拍照或拍摄操作,并通过设置相机的PictureCallback或CaptureCallback来处理拍摄结果。 无论是使用系统相机应用还是自定义相机,还可以添加一些额外的功能来实现更好的用户体验。比如,可以添加美颜滤镜、闪光灯控制、切换前后摄像头等功能。 总而言之,在Android中实现仿微信朋友圈底部的拍照和拍摄功能可以通过使用系统自带相机应用或自定义相机来实现,为用户提供类似微信朋友圈的相机功能,并可以根据需求添加额外的功能来增强用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值