Cordova插件无法正常工作。

16

澄清编辑: 以下一些文件中看到的<name>实际上并不是文件的一部分,而是包含了我必须屏蔽的公司名字。

测试环境:

  • Cordova 4
  • OS X Yosemite
  • Android 4.4 设备 (通过 USB 连接)
  • 使用终端;不使用 Eclipse

发生了什么事: 使用 cordova run --release 成功构建和签署了 .apk 文件,并且移动设备也成功安装和打开它,但是插件全部无法工作。例如:

    title.on('click', function() {
        if (!navigator.camera) {
            alert('no camera!');
        } else {
            navigator.camera.getPicture(function success(data) {
            // do something
            }, function error(data) {});
        }
    });

始终弹出“没有摄像头”的提示,这意味着Cordova没有向window.navigator对象添加camera对象。

以下是关于我的Cordova安装和一些XML文件的一些信息,据我所知,没有什么异常。请注意,不仅相机无法工作,我只是用它作为一个例子。

Cordova信息:

Node version: v0.10.29

Cordova version: 4.0.1-nightly.2014.9.29

Config.xml file: 

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.<name>.App" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name><name> Mini</name>
    <description>
        De <name> app voor je telefoon
    </description>
    <author email="stephan@<name>.nl" href="https://<name>.nl">
        Het <name> Team
    </author>
    <content src="index.html" />
    <access origin="*" />
    <preference name="SplashScreen" value="screen" />
    <preference name="SplashScreenDelay" value="2000" />
</widget>


Plugins: 

org.apache.cordova.camera,org.apache.cordova.dialogs,org.apache.cordova.file,org.apache.cordova.file-transfer,org.apache.cordova.media,org.apache.cordova.media-capture,org.apache.cordova.splashscreen,org.apache.cordova.vibration

Android platform:

Available Android targets:
----------
id: 1 or "android-19"
     Name: Android 4.4.2
     Type: Platform
     API level: 19
     Revision: 4
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
 Tag/ABIs : default/armeabi-v7a, default/x86

cordova/config.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.<name>.App" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name><name> Mini</name>
    <description>
        De <name> app voor je telefoon
    </description>
    <author email="stephan@<name>.nl" href="https://<name>.nl">
        Het <name> Team
    </author>
    <content src="index.html" />
    <access origin="*" />
    <preference name="SplashScreen" value="screen" />
    <preference name="SplashScreenDelay" value="2000" />
</widget>
cordova/platforms/android/AndroidManifest.xml<
?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="com.kaartje2go.App" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="CordovaApp" android:theme="@android:style/Theme.Black.NoTitleBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.VIBRATE" />
</manifest>

Cordova 平台/Android/res/xml/config.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.<name>.App" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <preference name="loglevel" value="DEBUG" />
    <feature name="Camera">
        <param name="android-package" value="org.apache.cordova.camera.CameraLauncher" />
    </feature>
    <feature name="Notification">
        <param name="android-package" value="org.apache.cordova.dialogs.Notification" />
    </feature>
    <feature name="File">
        <param name="android-package" value="org.apache.cordova.file.FileUtils" />
        <param name="onload" value="true" />
    </feature>
    <feature name="FileTransfer">
        <param name="android-package" value="org.apache.cordova.filetransfer.FileTransfer" />
    </feature>
    <feature name="Media">
        <param name="android-package" value="org.apache.cordova.media.AudioHandler" />
    </feature>
    <feature name="Capture">
        <param name="android-package" value="org.apache.cordova.mediacapture.Capture" />
    </feature>
    <feature name="SplashScreen">
        <param name="android-package" value="org.apache.cordova.splashscreen.SplashScreen" />
    </feature>
    <feature name="Vibration">
        <param name="android-package" value="org.apache.cordova.vibration.Vibration" />
    </feature>
    <name><name> Mini</name>
    <description>
        De <name> app voor je telefoon
    </description>
    <author email="stephan@<name>.nl" href="https://<name>.nl">
        Het <name> Team
    </author>
    <content src="index.html" />
    <access origin="*" />
    <preference name="SplashScreen" value="screen" />
    <preference name="SplashScreenDelay" value="2000" />
</widget>
3个回答

52

清单:您的插件是否已加载?

  • 您的index.html是否加载了cordova.js脚本?(例如,如果您有www/index.html那么您可以直接引用cordova.js。该文件不在www目录中,而是由Cordova自动生成并插入到您的应用程序中)
  • 插件JavaScript是否已加载?使用Chrome或Safari远程调试您的Android / iOS应用程序。
  • cordova plugin ls:您的插件是否已列出?
  • plugins/android.json:您的插件是否已列出?
  • platforms/android/assets/www是否具有所有文件?(即带有脚本的plugins文件夹,cordova_plugins.js应提到您的插件,平台特定的cordova.js

如果所有脚本都就位,您能否侦听deviceready事件以检查Cordova是否初始化?


3
这个人很棒。我看了很多旧版的 Cordova 教程,它们很混乱,因为它们都不同(Cordova 的结构似乎经常改变),我认为 cordova.js 不再需要添加了,因为我找不到它。我假设它会在构建过程中自动添加。最后,我发现问题出在这里。我将 cordova.js 添加到我的 index.html 中,一切正常运作! - Stephan Bijzitter
1
这真的帮了我很多。之前一直在苦苦思索为什么它不起作用,简直要把头发都拔光了! - Jason
1
我已经使用 cordova plugin add <plugin> 命令添加了插件,但是当我运行 cordova plugin ls 命令时,返回的结果为空,并且我的插件文件夹也是空的。你有任何想法是为什么吗? - Roman
谢谢,我不知道我怎么会忽略了cordova.js文件的包含。因为许多其他的cordova功能似乎都正常工作,所以我被误导认为相机插件有问题。 - Protongun
我该如何检查插件JavaScript是否正常工作?在Chrome上没有任何错误,但在iPhone模拟器上,cordova相机插件无法正常工作。 - I am a registered user

3

如果您的插件无法使用,您也可以尝试以下步骤:

cordova plugin list;
cordova plugin remove my-cordova-plugin --save;
cordova plugin add my-cordova-plugin --nosave;

还要注意以下插件依赖关系:

  1. filefile-transfercamera插件都依赖于compat插件;因此,compat需要最后删除。
  2. file-transfer插件依赖于file,因此需要先删除file

0
今天我学到了另一个导致这个问题的原因:确保你的项目中没有第二个名为cordova.js的文件,无论在哪里。如果Cordova插件管理器发现包含此类文件作为标签,它可能会错误地假定你自己的文件基路径是Cordova的cordova.js的基路径,并将其用作加载自己JS文件的基路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接