Android中仿微信选择图片和拍照
Posted 志向远大
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Android中仿微信选择图片和拍照的主要内容,如果未能解决你的问题,请参考以下文章
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
Android使用Retrofit技术仿微信图片上传,可以选择多张图片拍照上传
Android仿微信多图片选择,拍照等,适合快速导入到自己项目中