如果你是在fragment里头调用的拍照,出了bug 可以查看 这篇文章 点我 不懂的可以留言。

这篇博客对于7.0的版本的修改。主要是在文件存储的处理。

6.0、8.0版本使用本文的存储文件会出现  java.io.FileNotFoundException: No such file or directory  找不到文件夹

至于怎么做版本适配大家可以度娘一下,我这个问题往后我处理好放在博客给大家看看还有什么不足的,还请指点。

本次修改的地方是使用了第三方的截图开源框架  uCrop,解决了一些机型剪辑图片时gg了。原因一个就是,Android自带的截图有点坑啊(应该是我用不好的原因)毕竟别人的框架也是基于系统的所提供嘛。

这边先说明一下uCrop的使用,再往下看就是拍照功能的实现

1、添加依赖走起   -->app.gradle

implementation 'com.yalantis:ucrop:1.4.1'

-->build.gradle  (Project)

allprojects {repositories {google()jcenter()maven { url "https://jitpack.io" }  //添加的是这句}
}

2、申请activity,这个并不是说你自己去创建一个,你看清楚他的包名,uCrop是作者的喔。

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

3、开搞啦。这里直接使用代码就可以,截图跳转到UCropActivity

        UCrop uCrop = UCrop.of(uri, cropUri);  //第一参数是处理图片你的文件的路径,第二个参数就是存放剪辑后的路径
        UCrop.Options options = new UCrop.Options();
        //设置裁剪图片可操作的手势
        options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
        //是否隐藏底部容器,默认显示
        options.setHideBottomControls(true);
        //设置toolbar颜色
        options.setToolbarColor(ActivityCompat.getColor(activity, R.color.colorPrimary));
        //设置状态栏颜色
        options.setStatusBarColor(ActivityCompat.getColor(activity, R.color.colorPrimary));
//        //是否能调整裁剪框
//        options.setShowCropFrame(true);
        options.setCompressionFormat(Bitmap.CompressFormat.JPEG);

        //UCrop配置
        //设置裁剪图片的宽高比,比如1:1  你自己随意
        uCrop.withAspectRatio(1, 1);
        uCrop.withMaxResultSize(250,250);
        uCrop.withOptions(options);
        //uCrop.useSourceImageAspectRatio();
        //跳转裁剪页面
        uCrop.start(getContext(),this,CODE_RESULT_REQUEST);
//start 方法中提供几种方式

        也就是说你在fragment、activity  都可以使用,其中fragment也做了一个适配
            你在fragment中调用也没有问题的。 参数使用的话,点击去看一下源码就知道怎么用了。

4、看下uCrop的效果

旋转

              

5、截图后的显示

然后进入我们的主题。

//拍照
private void showCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, REQUEST_CAMERA);

}
//保存图片路径
private void saveUrl() {file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/test/" + System.currentTimeMillis() + ".jpg");
    file.getParentFile().mkdirs();

    uri = FileProvider.getUriForFile(this, "com.example.cnb.cemera.fileprovider", file);
}
//权限申请以及开启  下面有一段新的权限申请,至于版本适配大家还是得自己去写
public void applyWritePermission() {String[] permissions = {android.Manifest.permission.WRITE_EXTERNAL_STORAGE};
    if (Build.VERSION.SDK_INT >= 23) {int check = ContextCompat.checkSelfPermission(this, permissions[0]);
        // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
        if (check == PackageManager.PERMISSION_GRANTED) {//调用相机
            showPhoto();
        } else {requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }} else {showPhoto();
    }
}
    //这一段新的权限申请/**

/**
 *
 * @param selectFun 请求码,对应的功能,拍照 || 图库选取
 */
public void applyWriteAndReadPermission(int selectFun) {if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {//如果灭有权限
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, selectFun);
                                                                                                   //requestCode
    } else {showPhoto();
    }
}
//权限返回
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {showPhoto();
    } else {// 没有获取 到权限,从新请求,或者关闭app
        Toast.makeText(this, "需要存储权限", Toast.LENGTH_SHORT).show();
    }
}
    //activity返回
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) {Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri contentUri = Uri.fromFile(file);
            mediaScanIntent.setData(contentUri);
            sendBroadcast(mediaScanIntent);
            String path = this.getExternalCacheDir().getPath();

            cropRawPhoto(uri);
        } else if (requestCode == CODE_RESULT_REQUEST) {//在手机相册中显示刚拍摄的图片

            if (data == null) {return;
            }Bundle extras = data.getExtras();
            if (extras != null) {bm = extras.getParcelable("data");
            }
//            sendImage(bm);
            img.setImageBitmap(bm);
        }}
    //裁剪图片  使用第三方框架uCrop 进行编辑,
    public void cropRawPhoto(Uri uri) {  //这个uri是拍照后保存下来的图片文件路径Log.e("url", uri + "-------");
        File cropFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/test/crop_" + System.currentTimeMillis() + ".jpg");
        cropFile.getParentFile().mkdirs();
        Uri cropUri = FileProvider.getUriForFile(getContext(), "com.example.cnb.superschool.fileprovider", cropFile);
        UCrop uCrop = UCrop.of(uri, cropUri);
        UCrop.Options options = new UCrop.Options();
        //设置裁剪图片可操作的手势
        options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
        //是否隐藏底部容器,默认显示
        options.setHideBottomControls(true);
        //设置toolbar颜色
        options.setToolbarColor(ActivityCompat.getColor(activity, R.color.colorPrimary));
        //设置状态栏颜色
        options.setStatusBarColor(ActivityCompat.getColor(activity, R.color.colorPrimary));
//        //是否能调整裁剪框
//        options.setShowCropFrame(true);
        options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
        //UCrop配置
        //设置裁剪图片的宽高比,比如1:1  你自己随意
        uCrop.withAspectRatio(1, 1);
        uCrop.withMaxResultSize(250, 250);
        uCrop.withOptions(options);
        //uCrop.useSourceImageAspectRatio();
        //跳转裁剪页面
        uCrop.start(getContext(), this, CODE_RESULT_REQUEST);

    }
//裁剪图片  系统自带的图片剪辑
public void cropRawPhoto(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");

    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 200);
    intent.putExtra("outputY", 200);
    intent.putExtra("return-data", true);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    startActivityForResult(intent, CODE_RESULT_REQUEST);
}
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.cnb.cemera.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths"/>
</provider>
<?xml version="1.0" encoding="utf-8"?>
<resources>
  
<external-path
    name="external_files"
    path="." />

</resources>

复制以上的代码一般就可以运行了啦。

捋一捋处理思路

首先android6.0 以上 都需要 权限申请,

如果权限已经开启,那么执行拍照功能。否则判断用户是否要开启该权限

开启/关闭 权限都后会有一个权限返回结果,那么,返回中去判断权限是否开启,开启则进行拍照

接着,拍照功能开启,确定后保存图片路径,返回到onActivityResult 根据requestCode 来判定

是哪一个功能的返回,在判断为拍照功能里头添加剪辑。

最后轮到剪辑功能,跳转到剪辑页面,需要的设置他们的参数,也就是截取的比例,完成后返回到onActivityResult

判断是不是剪辑功能的返回值,设置图片显示。

这个图片显示需要转换成bitmap,获取data之后转成bitmap

Bundle extras = data.getExtras();
if (extras != null) {             bm = extras.getParcelable("data");
}
img.setImageBitmap(bm)

android7.0以后 需要通过获取路径来获取图片。

新建一个xml文件夹,然后新建一个xml文件,名字随意。可以返回上面代码看一下

android7.0 拍照以及图片剪辑--(再次修改)相关推荐

  1. android 做分享到朋友圈,android7.0实现分享图片到朋友圈功能

    android7.0实现分享图片到朋友圈功能 发布时间:2020-08-29 00:46:50 来源:脚本之家 阅读:132 作者:十个雨点 本文实例为大家分享了android实现分享图片到朋友圈功能 ...

  2. Android之本地相册图片选取和拍照以及图片剪辑

    转载请注明出处:http://blog.csdn.net/loveyaozu/article/details/51160482 相信有很多Android开发人员在日常开发中,由于项目需求,需要我们的A ...

  3. Android7.0 拍照 选择照片 权限 实现

    参考链接: http://blog.csdn.net/hu5080126/article/details/53738625 http://www.jianshu.com/p/ba57444a7e69 ...

  4. android7 sd fix,Android7.0拍照失败FileUriExposedException,你的拍照代码升级了吗

    背景: SamSung SM-N9006 Android5.0在应用中拍照之后,无法获取拍照之后的数据,报错FileUriExposedException 思路: 参考官方文档对该错误的解释,是由于出 ...

  5. Android7.0相机图册图片剪切封装 - ucrop框架

    说明: * 两天使用 ucrop框架 实现了从相册和图册选择图片,然后剪切返回显示的功能.同时兼容了相机拍照7.0. * 对相机调用.相册调用.图片剪切封装成了工具类. * 剪切图片框架ucrop我也 ...

  6. android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...

    这里主要是基于Android 7.0,Nougat 实现一个获取相机拍照的图片后,使用FileProvider把图片转换为实际的路径. 首先需要在AndroidManifest.xml声明调用相机的权 ...

  7. android 7.0原生动态,Android7.0适配教程,心得

    Android7.0发布已经有一个多月了,Android7.0在给用户带来一些新的特性的同时,也给开发者带来了新的挑战,这几天我将应用适配到Android7.0,其中也遇到了不少问题也踩了一些坑,在这 ...

  8. Android打开相册vs拍照获取图片的原理实现

    前言:这几天在做用户登陆注册的逻辑时,遇到了要修改用户的头像问题的解决.在此把实现的原理以及实现过程中遇到的问题分享个大家...留下些许脚印 在手机的app里我们常常可用看到在个人中心页面有修改头像的 ...

  9. Android7.0以上如何获取头像(拍照或者从相册中选择)

    大概的流程 动态权限管理 创建布局文件,这里不多说了 拍照的实现 2.1创建存放图片的文件夹 2.2将文件夹路径转换为uri 2.3隐式启动相机的Activity,uri作为intent的一个参数. ...

最新文章

  1. 云计算之路-阿里云上:RDS用户的烦恼
  2. Microsoft SQL Server 查询表中有重复列值的数据 (PARENTGOODSID列值重复的行)?
  3. ToolBarManager可任意选择你想要的菜单
  4. 详解随机神经网络结构搜索 (SNAS)
  5. Java 动态代理介绍及用法
  6. 自定义注解 实现自定义消息_实现自定义的未来
  7. Apple Swift编程语言新手教程
  8. SQL Server 使用Detach和Attach 方式 移动数据库位置
  9. 华为非对等通信小实验
  10. Find n‘th number in a number system with only 3 and 4
  11. Queue--队列(c语言简单实现)
  12. 依据BaiduHack多线程爬取攻击点url和网站url,保存至txt
  13. 简单的TCP回射服务
  14. 苹果Mac怎样切换大写输入法?
  15. Nifi 数据流整合工具
  16. 创业的几条至理名言,每条对创业者都大有帮助,值得收藏!
  17. laravel从入门到精通之 php excel设置单元格边框只显示竖条
  18. U盘制作ubuntu18.04.6系统安装盘
  19. zabbix-邮件报警配置
  20. Linux(1) 概要、安装 、文件系统基本认知

热门文章

  1. 原来吃香蕉有这么多好处
  2. 认识微型计算机常见i o接口教案,微型计算机由( )、( ) 、 I/O 接口以及连接他们的总线组成。...
  3. 用c语言设计个人所得税的程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  4. js语音播报功能(1)
  5. 仿真3. 仿真系统的设计思路
  6. 总结:动态规划(1) 基础题型,动规五部曲
  7. VMware 虚拟机硬盘扩容
  8. Eclipse 21 款插件介绍
  9. The specified key byte array is 136 bits which is not secure enough for any JWT HMAC-SHA algorithm.
  10. IIS专家蜘蛛监控系统