uni-app 【报Bug】this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix); 部分机器闪退

uni-app 【报Bug】this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix); 部分机器闪退

示例代码:

/**
 * 拍照
 *
 * @param relationPath 文件相对路径,自定义,eg: /com.abc.hello/media/image
 * @param filePrefix   文件名称前缀,自定义,eg: ori_图片_
 * @param fileSuffix   文件名称后缀,自定义,eg: .jpg
 */
takePhoto() {
    console.log(this.isCanClick);
    if (!this.isCanClick) {
        return
    }
    this.isCanClick = false
    console.log(Number.parseInt(this.imageSize) , this.filePathList.length);
    if (Number.parseInt(this.imageSize) + (this.filePathList.length+1) > this.maxNum) {
        this.isCanClick = true
        this.showToast(`最大不能超过${this.maxNum}张`)
        return
    }
    let currentTime = new Date().getTime()
    if (this.audioPlayer == null) {
        // 创建内部音频上下文对象
        this.audioPlayer = uni.createInnerAudioContext();
        // 设置音频的源文件路径或URL
        this.audioPlayer.src = '../../static/voice/kaca.mp3';
        this.audioPlayer.onError((e) => {
            console.log(e, '213213');
        })
    }
    // // 播放音频
    this.audioPlayer.play();

    var relationPath = "/gzgasImages";
    var filePrefix = "gas_" + currentTime;
    var fileSuffix = ".jpg";
    this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix);
},

操作步骤:

点击拍照,部分机器闪退。

预期结果:

不闪退,兼容Android 9

实际结果:

点击拍照,部分机器闪退。

bug描述:

点击拍照,部分机器闪退。

示例图片 示例图片


更多关于uni-app 【报Bug】this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix); 部分机器闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 【报Bug】this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix); 部分机器闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app 中使用 this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix); 方法时,部分机器出现闪退问题,可能由多种原因引起。以下是一些可能的原因及其解决方案:


1. Android 权限问题

  • 原因: 部分 Android 设备上,调用相机或存储相关功能时,如果没有正确申请权限,可能会导致应用崩溃。
  • 解决方案:
    • 确保在 manifest.json 中配置了相机和存储权限:
      {
        "permission": {
          "android.permission.CAMERA": {},
          "android.permission.WRITE_EXTERNAL_STORAGE": {},
          "android.permission.READ_EXTERNAL_STORAGE": {}
        }
      }
      
    • 在代码中动态申请权限:
      uni.authorize({
        scope: 'scope.camera',
        success() {
          this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix);
        },
        fail() {
          uni.showToast({
            title: '请授权相机权限',
            icon: 'none'
          });
        }
      });
      

2. 参数传递问题

  • 原因: relationPathfilePrefixfileSuffix 参数传递错误或为空,可能导致方法调用异常。
  • 解决方案:
    • 检查参数是否正确传递,确保不为空:
      if (relationPath && filePrefix && fileSuffix) {
        this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix);
      } else {
        console.error('参数异常:relationPath, filePrefix, fileSuffix 不能为空');
      }
      

3. 组件未正确初始化

  • 原因: 如果 CustomPreview 组件未正确初始化或未挂载,调用 takePhoto 方法时会报错。
  • 解决方案:
    • 确保组件已正确挂载:
      this.$nextTick(() => {
        if (this.$refs.CustomPreview) {
          this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix);
        } else {
          console.error('CustomPreview 组件未找到');
        }
      });
      

4. 设备兼容性问题

  • 原因: 部分 Android 设备可能存在兼容性问题,尤其是低版本或定制化系统。
  • 解决方案:
    • 捕获异常并处理:
      try {
        this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix);
      } catch (error) {
        console.error('调用 takePhoto 方法失败:', error);
        uni.showToast({
          title: '拍照功能暂不可用',
          icon: 'none'
        });
      }
      
    • 测试不同设备,确认问题是否与特定设备相关。

5. CustomPreview 组件内部问题

  • 原因: CustomPreview 组件的 takePhoto 方法实现可能存在缺陷,导致部分设备闪退。
  • 解决方案:
    • 检查 CustomPreview 组件的 takePhoto 方法实现,确保逻辑正确。
    • 如果是原生插件,确认插件是否兼容目标设备。

6. 调试与日志

  • 原因: 无法直接定位问题。
  • 解决方案:
    • 使用 adb logcat 或 uni-app 的调试工具查看崩溃日志,定位具体错误。
    • takePhoto 方法前后添加日志,观察执行过程:
      console.log('开始调用 takePhoto 方法');
      this.$refs.CustomPreview.takePhoto(relationPath, filePrefix, fileSuffix);
      console.log('takePhoto 方法调用完成');
回到顶部