Android调用相机与相册的方法

  • 操作流程
    • 点击拍摄
      • 效果图
    • 点击相册选择
      • 效果图
    • 拒绝权限的情况
      • 效果图
  • 功能实现
    • 项目配置
      • 1.先在项目根目录的build.gradle的repositories添加:
      • 2.在build.gradle(:app)的dependencies添加:
      • 3.添加提示dialog样式
      • 4.添加底部dialog样式
        • 底部dialog弹出动画(dialog_in_anim.xml)
        • 底部dialog关闭动画(dialog_out_anim.xml)
      • 5.添加权限
      • 6.在AndroidManifest.xml中添加剪切activity活动
    • 代码实现
      • DialogManager.java
      • dialog_bottom_menu.xml
      • activity_main.xml
      • MainActivity.java
        • 不使用剪切框(点击拍摄直接替换)
        • 使用方形图片方法
        • 多选图片
          • 效果图
  • demo下载
  • ~~~~~~~~~~~~~~~~~~~
  • 如有遗漏或有任何问题可添加博主微信反馈

操作流程

点击拍摄

点击头像(我这里使用的是ImageView控件),然后点击拍摄,去申请权限,允许则打开相机 拍摄 然后进去裁剪框 选取合适的位置合适的大小 点击√,即设置成功

效果图

点击相册选择

点击头像,点击相册选择,允许权限则进去图库,选择图片 截取图片,设置成功

效果图

拒绝权限的情况

点击禁止则无操作,勾选禁止后不再提示,则弹出自定义dialog提示框,点击取消即关闭dialog,点击去设置则进入应用设置页面

效果图

功能实现

项目配置

1.先在项目根目录的build.gradle的repositories添加:

allprojects {repositories {...maven { url "https://jitpack.io" }}
}

【注意】切记不要跳过这一步,因为XUI目前只发布在jitpack平台上,跳过这一步会导致ERROR: Failed to resolve: com.github.xuexiangjys:XUI:x.x.x错误!!!

2.在build.gradle(:app)的dependencies添加:

 // 裁剪相关implementation 'com.github.yalantis:ucrop:2.2.6'// XUI dialog相关implementation 'com.github.xuexiangjys:XUI:1.1.9'implementation 'com.github.xuexiangjys.XUtil:xutil-core:2.0.0'// 权限相关implementation 'com.yanzhenjie:permission:2.0.2'// 加载图片implementation 'com.github.bumptech.glide:glide:4.13.1'

3.添加提示dialog样式

如果使用弹出提示的XUI自定义dialog则需要在AndroidManifest.xml中application的主题添加样式

添加以下样式:

<style name="Theme.HeadPhotoTest" parent="XUITheme.Phone"><!-- 自定义自己的主题样式 --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:textAllCaps">false</item></style>

然后Ctrl点进colors.xml添加以下属性:

<color name="colorPrimary">#2196F3</color>
<color name="colorPrimaryDark">#121C4C</color>
<color name="colorAccent">#2196F3</color>

4.添加底部dialog样式

如果需要使用底部弹出dialog则需要在AndroidManifest.xml在application的主题中添加以下样式代码:

 <!-- dialog样式 --><style name="DialogTheme" parent="@android:style/Theme.Dialog"><!-- 边框 --><item name="android:windowFrame">@null</item><!-- 是否浮现在activity之上 --><item name="android:windowIsFloating">true</item><!-- 半透明 --><item name="android:windowIsTranslucent">true</item><!-- 无标题 --><item name="android:windowNoTitle">true</item><item name="android:background">@android:color/transparent</item><!-- 背景透明 --><item name="android:windowBackground">@android:color/transparent</item><!-- 模糊 --><item name="android:backgroundDimEnabled">true</item><!-- 遮罩层 --><item name="android:backgroundDimAmount">0.5</item></style><!-- dialog的动画 --><style name="main_menu_animStyle"><item name="android:windowEnterAnimation">@drawable/dialog_in_anim</item><item name="android:windowExitAnimation">@drawable/dialog_out_anim</item></style>

底部dialog弹出动画(dialog_in_anim.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="300"android:fromXDelta="0"android:fromYDelta="1000"android:toXDelta="0"android:toYDelta="0" />
</set>

底部dialog关闭动画(dialog_out_anim.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="300"android:fromXDelta="0"android:fromYDelta="0"android:toXDelta="0"android:toYDelta="1000" />
</set>

5.添加权限

AndroidManifest.xml中加入以下权限代码:

 <!-- 请求拍摄权限--><uses-permission android:name="android.permission.CAMERA" /><!-- 读写设备照片及文件--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

6.在AndroidManifest.xml中添加剪切activity活动

如果用到剪切功能需要添加,不用剪切功能则不需要添加

 <activityandroid:name="com.yalantis.ucrop.UCropActivity"android:screenOrientation="portrait"android:theme="@style/Theme.AppCompat.Light.NoActionBar" />

代码实现

DialogManager.java

package top.gaojc.util;import android.content.Context;
import android.content.Intent;
import android.net.Uri;import com.xuexiang.xui.widget.dialog.DialogLoader;import static com.xuexiang.xutil.app.ActivityUtils.startActivity;public class DialogManager {// 请求权限对话框public static void permissionDialog(Context myContext, String str) {DialogLoader.getInstance().showConfirmDialog(myContext, "提示", str, "去设置",(dialog, which) -> {//引导用户到设置中去进行设置Intent intent = new Intent();intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");intent.setData(Uri.fromParts("package", myContext.getPackageName(), null));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);dialog.dismiss();},"取消",(dialog, which) -> {dialog.dismiss();});}
}

dialog_bottom_menu.xml

底部dialog:dialog_bottom_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"android:orientation="vertical"><TextViewandroid:id="@+id/tv_take_photo"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="拍摄"android:textColor="@android:color/background_dark"android:textSize="16sp" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@android:color/darker_gray" /><TextViewandroid:id="@+id/tv_take_pic"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="相册选择"android:textColor="@android:color/background_dark"android:textSize="16sp" /><Viewandroid:layout_width="match_parent"android:layout_height="5dp"android:background="@android:color/darker_gray" /><TextViewandroid:id="@+id/tv_cancel"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="取消"android:textColor="@android:color/background_dark"android:textSize="16sp" /></LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"tools:context=".MainActivity"><ImageViewandroid:id="@+id/img"android:layout_width="90dp"android:layout_height="90dp"android:layout_gravity="center"android:background="@drawable/img"/></FrameLayout>

MainActivity.java

package top.gaojc;import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.request.RequestOptions;
import com.gaojc.top.util.DialogManager;
import com.yalantis.ucrop.UCrop;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;import java.io.File;import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.content.FileProvider;public class MainActivity extends Activity {private ImageView img;public static final int REQUEST_CODE_CAMERA = 103; //相机public static final int REQUEST_CODE_ALBUM = 102; //相册private Uri photoUri;//记录图片地址private Context context = MainActivity.this;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);img = findViewById(R.id.img);img.setOnClickListener(v -> {// 底部dialogshowBottomDialog();});}// 判断是否有相机权限private void ifHaveCameraPermission() {/*** AndPermission.hasPermissions:判断是否有相对应的权限*      Permission.Group.CAMERA:摄像权限*/if (!AndPermission.hasPermissions(this, Permission.Group.CAMERA)) {/*** AndPermission:引用权限相关库*      onGranted:允许权限*      onDenied:拒绝权限*/// 动态申请权限AndPermission.with(this).runtime().permission(Permission.Group.CAMERA).onGranted(permissions -> {openCamera();}).onDenied(denieds -> {if (denieds != null && denieds.size() > 0) {for (int i = 0; i < denieds.size(); i++) {if (!shouldShowRequestPermissionRationale(denieds.get(i))) {DialogManager.permissionDialog(this, "没有拍摄和录制权限!");break;}}}}).start();} else {// 有权限 打开相机openCamera();}}// 打开相机private void openCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// Build.VERSION.SDK_INT:获取当前系统sdk版本if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {// 适配Android 7.0文件权限,通过FileProvider创建一个content类型的UriString fileName = String.format("fr_crop_%s.jpg", System.currentTimeMillis());File cropFile = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName);photoUri = FileProvider.getUriForFile(this, this.getPackageName() + ".FileProvider", cropFile);//7.0} else {photoUri = getDestinationUri();}// android11以后强制分区存储,外部资源无法访问,所以添加一个输出保存位置,然后取值操作intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(intent, REQUEST_CODE_CAMERA);}// 判断是否有文件存储权限private void ifHaveAlbumPermission(Activity activity) {//  Permission.Group.STORAGE:文件存储权限if (!AndPermission.hasPermissions(activity, Permission.Group.STORAGE)) {// Request permissionAndPermission.with(activity).runtime().permission(Permission.Group.STORAGE).onGranted(permissions -> {openAlbum();}).onDenied(denieds -> {if (denieds != null && denieds.size() > 0) {for (int i = 0; i < denieds.size(); i++) {if (!activity.shouldShowRequestPermissionRationale(denieds.get(i))) {DialogManager.permissionDialog(activity, "没有访问存储权限!");break;}}}}).start();} else {openAlbum();}}// 打开相册private void openAlbum() {Intent intent = new Intent();// intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);//支持多选图片intent.setType("image/*");intent.setAction("android.intent.action.GET_CONTENT");intent.addCategory("android.intent.category.OPENABLE");startActivityForResult(intent, REQUEST_CODE_ALBUM);}@RequiresApi(api = Build.VERSION_CODES.Q)@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {switch (requestCode) {case REQUEST_CODE_ALBUM:doCrop(data.getData());break;case REQUEST_CODE_CAMERA:doCrop(photoUri);break;case UCrop.REQUEST_CROP:// 加载圆形图片Glide.with(context).load(UCrop.getOutput(data)).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(img);
//                    Glide.with(context).load(UCrop.getOutput(data)).into(img);//方形图像break;}}if (resultCode == UCrop.RESULT_ERROR) {final Throwable cropError = UCrop.getError(data);}}// 裁剪方法private void doCrop(Uri data) {UCrop.of(data, getDestinationUri())//当前资源,保存目标位置.withAspectRatio(1f, 1f)//宽高比.withMaxResultSize(500, 500)//宽高.start(this);}private Uri getDestinationUri() {String fileName = String.format("fr_crop_%s.jpg", System.currentTimeMillis());File cropFile = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName);return Uri.fromFile(cropFile);}private void showBottomDialog() {// 使用Dialog、设置stylefinal Dialog dialog = new Dialog(this, R.style.DialogTheme);// 设置布局View view = View.inflate(this, R.layout.dialog_bottom_menu, null);dialog.setContentView(view);Window window = dialog.getWindow();// 设置弹出位置window.setGravity(Gravity.BOTTOM);// 设置弹出动画window.setWindowAnimations(R.style.main_menu_animStyle);// 设置对话框大小window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);dialog.show();dialog.findViewById(R.id.tv_take_photo).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 判断是否有相机权限ifHaveCameraPermission();dialog.dismiss();}});dialog.findViewById(R.id.tv_take_pic).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 判断是否有文件存储权限ifHaveAlbumPermission((Activity) context);dialog.dismiss();}});dialog.findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dialog.dismiss();}});}
}

不使用剪切框(点击拍摄直接替换)

把这个剪切方法注释掉,onActivityResult回调中的代码修改为以下方式即可

使用方形图片方法

圆形图片代码注释,方形图像取消注释即可

多选图片

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
效果图

demo下载

演示demo下载

~~~~~~~~~~~~~~~~~~~

如有遗漏或有任何问题可添加博主微信反馈

Android调用相机与相册的方法相关推荐

  1. android调用相机与相册的方法,Android打开相机和相册实例代码

    本文实例为大家分享了Android打开相机和相册具体代码,供大家参考,具体内容如下 打开相机 /** * 选择相机 */ private void showCamera() { // 跳转到系统照相机 ...

  2. android调用相机与相册的方法,手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0之后获取URI(兼容多版本)...

    Android中调用系统相机来拍摄照片的代码,以下:html 一.首先设置Uri获取判断以及相机请求Codejava public final int TYPE_TAKE_PHOTO = 1;//Ur ...

  3. android 相机和相册,[转载][转载] android调用相机和相册

    很多同学在做客户端的时候,都需要做上传图片,那么上传图片如何上传呢?自己写一个SurfaceView做为展示区,然后用camera类来实现?太out了!直接调用相机拍照获取或者调用相册来取照片才是王道 ...

  4. 适配android7.0 miui,Android调用相机、相册、裁剪(适配7.0和MIUI系统)

    实现设置头像功能的具体步骤 创建实现功能的视图界面 设置权限(android 6.0以上需要动态申请) 选择拍照或者相册选择图片 选择图片后的进行裁剪(看需求) 裁剪完后对结果进行处理(设置到界面.上 ...

  5. Android—显示窗口调用相机与相册

    关于Android点击头像显示窗口调用相机与相册 主要有七步: 点击事件,窗口初始化,点击回调事件,对照片裁剪,裁剪照片保存,声明FileProvider,编写FileProvider的xml文件 1 ...

  6. Android调用相机,录像,相册

    Android调用相机,录像,相册 调用相机 录像的调用 相册 我们在安卓开发过程中,可能会遇到需要用到照片的情况,今天就说一下如何使用相机,相册这些系统软件的调用方法 调用相机 首先我们将权限添加 ...

  7. uni-app 调用相机或相册图片并转为base64格式上传图片

    1.调用相机或相册上传图片 uni.chooseImage({count: 1, // 最多可以选择的图片张数sizeType: ['original', 'compressed'], // 可以指定 ...

  8. android 默认浏览器 视频播放 二维码,Android调用系统默认浏览器访问的方法

    一.启动android默认浏览器 这样子,android就可以调用起手机默认的浏览器访问. 二.指定相应的浏览器访问 1.指定android自带的浏览器访问 ( "com.android.b ...

  9. 苹果手机 和安卓手机调用相机和相册

    苹果手机 和安卓手机调用相机和相册

最新文章

  1. Java TreeMap 源码解析
  2. Navicat for SQL Server 文件属性有哪些
  3. python~文件遍历命令:glob、os.walk
  4. 回归树与基于规则的模型(part2)--简单回归树
  5. LiteOS调测利器:backtrace函数原理知多少
  6. SpringBoot部署Jar文件,瘦身优化指南!
  7. 插入,冒泡,选择,快速,归并,堆排序,java 泛型实现
  8. php课后题,知到PHP语言程序设计课后习题答案
  9. 台式计算机内存是什么问题,台式电脑提示内存不足怎么回事
  10. 使用Atlas进行元数据管理之Glossary
  11. 大数据抗疫的“洪荒之力”:多地政府借力大数据技术,多家企业上马大数据产品...
  12. PDF转CAD格式步骤再简单
  13. 【EM算法】小波域隐马尔科夫树模型参数的EM算法估计MATLAB仿真
  14. 自带作弊功能的老虎机--一样会让你输光,呵呵
  15. it是什么行业?具体又包括哪些细分领域呢?
  16. SpringBoot 使用freemarker 处理文档,找不到文件位置(报错:basePackagePath=““ /* relatively to resourceLoaderClass pkg)
  17. 目标检测:速度和准确性比较(Fater R-CNN,R-FCN,SSD,FPN,RetinaNet和YOLOv3)
  18. 计算机毕业设计Java国漫论坛网站(源码+系统+mysql数据库+Lw文档)
  19. python输入一个英文句子、统计并输出单词数_C语言实现输入多行英文句子然后统计单词数和行数,如何输入?我的代码问题在哪里?...
  20. 大数据——Flink dataStream 中窗口函数的使用

热门文章

  1. 东莞横沥塑料模具设计与制造的主要工艺流程
  2. 华为云计算学习:FusionManager之ManageOne
  3. 快页堡垒机:企业IT运维的“安全守护神”
  4. 迅速用Github展开团队协作
  5. 怎么把avi转成mp4格式?
  6. 西部数据php一键安装,【贪狼某道1.60特色服务端】WD某道1.60一键安装客户端带GM管理工具[附视频搭建教程]...
  7. 会计学子就业前景分析
  8. GPIO实验之c语言
  9. 学术论文下载网站、国内pip下载镜像,GAN研究汇总
  10. 数据结构-链表及相关算法