当我拍照时,我的“错误”是toast直接显示,为什么没有创建文件?

发布于 2025-01-14 04:14:33 字数 3908 浏览 2 评论 0原文

我正在问一个新问题,如果它已经存在,请原谅我一次又一次地搜索,但我没有找到任何东西。

我的代码在 API28 模拟器上完美运行,但一旦我在 API29 模拟器及更高版本上运行它,它就不起作用......

你能帮助我吗?

CameraUtils.java

public static File getNewFile() {
   
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyCameraApp");

        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("MyCameraApp", "Failed to create directory");
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;

        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "IMG_"+ timeStamp + ".jpg");

        return mediaFile;
    }

CameraFragment.java 我只向您展示“btnTakePicture.setOnCLick ....

btnTakePicture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnTakePicture.setEnabled(false);
                AnimUtils.animateBtnTakePhoto(btnTakePicture);

                File file = CameraUtils.getNewFile();

                ImageCapture.OutputFileOptions outputFileOptions =
                        new ImageCapture.OutputFileOptions.Builder(file).build();

                imageCapture.setTargetRotation(CameraUtils.getDisplayRotation(requireContext()));
                imageCapture.setFlashMode(flashMode);
                imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(requireContext()),
                        new ImageCapture.OnImageSavedCallback() {
                            @RequiresApi(api = Build.VERSION_CODES.M)
                            @Override
                            public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                                MediaScannerConnection.scanFile(requireContext(),
                                        new String[]{file.toString()}, null, null);

                                btnTakePicture.setEnabled(true);

                                switch (typeAction) {
                                    case CameraFragment.ACTION_MESSAGE:
                                        Intent intent = new Intent(requireContext(), PhotoMessageActivity.class);
                                        intent.putExtra(PhotoMessageActivity.IMG_URI, file.getPath());
                                        intent.putExtra(ChatActivity.UID, uidReceiver);
                                        startActivity(intent);
                                        break;
                                    case CameraFragment.ACTION_STATUS:
                                        startActivity(new Intent(requireContext(), AddNewStoryPhotoActivity.class)
                                        .putExtra("IMG_URI", file.getPath()));
                                        break;
                                    case CameraFragment.ACTION_UPDATE_PICTURE:
                                        CropImage.cropMiniatureFromFragment(Uri.fromFile(new File(file.getPath())),
                                                requireContext(), CameraFragment.this);
                                        break;
                                }
                            }

                            @Override
                            public void onError(@NonNull ImageCaptureException exception) {
                                btnTakePicture.setEnabled(true);
                                Toast.makeText(requireContext(), "Error taking photo", Toast.LENGTH_SHORT).show();
                            }
                        });
            }
        });

我的代码适用于 API 29 模拟器,但一旦我的代码在 API29 和 API30 模拟器上进行测试,它就不再适用。

I'm asking a new question, if it already exists, please excuse me I searched again and again but I didn't find anything.

My code works perfectly on the API28 emulator but as soon as I run it on the API29 emulator and above, it doesn't work...

Can you help me ?

CameraUtils.java

public static File getNewFile() {
   
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyCameraApp");

        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("MyCameraApp", "Failed to create directory");
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;

        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "IMG_"+ timeStamp + ".jpg");

        return mediaFile;
    }

CameraFragment.java
I only show you the "btnTakePicture.setOnCLick....

btnTakePicture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnTakePicture.setEnabled(false);
                AnimUtils.animateBtnTakePhoto(btnTakePicture);

                File file = CameraUtils.getNewFile();

                ImageCapture.OutputFileOptions outputFileOptions =
                        new ImageCapture.OutputFileOptions.Builder(file).build();

                imageCapture.setTargetRotation(CameraUtils.getDisplayRotation(requireContext()));
                imageCapture.setFlashMode(flashMode);
                imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(requireContext()),
                        new ImageCapture.OnImageSavedCallback() {
                            @RequiresApi(api = Build.VERSION_CODES.M)
                            @Override
                            public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
                                MediaScannerConnection.scanFile(requireContext(),
                                        new String[]{file.toString()}, null, null);

                                btnTakePicture.setEnabled(true);

                                switch (typeAction) {
                                    case CameraFragment.ACTION_MESSAGE:
                                        Intent intent = new Intent(requireContext(), PhotoMessageActivity.class);
                                        intent.putExtra(PhotoMessageActivity.IMG_URI, file.getPath());
                                        intent.putExtra(ChatActivity.UID, uidReceiver);
                                        startActivity(intent);
                                        break;
                                    case CameraFragment.ACTION_STATUS:
                                        startActivity(new Intent(requireContext(), AddNewStoryPhotoActivity.class)
                                        .putExtra("IMG_URI", file.getPath()));
                                        break;
                                    case CameraFragment.ACTION_UPDATE_PICTURE:
                                        CropImage.cropMiniatureFromFragment(Uri.fromFile(new File(file.getPath())),
                                                requireContext(), CameraFragment.this);
                                        break;
                                }
                            }

                            @Override
                            public void onError(@NonNull ImageCaptureException exception) {
                                btnTakePicture.setEnabled(true);
                                Toast.makeText(requireContext(), "Error taking photo", Toast.LENGTH_SHORT).show();
                            }
                        });
            }
        });

My code works with API 29 emulators, but as soon as my code is tested on an API29 and API30 emulator it no longer works.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文