先贴出Google官方文档:Google官方拍照文档

感觉讲的不是很细,有不少坑。

先看需要配置权限和provider

  <!--拍照存储权限--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><!--拍照权限--><uses-permission android:name="android.permission.CAMERA" />
 <!--拍照需要配置provider为了兼容Android 7.0 下面的authorities里面的值需要和拍照里面的provider一样,下面这段代码Uri photoUri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".xiayiye5", photoFile);--><providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.xiayiye5"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"></meta-data></provider>

再看下file_path文件如何写的

<?xml version="1.0" encoding="utf-8"?>
<paths><!--    配置拍照图片存储路径为: 包名/files/Pictures--><external-pathname="my_images"path="Android/data/cn.xiayiye5.xiayiye5library/files/Pictures" />
</paths>

当然还有一个万能路径写法待研究:感谢此博主:万能路径写法

<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="external"path="." /><external-files-pathname="external_files"path="." /><cache-pathname="cache"path="." /><external-cache-pathname="external_cache"path="." /><files-pathname="files"path="." />
</paths>
————————————————
版权声明:本文为CSDN博主「Huc_Boy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liu_xueping/article/details/103980700

好了activity页面开始拍照了

public void dispatchTakePictureIntent(Activity activity) {if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA)) {//拍照方法Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {File photoFile = null;try {photoFile = createImageFile(activity);} catch (IOException ex) {ex.printStackTrace();}if (photoFile != null) {Uri photoUri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".xiayiye5", photoFile);takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);activity.startActivityForResult(takePictureIntent, TakePhotoActivity.REQUEST_IMAGE_CAPTURE);}}} else {//提示用户开户权限   拍照和读写sd卡权限String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};ActivityCompat.requestPermissions(activity, perms, 10010);}}

再看下activity页面回调

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {//拍照后的图片回调DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int screenWidth = dm.widthPixels;Bitmap decodeFile = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath());int width = decodeFile.getWidth();int size = width / screenWidth;BitmapFactory.Options newOpts = new BitmapFactory.Options();newOpts.inJustDecodeBounds = false;//设置缩放比例newOpts.inSampleSize = size * 2;Log.e("打印缩放比例", size + "");//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了Bitmap bitmap = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath(), newOpts);ivTakePhoto.setImageBitmap(bitmap);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == 10010) {boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;if (cameraAccepted) {//权限申请成功Toast.makeText(this, "activity页面权限申请成功!", Toast.LENGTH_LONG).show();// 调用拍照方法TakePhotoUtils.getInstance().dispatchTakePictureIntent(this);} else {//用户授权拒绝之后,友情提示一下就可以了Toast.makeText(this, "activity页面请开启应用拍照权限!", Toast.LENGTH_LONG).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}

再看下在fragment中拍照只需要注意两点

看下在fragment中拍照的方法

public void dispatchTakePictureIntent(Fragment fragment) {if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(fragment.getContext(), android.Manifest.permission.CAMERA)) {//拍照方法Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (takePictureIntent.resolveActivity(fragment.requireActivity().getPackageManager()) != null) {File photoFile = null;try {photoFile = createImageFile(fragment.requireActivity());} catch (IOException ex) {ex.printStackTrace();}if (photoFile != null) {Uri photoUri = FileProvider.getUriForFile(fragment.requireActivity(), fragment.requireActivity().getPackageName() + ".xiayiye5", photoFile);takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//在fragment页面拍照需要使用fragment中的startActivityForResult,不然不会走fragment中的回调fragment.startActivityForResult(takePictureIntent, TakePhotoActivity.REQUEST_IMAGE_CAPTURE);}}} else {//提示用户开户权限   拍照和读写sd卡权限String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};//在fragment中申请权限时候需要使用fragment中的requestPermissions方法不然不会走fragment中的回调fragment.requestPermissions(perms, 10010);}}

再看下在fragment中的回调

 @Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);if (requestCode == TakePhotoActivity.REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {//在fragment中拍照后的回调DisplayMetrics dm = new DisplayMetrics();requireActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);int screenWidth = dm.widthPixels;Bitmap decodeFile = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath());int width = decodeFile.getWidth();int size = width / screenWidth;BitmapFactory.Options newOpts = new BitmapFactory.Options();newOpts.inJustDecodeBounds = false;//设置缩放比例newOpts.inSampleSize = size * 2;Log.e("打印缩放比例", size + "");//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了Bitmap bitmap = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath(), newOpts);ivTakePhoto.setImageBitmap(bitmap);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//在fragment中申请权限后的回调if (requestCode == 10010) {boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;if (cameraAccepted) {//权限申请成功Toast.makeText(requireActivity(), "fragment页面权限申请成功!", Toast.LENGTH_LONG).show();// 调用拍照方法TakePhotoUtils.getInstance().dispatchTakePictureIntent(this);} else {//用户授权拒绝之后,友情提示一下就可以了Toast.makeText(requireActivity(), "fragment页面请开启应用拍照权限!", Toast.LENGTH_LONG).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}

Activity拍照源码:activity拍照

Fragment拍照源码:fragment拍照

拍照工具类源码:拍照工具类

Android开发之在Fragment和Activity页面拍照需要注意的地方相关推荐

  1. android中viewpager+fragment,Android开发之ViewPager+Fragment

    使用步骤 1.Activity的布局文件 android:id="@+id/viewpager" android:layout_width="wrap_content&q ...

  2. Android开发之多Fragment切换优化

    前言: 有时候Activity里面或者大Fragment里面切换小fragment的时候,会出现卡顿现象,尤其是小fragment装载数据较多的时候.此时,对fragment切换处理也能优化切换的速度 ...

  3. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  4. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

    今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可以 ...

  5. Android透明到白色滑动渐变,Android开发之Activity全透明渐变切换方法

    Activity全透明渐变切换 类似于Dialog的显示动画效果一样 1. 先设置Acitivity为去透明,在取消掉Activity默认的切换动画 true @color/colorPrimary ...

  6. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

  7. android md5加密登录,Android开发之MD5加密

    将字符串进行MD5加密,返回加密后的字符串 public static String encode(String password) { try { StringBuffer sb = new Str ...

  8. Android开发之BroadcastReceiver

    Android开发之BroadcastReceiver BroadcastReceiver介绍 广播的种类 标准广播(Normal Broadcast) 有序广播(Ordered Broadcast) ...

  9. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

最新文章

  1. python嵌套循环跳出_如何跳出嵌套的while循环
  2. 送书 | 一本针对零基础 AI 学习的书:Python入门到人工智能实战
  3. Android 开发 关于APP无法安装到Android模拟器上的问题
  4. : 字符向量未正常终止_文本挖掘从小白到精通(一)---语料、向量空间和模型的概念...
  5. array转list_Java面试题Array和ArrayList有何区别?
  6. SQL Server数据库查询sql去掉小数后点后末尾的0
  7. 问道虚拟机服务器地址,问道1.60.0905虚拟机手工启动服务端+配套客户端+启动教程+充值注册软件+配套工具...
  8. .vue文件怎么使用_手机技巧:被人忽视OTG功能怎么使用?复制文件到U盘的新方法...
  9. 类似QQ截图工具的snipaste
  10. mp-mtgsig 美团iOS 签名逆向工程分析
  11. Python生成图文并茂PDF报告
  12. flex fills
  13. 过去七年,美国护照排名从榜首滑落至第7位
  14. T5 根据派生类写出基类(Java) (10分)
  15. 乐高编程学c语言吗,乐高编程和少儿编程的区别
  16. 【指纹识别】基于模板匹配算法实现指纹录入打卡系统附matlab代码
  17. 手机上发表csdn博客
  18. vue el-element中el-select的el-option选中值,但页面框中不显示值,需要输入一个其他框值才显示,input同理
  19. 摒弃盗版,让我们拥有正版,给你最实用的软件。有效的优化
  20. 解决mybatisPlus插入数据主键突然很大

热门文章

  1. 哇,居然可以用这种烙铁头拆元器件!!!
  2. Linux 网页挂马实验,网页挂马详细教程
  3. 会议容易中吗_运放电路设计中容易出现的细节问题,你都搞懂了吗?
  4. grep 两个字符串_文本搜索神器Grep
  5. PHP秒杀截流原理,流量新大陆:巧借PC、移动端评论截流,让精准流量“爆起来”...
  6. server.xml拒绝访问 无法修改
  7. 指向类的数据成员和函数指针
  8. 怎样设计一个良好大数据处理的解决方案?
  9. ANSI,ASCII,Unicode的区别与联系!
  10. 用最小二乘法拟合任意次函数曲线(C#)