Android 11 (R) 中捕获和裁剪图像

2023-12-02

根据 android R 隐私政策的变化,我想为 android R 设备执行捕获和裁剪图像功能。我尝试了下面的方法,但它保存了空文件(文件正在指定文件夹中创建,但大小为 0kb)。

我在用着Android 图像裁剪器库来裁剪图像。

public static File createImageFile(Context context) throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
    String imageFileName = "JPEG_" + timeStamp + ".jpg";

    File storageDir, image;

    if(SDK_INT >= Build.VERSION_CODES.Q){
        OutputStream outputStream;
        ContentResolver contentResolver = context.getContentResolver();
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, imageFileName);
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES +  File.separator + SD_FOLDER_NAME);
        Uri imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        outputStream = contentResolver.openOutputStream(Objects.requireNonNull(imageUri));
        Objects.requireNonNull(outputStream);
        storageDir = new File(Environment.DIRECTORY_PICTURES +  File.separator + SD_FOLDER_NAME);
    }else{
        storageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + SD_FOLDER_NAME);
    }

    if (!storageDir.exists()) {
        storageDir.mkdirs();
    }

    image = new File(storageDir, imageFileName);

    if (image.createNewFile()) {
        Log.d(TAG, ":Image file created");
    } else {
        Log.d(TAG, ":Image file not created");
    }
    return image;
}

以下是我的相机打开和拍摄功能:

 private void openCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri photoURI = null;
        try {
            fileUri = Utils.createImageFile(requireContext());
            if(SDK_INT >= Build.VERSION_CODES.Q)
                photoURI = FileProvider.getUriForFile(requireActivity(), requireActivity().getPackageName(), fileUri);
            else
                photoURI = FileProvider.getUriForFile(requireActivity(), requireActivity().getPackageName() + ".com.enrich.salonapp.provider", fileUri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(intent, REQUEST_CODE_CAMERA_PICTURE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PictureSelectorDialog.REQUEST_CODE_CAMERA_PICTURE && resultCode == Activity.RESULT_OK) {
            imageCapture.onImageCaptured(fileUri.getAbsolutePath(), false);
        } else if (requestCode == PictureSelectorDialog.REQUEST_CODE_GALLERY_PICTURE && resultCode == Activity.RESULT_OK) {
            if (FileUtils.getPath(getActivity(), data.getData()) == null) {
                imageCapture.onImageCaptured(data.getData().toString(), true);
            } else {
                imageCapture.onImageCaptured(FileUtils.getPath(getActivity(), data.getData()), false);
            }
        }

        this.dismissAllowingStateLoss();
    }

另外,我没有找到如何使用文件提供程序获取 URI。

if(SDK_INT >= Build.VERSION_CODES.Q)
                photoURI = FileProvider.getUriForFile(requireActivity(), requireActivity().getPackageName(), fileUri);

在看到多个答案、开发人员文档等等之后。我最终得到了下面的工作解决方案,希望这会对某人有所帮助。

Android清单

 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="29"/>

android:requestLegacyExternalStorage="true"

 <provider
     android:name=".util.GenericFileProvider"
     android:authorities="${applicationId}.provider.profile"
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/provider_paths"/>
 </provider>

图片选择对话框.java

public static final int REQUEST_CODE_CAMERA_PICTURE = 1232;
public static final int REQUEST_CODE_GALLERY_PICTURE = 1233;
private File fileUri;
private ImageCapture imageCapture;
private boolean isDenied = false;

private void openGallery() {
        Intent intent;
        intent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(Intent.createChooser(intent, getString(R.string.choose_from_gallery)), REQUEST_CODE_GALLERY_PICTURE);
    }

    private void openCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            Uri photoURI = null;
            try {
                fileUri = Utils.createImageFile(requireContext());
                photoURI = FileProvider.getUriForFile(requireContext(), BuildConfig.APPLICATION_ID + ".provider.profile", fileUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
            intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(intent, REQUEST_CODE_CAMERA_PICTURE);
    }



  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PictureSelectorDialog.REQUEST_CODE_CAMERA_PICTURE && resultCode == Activity.RESULT_OK) {
                imageCapture.onImageCaptured(fileUri.getAbsolutePath(), false);
        } else if (requestCode == PictureSelectorDialog.REQUEST_CODE_GALLERY_PICTURE && resultCode == Activity.RESULT_OK) {
            if (FileUtils.getPath(getActivity(), data.getData()) == null) {
                Uri uri = data.getData();
                ParcelFileDescriptor parcelFileDescriptor;
                try {
                    parcelFileDescriptor = requireContext().getContentResolver().openFileDescriptor(uri, "r");
                    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
                    Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
                    parcelFileDescriptor.close();

                    File tempFile = createImageFile(requireContext());

                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    image.compress(Bitmap.CompressFormat.JPEG, 100 , bos);
                    byte[] bitmapData = bos.toByteArray();

                    FileOutputStream fos = new FileOutputStream(tempFile);
                    fos.write(bitmapData);

                    imageCapture.onImageCaptured( tempFile.getAbsolutePath(), true);

                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                imageCapture.onImageCaptured(FileUtils.getPath(getActivity(), data.getData()), false);
            }
        }

        this.dismissAllowingStateLoss();
    }

public interface ImageCapture {
        void onImageCaptured(String path, boolean isGooglePhotoURI);
    }

实用程序.java

public static File createImageFile(Context context) throws IOException {
        String timeStamp = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS_FOR_IMAGE_NAMING, Locale.getDefault()).format(new Date());
        String imageFileName = "PROFILE_PICTURE_" + timeStamp;
        File image, storageDir;

        if (SDK_INT < Build.VERSION_CODES.Q) {
            storageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + YOUR_FOLDER_NAME);
            if (!storageDir.exists()) {
                storageDir.mkdirs();
            }
            image = new File(storageDir, imageFileName + ".jpg");
            image.createNewFile();
        } else {
            storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES + File.separator + YOUR_FOLDER_NAME);
            image = File.createTempFile(imageFileName, ".jpg", storageDir);
            String currentPhotoPath = image.getAbsolutePath();
        }

        return image;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 11 (R) 中捕获和裁剪图像 的相关文章

随机推荐

  • Svelte 3 中是否存在动态道具

    当我迭代动态组件时 例如
  • 成功部署后Az​​ure Web应用程序未更新

    我在 azure 上有一个托管 Web API 的 Web 应用程序 我在 Visuall Studio 上更新了代码 然后将更新推送到 Azure 上的 Web 应用程序 它说它正在成功更新 我尝试通过 git 和 ftp 发布 它在云上
  • 二叉搜索树中的有序后继者

    给定 BST 中的一个节点 如何找到下一个更高的密钥 一般方法取决于节点中是否有父链接 如果您存储父链接 然后你选择 如果当前节点有右子节点 则为右子节点的最左子节点 如果右孩子没有左孩子 那么右孩子就是你的顺序继承人 向上导航父祖先节点
  • 如何将数据聚合到范围(分桶)?

    我有一张像这样的桌子 id value 1 118 0 2 109 0 3 113 0 4 82 0 5 60 0 6 111 0 7 107 0 8 84 0 9 91 0 10 118 0
  • 寻求以更干净/更有效的方式将字符串与整数相关联

    我该如何改进这个 这种关系是一对一的并且在 1 5 上连续 所以我正在考虑使用枚举 但我不确定如何将字符串值与枚举值进行比较 如果有更好的方法可以做到这一点 请建议 Thanks private int evaluateWord Strin
  • Firebase 功能部署失败

    每当我部署 firebase 函数时 我都会收到以下错误 错误 解析函数触发器时发生错误 Error ERR PACKAGE PATH NOT EXPORTED No exports main defined in D Proyectos
  • 为什么 for(;;) 而不是 while(1) ? [复制]

    这个问题在这里已经有答案了 可能的重复 for 比 while TRUE 快吗 如果没有 人们为什么要使用它 为什么要用丑的for 语法而不是看起来稍微好一点的while true loop 没有什么优势可以for over while 1
  • 正则表达式匹配长度超过 5 个字符且具有两个连续数字的密码

    这就是我所拥有的 有人可以告诉我哪里错了吗 let sampleWord bana12 let pwRegex w 5 d 2 Change this line let result pwRegex test sampleWord cons
  • DexArchiveMergerException:无法合并 dex

    昨天从 2 3 3 版本更新 Android studio 3 0 后 我遇到了与 DexMergerException 相关的问题 其他人也发布了相关问题this 但在这个问题中 我想分析堆栈跟踪以找到相关的解决方案 因为我是这里的新手
  • 使用 excel 插件注册带有参数描述的 UDF

    我有一个带有 UDF 的插件getRegExResult 我想向该函数添加函数描述和参数描述 因此当用户安装插件 关闭 打开 Excel 几次并进入 插入函数 对话框时 他将能够找到带有参数描述的函数 同样被问到here 我找到了一个ans
  • JSF:使用 Icefaces 组件上传文件的问题

    我想得到FileUpload与 Icefaces 配合使用的功能ace 文件条目 but my fileUploadListener服务器上未调用 代码如下 xhtml 片段
  • 在Python中循环压缩列表

    我正在研究 python 中的 zip 函数 并在使用 for 循环时发现了一个问题 这是我的代码 list1 monday tuesday wednesday thursday list2 1 2 3 4 zipped list zip
  • Excel VBA:批量重命名工作表

    有没有办法在VBA中批量重命名工作表 就像是 sheets array 1 2 3 name array hep hey heppa 将工作表 1 2 3 命名为 hep hey 和 heppa 显然它不能直接工作 和一些实验选定的表不要带
  • 发送 QUERY 数据包时出错

    我试图将一些数据插入数据库 但出现此错误 发送 QUERY 数据包时出错 insertDeta conPat gt prepare insert into table1 data VALUES data insertDeta gt bind
  • 如何使用 postgres 将时间间隔转换为小时数?

    假设我有一个像这样的间隔 4 days 10 00 00 在 postgres 中 我如何将其转换为小时数 在本例中为 106 是否有函数或者我应该硬着头皮做类似的事情 extract days my interval 24 extract
  • 使用 NHibernate ISqlExceptionConverter 自定义异常

    我需要为 NHibernate 方言注册自定义异常 我已经实施并 注册了 ISqlExceptionConverter 如 NHibernate 测试中所示 但 当代码中抛出异常时 它不会被转换 我的转换代码 甚至不打电话 我的代码非常简单
  • 如何演示 sigma(i/2^i)<=2(i=1 到 n)

    如何证明以下不等式 sigma i 2 i lt 2 i 1 to n 如果我们看一下series然后它看起来像 我们认为总和的最大值为 n 无穷大 S 1 2 2 4 3 8 4 16 5 32 0 1 清楚地 S 2 1 4 2 8 3
  • Bootstrap下拉菜单点击后消失

    div class container div class dropdown col xs 8 div div
  • Jquery 如何使用美元符号? [复制]

    这个问题在这里已经有答案了 可能的重复 javascript中 符号的含义是什么 如果 Jquery 只是外部 javascript 代码 那么它如何使用美元符号 这不是要添加新的语法吗 只是一个普通变量 你可以做var 42
  • Android 11 (R) 中捕获和裁剪图像

    根据 android R 隐私政策的变化 我想为 android R 设备执行捕获和裁剪图像功能 我尝试了下面的方法 但它保存了空文件 文件正在指定文件夹中创建 但大小为 0kb 我在用着Android 图像裁剪器库来裁剪图像 public