Android仿微信选择图片和拍照功能

 更新时间:2016年11月28日 16:43:55   作者:志向远大  
这篇文章主要为大家详细介绍了Android仿微信选择图片和拍照功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了 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();

5.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>

6调用android.support.v4.app.LoaderManager.class类里面的LoaderCallbacks方法,等加载完成后给mImageAdapter设置数据。

mImageAdapter.setData(images);

7.当允许拍照的时候,显示拍照按钮,调用系统相机功能。

 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);
    }
   }
  }
 }

本文已被整理到了《Android微信开发教程汇总》,欢迎大家学习阅读。

源码下载:http://xiazai.jb51.net/201611/yuanma/AndroidselectPicture(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android Volley扩展实现支持进度条的文件上传功能

    Android Volley扩展实现支持进度条的文件上传功能

    这篇文章主要为大家详细介绍了Android Volley扩展实现文件上传与下载功能,支持进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 使用Android WebSocket实现即时通讯功能

    使用Android WebSocket实现即时通讯功能

    即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易实现。本文通过实例代码给大家分享Android WebSocket实现即时通讯功能,一起看看吧
    2019-10-10
  • Android Retrofit2数据解析代码解析

    Android Retrofit2数据解析代码解析

    这篇文章主要介绍了Android Retrofit2数据解析代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Android Canvas drawText文字居中的一些事(图解)

    Android Canvas drawText文字居中的一些事(图解)

    这篇文章主要给大家介绍了关于Android Canvas drawText文字居中的一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Android实现水平带刻度的进度条

    Android实现水平带刻度的进度条

    这篇文章主要为大家详细介绍了Android实现水平带刻度的进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android操作SQLite基本用法

    Android操作SQLite基本用法

    这篇文章主要介绍了Android操作SQLite基本用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果

    Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果

    这篇文章主要介绍了Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果,需要的朋友可以参考下
    2017-07-07
  • Android 百度地图Sha1获取的方法

    Android 百度地图Sha1获取的方法

    这篇文章主要介绍了Android 百度地图Sha1获取的方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • 详解Android使用@hide的API的方法

    详解Android使用@hide的API的方法

    这篇文章主要介绍了详解Android使用@hide的API的方法的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Android实现页面跳转

    Android实现页面跳转

    这篇文章主要为大家详细介绍了Android实现页面跳转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论