Cordova - 解决调用camera相机插件时数组越界问题(getFileNameFromUri)
作者:hangge | 2021-09-07 11:20
一、问题描述
最近给一个集成了 Cordova 的 Android 项目添加个摄像头插件(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)