Android调用系统, 任意比例裁剪图片

2023-05-16

废话不多说,直接上代码
核心代码:

/**
 * 跳转到系统裁剪图片页面
 * @param imagePath 需要裁剪的图片路径
 */
private void cropPic(String imagePath) {
    File file = new File(imagePath);
     Intent intent = new Intent("com.android.camera.action.CROP");
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
         intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         Uri contentUri = FileProvider.getUriForFile(this, "com.leon.crop.fileprovider", file);
         intent.setDataAndType(contentUri, "image/*");
     } else {
         intent.setDataAndType(Uri.fromFile(file), "image/*");
     }
     intent.putExtra("crop", "true");
     intent.putExtra("aspectX", 0.1);
     intent.putExtra("aspectY", 0.1);
     intent.putExtra("outputX", 150);
     intent.putExtra("outputY", 150);
     intent.putExtra("return-data", true);
     intent.putExtra("scale", true);
     startActivityForResult(intent, CROP_PHOTO);
 }

进入到裁剪页面, 可以自由选择裁剪的比例:
图片裁剪

代码如下:

public class MainActivity extends AppCompatActivity {

    public final int CROP_PHOTO = 10;
    public final int ACTION_TAKE_PHOTO = 20;
    private ImageView ivImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //显示图片的imageview
        ivImage = (ImageView) findViewById(R.id.ivImage);
        //点击跳转拍照
        findViewById(R.id.btnPhoto).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takePhoto();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        File mPhotoFile = new File(getAppFile(this, "images/user_take.jpg"));
        switch (requestCode) {
            case CROP_PHOTO: //裁剪照片后
                if (data != null) {
                    Bitmap bitmap = data.getExtras().getParcelable("data");
                    ivImage.setImageBitmap(bitmap);
                }
                //裁剪后删除拍照的照片
                if (mPhotoFile.exists()) {
                    //noinspection ResultOfMethodCallIgnored
                    mPhotoFile.delete();
                }
                break;
            case ACTION_TAKE_PHOTO:
                if (mPhotoFile.exists()) {
                    cropPic(getAppFile(this, "images/user_take.jpg"));
                }
                break;
        }
    }

    /**
     * 拍照
     */
    private void takePhoto() {
        try {
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            File file = new File(getAppFile(this, "images"));
            File mPhotoFile = new File(getAppFile(this, "images/user_take.jpg"));
            if (!file.exists()) {
                file.mkdirs();
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(this, "com.pandaq.pandaeye.fileprovider", mPhotoFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
            } else {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPhotoFile));
            }
            startActivityForResult(intent, ACTION_TAKE_PHOTO);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取本应用在系统的存储目录
     */
    public static String getAppFile(Context context, String uniqueName) {
        String cachePath;
        if ((Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable())
                && context.getExternalCacheDir() != null) {
            cachePath = context.getExternalCacheDir().getParent();
        } else {
            cachePath = context.getCacheDir().getParent();
        }
        return cachePath + File.separator + uniqueName;
    }


    /**
     * 跳转到系统裁剪图片页面
     * @param imagePath 需要裁剪的图片路径
     */
    private void cropPic(String imagePath) {
        File file = new File(imagePath);
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(this, "com.leon.crop.fileprovider", file);
            intent.setDataAndType(contentUri, "image/*");
        } else {
            intent.setDataAndType(Uri.fromFile(file), "image/*");
        }
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 0.1);
        intent.putExtra("aspectY", 0.1);
        intent.putExtra("outputX", 150);
        intent.putExtra("outputY", 150);
        intent.putExtra("return-data", true);
        intent.putExtra("scale", true);
        startActivityForResult(intent, CROP_PHOTO);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android调用系统, 任意比例裁剪图片 的相关文章

  • 构建 gradle 系统应用程序作为 AOSP 构建的一部分

    我有一个基于 AOSP 的自定义 ROM 并且正在开发一个系统应用程序 该应用程序在 ROM 构建期间打包 就像任何其他系统应用程序一样 是否可以将此应用程序切换为 gradle 样式应用程序 并在 AOSP 构建期间使用 gradle 构
  • 如何在 Android 中从服务器检索数据时更新滚动的 ListView?

    目前 我正在使用 AsyncTask 来处理 Http 连接并以 JSON 格式检索数据 加载所有数据很简单 但会消耗太多时间 因此我决定使用一次加载 10 个项目LIMIT OFFSET mysql 接下来我设置事件onScroll为我的
  • Android Room 持久性库无法在库项目内工作

    我正在开发一个 Android 库 并希望在其中使用新的 Android Room 持久性库 但是 启动时我收到此错误 Caused by java lang RuntimeException cannot find implementat
  • Android FAB 图标始终为黑色,带有 MaterialComponents 主题

    我正在创建一个 Android 应用程序 并使用 AndroidX 库和 Material design 主题 我的应用程序主题为styles xml is 我有来自自定义库的以下 F
  • SysUtils:ApplicationStatus(WebView)中的ApplicationContext为空

    我可以在基于 WebView 的应用程序启动时看到一些奇怪的东西 它根本不影响应用程序 但我很好奇为什么会出现错误 没有任何崩溃 一切似乎都很好 但是错误 这是日志猫 Loading com google android webview v
  • 无法使用 Android 版 VLC 设置字幕

    启动 Android 版 VLC 的 VideoPlayerActivity 时 我在设置字幕位置时遇到问题 我的目标是 API 27 并使用 FileProvider 来允许访问文件 根据文档here https wiki videola
  • 更改首选项(设置)后,显示设置的文本不会更新

    我将尝试解释一个简单的应用程序场景 我的应用程序直接进入 主视图 在这个主视图中我插入了一个TextView它显示通过以下方式创建的当前设置PreferenceManager 为了简单起见 假设我的设置中有一个复选框 当我第一次启动我的应用
  • Android 开发应用程序密钥和应用程序秘密

    我正在尝试使用带氦气选项的城市飞艇为 Android 应用程序设置推送通知 但是 我需要为我的应用程序找到这些信息 但我不知道从哪里可以找到 任何意见或建议将不胜感激 谢谢你 For setting up Helium make sure
  • Android:使用 putExtra 从片段访问容器活动对象?

    我正在使用操作栏和片段构建选项卡界面 我需要帮助将数据从容器活动发送到片段 详细地说 我在容器活动中有作业对象 我根据工作对象中的信息创建了几个选项卡 如公司详细信息 经验详细信息等 我需要将作业对象传递给这些片段 以便它可以显示相应的信息
  • 通过使用 Intents 使用预装的 Google 地图而不是自己的 Activity?

    我只是想知道是否可以将地理坐标传递给谷歌地图应用程序之二意图或类似的东西 我自己编写了一个用于显示路线 坐标等的应用程序 但是让谷歌地图本身显示这些不是更优雅吗 我不知道这是否可能 但也许你们中的一个人可以回答这个问题 如果这是可能的 是否
  • 当互联网连接丢失时,不间断地读取输入流

    我使用异步任务来下载文件 它正常工作 直到我关闭我的 Android 的 wifi 连接 没有其他互联网连接 下载对话框仍然存在并且没有任何变化 当我检查日志时 我发现输入流的函数 read 不停顿 那么如何检查这个案例呢 这是我的代码 U
  • 如何以编程方式在 Genymotion 上刷新 zip

    我正在尝试将谷歌应用程序刷新到 genymotion 模拟器中 我可以使用拖放功能来完成此操作 但我的项目需要 google apps zip 已加载到 genymotion 机器中并且在内部闪烁 以避免与桌面交互 我检查过类似的问题thi
  • 如何画一个中间透明的圆

    我试图用以下代码绘制一个白色圆圈 mPaint setColor 0xFFFFFFFF canvas drawCircle x y radius mPaint 但它显示为固态磁盘 如何让它只显示为中心透明的圆形轮廓 我查看了帮助 这对我来说
  • 如何在 Android RecyclerView 中显示一组项目的日期/日期

    您好 我在 JSONArray 中获取数据如下 chatArray msg id 193 user id 15235 first name Vishal user name vishal13 message twilio chat time
  • AndroidJUnit4 测试未找到

    我像这样注释了我的课程 RunWith AndroidJUnit4 class public class WorkdayProviderTest 此外 还注释了我的测试方法 如下所示 Test public void insert data
  • 读取Android文件系统中的所有文件

    我正在编写一个Android mediaPlayer应用程序 所以我想扫描整个手机上的所有文件 即sd卡和手机内存 我可以从 SD 卡读取数据 但不能读取它的根目录 也就是说 我可以从路径中读取 sdcard folder 它工作得很好 但
  • 将自定义文件与我的 Android 应用程序关联

    我想将特定扩展名的文件 例如任何扩展名为 xyz 的文件 与我的应用程序关联 这意味着 当用户在文件资源管理器 或其他地方 如 gmail 驱动器等 中点击 SaveFile1 xyz 时 我的应用程序应该启动 并且文件的 Uri 将在 I
  • onDataChanged() 在 Android Wear 上未被调用

    我试图使用数据项将一些字符串发送到我的穿戴设备 但我的穿戴设备似乎从未收到任何信号 因为 onDataChanged 从未被调用 我什至设置了一个时间戳 以确保每次发送数据时始终不同 有没有特定的方法我必须将应用程序安装到两台设备上才能使其
  • Android Studio 不允许我更改 SDK 位置

    我打开 Android Studio 然后我打开 SDK 管理器 我拥有最新版本 但是我的 SDK 平台需要 Android 6 0 它甚至不让我点击任何东西 在此图像中 您可以看到文本和复选框变色 我无法单击 SDK 平台内的任何内容 甚
  • 查找手动注册(混淆)的本机函数地址

    我试图理解一个 Android 应用程序 其中包含一个名为foo在班上com app Bar 课堂内Bar有一个加载共享对象的静态子句System loadLibrary libfoo so 我认为是用它构建的 f可见性 隐藏 https

随机推荐

  • 解决linux更新apt软件源时报出GPG错误

    今天给树莓派换源 爆出N个这错误 W GPG error http mirrors neusoft edu cn raspbian raspbian wheezy InRelease The following signatures cou
  • C语言状态机学习笔记一

    出处 xff1a http www cnblogs com tangerious p 4565833 html 状态机的好处不用多说 xff0c 自己百度去 xff0c 但传统的编程模式 xff0c 无论是C语言 xff0c 或是硬件FPG
  • 单片机课设-60秒倒计时器

    proteus单片机实现60秒倒计时器 项目要实现的60s秒表倒计时器 xff0c 用 AT89C51单片机的定时 计数器 T0 产生一秒的定时时间 xff0c 实现 59 到 0秒的循环显示的功能 具体要求 xff1a 1 xff09 按
  • 位运算的操作(加减乘除、负数、乘方、1的个数)

    一 位运算相关规律 43 口诀 c 43 43 中的位运算相关规律总结和口诀 二 加减乘除 int add int num1 int num2 int temp do temp 61 num1 num2 不进位相加 xff1a 异或 num
  • PgSQL upsert批量查询插入或更新(insert select/on conflict do update踩坑记录)

    PGSQL数据库中根据唯一索引判断存在不存在 xff0c 存在则更新 xff0c 不存在就新增 xff0c 可以参考下的sql xff0c 注意其中的item type item type id item group item group
  • 程序员必备的11个Github优质项目

    GitHub 不仅仅是一个版本控制服务 xff0c 它还是一个了不起的内容资源 xff0c 从免费的电子书和教程 xff0c 到面试准备材料和 34 了不起 34 的文章 xff0c 应有尽有 如果你是经常访问GitHub的开发者 xff0
  • spring为什么要使用三级缓存来解决循环依赖?

    不用三级缓存 xff0c 用二级缓存能不能解决循环依赖 这里我先说一下前面没提到的细节 xff0c 那就是通过ObjectFactory获取的Bean可能是两种类型 xff0c 第一种就是实例化阶段创建出来的对象 xff0c 还是一种就是实
  • nginx事件模块

    1 模块依赖 2 基础数据结构 2 1 ngx event t struct ngx event s void data unsigned write 1 unsigned accept 1 used to detect the stale
  • Object.create(null)与let o = {}区别

    在阅读 vue 源码中 xff0c 会看到使用Object create null 来创建不带有属性的对象 为什么不使用let o 61 呢 xff1f 因为使用let o 61 xff0c 对象o还是继承Object xff0c 会继承O
  • javascript之字符串

    replace replace pattern replacement 字段说明pattern字符串或者具有Symbol replace方法的对象replacement可以是字符串或者函数 字符串时 xff0c 会替换pattern匹配的子
  • win10重装遇到的问题

    今天在重装win10系统时遇到几个问题 xff0c 折腾了一整天 win10计算机意外地重新启动或遇到错误 解决方法 1 在出现错误提示的界面中我们按 Shift 43 F10 打开命令提示符 2 在命令提示符中输入 cd oobe xff
  • Arduino IDE搭建ESP8266开发环境,开发包下载过慢解决方法

    Arduino IDE搭建ESP8266开发环境 xff0c 开发板管理器中下载过慢解决方法 方法一 xff1a 1 首选项 附加开发板管理器网址 xff1a http arduino esp8266 com stable package
  • CheckBox的使用(一):onCheckedChanged事件

    重写接口 public void onCheckedChanged CompoundButton buttonView boolean isChecked package com example androidtest import and
  • 指针与引用的关系

    c xff0b xff0b 中的引用与指针的区别 相同点 xff1a 1 都是地址的概念 xff1b 指针指向一块内存 xff0c 它的内容是所指内存的地址 xff1b 引用是某块内存的别名 区别 xff1a 1 指针是一个实体 xff0c
  • C&C++图形图像处理开源库

    Google三维APIO3D O3D 是一个开源的 WebAPI 用来在浏览器上创建界面丰富的交互式的 3D 应用程序 这是一种基于网页的可控3D标准 此格式期望真正的基于浏览器 xff0c 独立于操作系统之外 xff0c 并且支持主流的3
  • protobuf的ParseFromArray 解析失败的问题

    前段时间 xff0c 在解析定义的Message时 xff0c 总是提示解析失败 xff0c 刚开始以为是消息号与消息没有对应上 xff0c 检查后发现消息号与消息是对应的 后来发现消息的一个字段定义为required 但是没有赋值 xff
  • Incorrect number of FETCH variables

    在写存储过程 xff0c 运行后提示 Incorrect number of FETCH variables 原来是用游标select的字段数需要与fetch into的变量数一致 修改后的如下 xff1a DROP PROCEDURE I
  • phpStorm 2016.1 最新版激活方法

    新版激活方法 1 在线激活 最新 http 123 206 193 241 1017 http www 0 php com 1017 xff08 可用 xff0c 更新于 20170621 xff09 http idea singee77
  • Android EditText最大字数限制并提示

    public class MaxTextLengthFilter implements InputFilter private int mMaxLength 构造方法中传入最多能输入的字数 public MaxTextLengthFilte
  • Android调用系统, 任意比例裁剪图片

    废话不多说 直接上代码 核心代码 span class hljs javadoc 跳转到系统裁剪图片页面 span class hljs javadoctag 64 param span imagePath 需要裁剪的图片路径 span s