卧式纯绿 2024-03-29 17:04 采纳率: 62.1%
浏览 39
已结题

安卓开发调用摄像头软件闪退

最近在学习安卓开发的时候想用app调用手机摄像头,在网上找了很多强人的版本,最后选了一个和自己语言相同的java版本的,明明配置什么的都是一样的,代码也几乎相同,可就是在安装到手机上之后一点击“打开摄像头”的选项就会出现软件闪退,请大家帮忙看看是怎么回事??
file_paths.xml文件

img


AndroidManifest.xml文件

img

MainActivity.java文件
button部分的代码

img


onActivity部分的代码

img


最后附上我参照的博客
https://blog.csdn.net/Tir_zhang/article/details/130444401

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-29 17:04
    关注

    引自免费微信小程序:皆我百晓生

    在Android开发中,由于Google提供了一个名为ContextCompat的工具包来处理应用程序与系统权限之间的交互,因此我们可以轻松地在Java中检查、获取和修改相册应用中的照片或视频。以下是修复Android开发中摄像头软件闪退的方法:

    1. 检查和更新插件库:确保你的应用中加载了相关的相机库,例如androidx.camera, camera-view-core, 或者一个由Google提供的库如camera-extras-v4. 如果这些库过时或不兼容当前系统版本,可能会导致闪退。可以在Gradle项目的build.gradle文件中添加以下依赖:
    dependencies {
        implementation 'androidx.camera:camera:2.0.0'
    }
    
    1. 检查外部存储路径:确保在file_paths.xml文件中正确设置了允许访问手机存储的目录(通常是 /mnt/sdcard)。如果你在其他地方设置过路径,确保在添加外部存储前将其正确导入到代码中。
    <paths>
        <external-path name="my_images" path="/mnt/sdcard/my_images>" />
    </paths>
    
    1. 避免从根目录写入文件:在上述路径中,你需要确保移动至项目根目录之外,因为只有当用户选择图片或视频作为输出才能进行写入操作。可以使用以下代码跳转到特定位置:
    private static final String INPUT_PATH = "/mnt/sdcard";
    private static final String OUTPUT_PATH = INPUT_PATH + "/output_image.jpg";
    
    public void takePicture() {
        try {
            File inputPath = new File(INPUT_PATH);
            File outputPath = new File(OUTPUT_PATH);
    
            // 删除旧文件
            inputPath.delete();
    
            // 创建输入路径
            inputPath.mkdir();
    
            // 将选择的图像保存到内部存储
            File outputFile = new File(inputPath, outputPath.getName());
            FileOutputStream outputStream = new FileOutputStream(outputFile);
            outputImage.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
            outputStream.flush();
            outputStream.close();
    
            // 开启相机并显示图片
            Intent intent = new Intent( ACTION_IMAGE_CAPTURE );
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFile.getAbsolutePath());
    
            // 设置Intent,并提交给onActivityResult方法
            startActivityForResult(intent, REQUEST_TAKE_PHOTO);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    1. 处理文件权限问题:如果代码中引用了WRITE_EXTERNAL_STORAGE权限而未实现相应的代码,会导致意外的权限请求,进而引发闪退。例如:
    FileOutputPermission fileOutputPermission = new FileOutputPermission("/mnt/sdcard/output_image.jpg", MODE_WORLD_READABLE | MODE_WRITEABLE);
    int result = context.checkSelfPermission(FileOutputPermission.class, fileOutputPermission.name());
    if (result != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_TAKE_PHOTO);
    }
    
    @Override
    protected void onRequestPermissionsResult(int requestCode, String permissions[], int grantResults) {
        switch (requestCode) {
            case REQUEST_TAKE_PHOTO:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    takePicture();
                } else {
                    Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();
                }
                return;
        }
    }
    

    在这个示例中,我们首先通过getActivity().checkSelfPermission()获取所需的权限,然后检查结果是否为PackageManager.PERMISSION_GRANTED。如果许可被授予,则调用requestPermissions()向用户发起权限请求,并在请求成功后调用onRequestPermissionsResult()处理结果。

    以上步骤应该能解决Android开发中摄像头软件闪退的问题。若仍出现类似错误提示,请检查代码中的拍照或视频流操作逻辑以及权限授权设置。如果问题依然存在,请参考原博主博客提供的解决方案,可能需要考虑更复杂的情况,比如摄像头异常退出、重置拍照权限等。同时,定期升级第三方框架或库,以确保它们与最新系统的兼容性也是至关重要的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月17日
  • 已采纳回答 8月9日
  • 创建了问题 3月29日