Cordova Android Camera-给出非法参数异常

Posted

技术标签:

【中文标题】Cordova Android Camera-给出非法参数异常【英文标题】:Cordova Android Camera- giving illegal argument exception 【发布时间】:2017-07-19 01:17:05 【问题描述】:

我在 2 个月前开始进行 Cordova android 编程。一切都很好,主要是现在不工作的相机。但是上周我的项目目录如何被删除,我重新安装了cordova的所有插件和已编译的项目,但现在它在相机点击上显示错误“非法参数异常”,令人惊讶的是我没有更改单行代码,它也可以正常工作在其他开发者机器上。

cordova 插件添加 cordova-plugin-camera 从相机插件安装中使用的命令。

camera_app.js 文件

var pictureSource; // picture source
var destinationType; // sets the format of returned value


// Wait for device API libraries to load
//
document.addEventListener("deviceready", onDeviceReady, false);

// device APIs are available
//
function onDeviceReady() 
    pictureSource = navigator.camera.PictureSourceType;
    destinationType = navigator.camera.DestinationType;




// Called when a photo is successfully retrieved
//
function onPhotoURISuccess(imageURI) 
    // largeImage.src = imageURI;
    console.log(imageURI);
    console.log(document_type);




function getPhoto(docType) 
    // Retrieve image file location from specified source
    document_type = docType
    $('.docError').hide();
    navigator.camera.getPicture(onPhotoURISuccess, onFail, 
        quality: 50,
        destinationType: destinationType.FILE_URI
    );



$('#file1').click(function() 
    console.log('On camera click');
    getPhoto("addressProof");
);

我尝试调试代码最终发现这是由于提供程序路径- java.lang.IllegalArgumentException:缺少 android.support.FILE_PROVIDER_PATHS 元数据

但我已经在 Android xml 文件中添加了提供程序路径元数据,因为它会在您添加 cordova 插件时自动添加。

 <provider android:authorities="$applicationId.provider" android:exported="false" android:grantUriPermissions="true" android:name="android.support.v4.content.FileProvider">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
        </provider>

cordova 插件 -

cordova-plugin-app-version 0.1.9 "AppVersion" 科尔多瓦插件相机 2.4.1 “相机” 科尔多瓦插件兼容 1.1.0 “兼容” 科尔多瓦插件白名单 1.3.2 “白名单” cordova-sqlite-storage 1.4.9 “Cordova s​​qlite 存储插件” ionic-plugin-keyboard 2.2.1 “键盘”

cordova 平台-

已安装平台: 安卓 6.2.3 可用平台: blackberry10 ~3.8.0(已弃用) 浏览器~4.1.0 webos ~3.7.0 windows ~5.0.0

NPM 版本- npm: '3.10.3', 战神:'1.10.1-DEV', http_parser: '2.7.0', 重症监护室:'57.1', 模块:'48', 节点:'6.4.0', openssl: '1.0.2h', 紫外线:'1.9.1', v8: '5.0.71.60', zlib: '1.2.8'

【问题讨论】:

您是否尝试过删除并重新添加 thr android 平台?这绝对不是插件问题,因为我在他们的官方错误跟踪器中没有看到任何与此相关的问题。更多的环境问题 cordova-android 版本?科尔多瓦 CLI 版本? @jcesarmobile 科尔多瓦 7.0.1 版 您的 config.xml 中的 cordova-plugin-camera 条目如何? @Gandhi 谢谢。以后我会一直照顾它的。 【参考方案1】:

这是非常简单和基本的。只需将您的文件提供程序添加到您的科尔多瓦启动器活动中即可。在我的情况下,我有一些自定义活动,并且错误地在所有活动的底部添加了提供者,我的猜测是科尔多瓦无法读取该提供者,这就是它给出的原因 java.lang.IllegalArgumentException:缺少 android.support.FILE_PROVIDER_PATHS 元数据

【讨论】:

但是您提到自工作副本以来您没有在项目中进行任何代码更改。那么自定义活动从何而来?您还提到了 android 清单文件是正确的 @Gandhi 作为 android 开发人员,我认为曾经在清单代码中声明提供程序并从任何地方读取它,但在科尔多瓦不是这样。你可以在你的项目中尝试一下,看看会发生什么。 android 构建时自动生成的清单文件。所以永远不会调整它来测试任何东西。您本可以提前发布 androidmanifest 文件 add your file provider below to your cordova launcher activity 的真正含义是什么?我是科尔多瓦的初学者 @beginner 这意味着不要更改清单中的任何内容。 Android Manifest 在 cordova 应用程序中自动生成。【参考方案2】:

我今天遇到了类似的问题。尝试了一切(重新安装插件,从源代码重新安装插件,重新安装旧版本的插件)但似乎没有任何帮助。 不知道为什么但是之后 - 杀死模拟器 - >科尔多瓦清洁机器人 - > 科尔多瓦平台删除 android -->cordova平台添加android - > 科尔多瓦构建 android - 连接我的设备 - > 科尔多瓦运行 android 它像以前一样再次工作:-) 我仍然不知道为什么。 试一试,风险自负。也许有帮助。

【讨论】:

【参考方案3】:

确保您的 Android 虚拟设备模拟器有一个前置和后置摄像头设置! 我也有同样的错误,删除和添加平台不起作用。

Sidenote: For the Emulator to work, you need to have him already open and then you could run your Debug APK from Android Studio 3.3 or run `ionic cordova run android`.

什么工作:打开 Android 虚拟设备管理器(Android Studio -> 配置 -> AVD 管理器)

操作 -> 编辑(铅笔图标)

显示高级设置

确保您确实添加了前置和后置摄像头!在此设置之前是“无”,所以这不起作用,我得到了上面的错误。添加相机后,一切正常。

希望这会帮助像我这样的人,他们配置了没有摄像头的 AVD。

【讨论】:

【参考方案4】:

有两种方法可以解决问题。

    AndroidManifest.xml (Package= / ApplicationId) 中的提供程序名称可能不匹配

    第二种方式在你的 build.gradle (app) 文件中

    release ... minifyEnabled false ...

【讨论】:

【参考方案5】:

在“CameraLancher.java”中将 applicationId 更改为应用程序包 id 后它正在工作

public void takePicture(int returnType, int encodingType)
    
        // Save the number of images currently on disk for later
        this.numPics = queryImgDB(whichContentStore()).getCount();

        // Let's use the intent and see what happens
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        // Specify file so that large image is captured and returned
        File photo = createCaptureFile(encodingType);
        this.imageFilePath = photo.getAbsolutePath();
        this.imageUri = FileProvider.getUriForFile(cordova.getActivity(),
                "com.package-id" + ".cordova.plugin.camera.provider", ---->> your app package id
                photo);

【讨论】:

以上是关于Cordova Android Camera-给出非法参数异常的主要内容,如果未能解决你的问题,请参考以下文章

android cordova-plugin-camera 在 PNG 上添加黑色背景

Cordova Camera Plugin Android 将额外信息附加到 FILE_URI 的末尾

PhoneGap 2.3:Cordova 拍照 API (camera.getPicture) API 返回 onDestory

(IOS) Cordova Camera Plugin 引用已删除的图像

Cordova Android - 相机没有所有选项

需要从cordova插件-android调用js函数