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

来源:互联网 发布:可靠韩国代购淘宝店铺 编辑:程序博客网 时间:2024/06/05 13:41

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 0
原创粉丝点击