返回 导航

Cordova

hangge.com

Cordova - 解决调用camera相机插件时数组越界问题(getFileNameFromUri)

作者:hangge | 2021-09-07 11:20

一、问题描述 

    最近给一个集成了 CordovaAndroid 项目添加个摄像头插件(cordova-plugin-camera),当页面调用该插件打开相机时直接报如下错误:
2021-08-31 11:24:19.634 2911-3149/com.frontier.ptmo.app E/PluginManager: Uncaught exception from plugin
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
        at org.apache.cordova.camera.CordovaUri.getFileNameFromUri(CordovaUri.java:97)
        at org.apache.cordova.camera.CordovaUri.<init>(CordovaUri.java:51)
        at org.apache.cordova.camera.CameraLauncher.takePicture(CameraLauncher.java:302)
        at org.apache.cordova.camera.CameraLauncher.callTakePicture(CameraLauncher.java:281)
        at org.apache.cordova.camera.CameraLauncher.execute(CameraLauncher.java:189)
        at org.apache.cordova.CordovaPlugin.execute(CordovaPlugin.java:98)
        at org.apache.cordova.PluginManager.exec(PluginManager.java:132)
        at org.apache.cordova.CordovaBridge.jsExec(CordovaBridge.java:59)
        at org.apache.cordova.engine.SystemExposedJsApi.exec(SystemExposedJsApi.java:41)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:336)
        at android.os.Looper.loop(Looper.java:184)
        at android.os.HandlerThread.run(HandlerThread.java:67)

二、问题原因

(1)开启 debug 模式,定位到 CordovaUri.java 里的 getFileNameFromUri 方法,可以看到 fullUri 路径是“content://com.frontier.ptmo.app.provider/ext_cache/.Pic.jpg”,使用"external_files"分割后取索引为 1 的元素自然会出现数组越界错误。

(2)查看 Android 项目的 AndroidManifest.xml 文件内容,发现里面有两个 android:authorities="${applicationId}.provider",一个是 Cordova 相机插件用到的,另一个是项目其他插件使用的,从而造成冲突。
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

<!-- Cordova 相机插件 -->
<provider
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true"
    android:name="org.apache.cordova.camera.FileProvider">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/camera_provider_paths" />
</provider>

三、解决办法

方法1:修改原 Cordova 项目后再重新生成 Android 项目 

(1)修改插件的 plugin.xml 文件:

(2)将 ${applicationId}.provider 改成 ${applicationId}.camera.provider

(3)接着修改插件的 CameraLauncher.java 文件:

(4)将里面的 .provider 改成 .camera.provider

(5)然后删除 Andorid 平台项目文件,重新生成:
cordova platform rm android
cordova platform add android

方法2:直接修改 Android 项目

(1)有时我们可能对 Andorid 项目做了许多改动,不想要重新再生成的话,也可以直接修改 Andorid 项目。首先修改项目的 AndroidManifest.xml 文件,将 ${applicationId}.provider 改成 ${applicationId}.camera.provider
<!-- Cordova 相机插件 -->
<provider
    android:authorities="${applicationId}.camera.provider"
    android:exported="false"
    android:grantUriPermissions="true"
    android:name="org.apache.cordova.camera.FileProvider">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/camera_provider_paths" />
</provider>

(2)接着修改插件的 CameraLauncher.java 文件,将里面的 .provider 改成 .camera.provider
评论

全部评论(0)

回到顶部