cordova插件的完成

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xff6060/article/details/79454438

cordova自己完成插件这件事在历时4天之后终于完成,期间真的是查阅各种资料,几经放弃。

首先在插件中包含jar包这件事上,就让我各种找办法解决,网上找的方法,写完之后,完全不能在ionic中使用。

后来从github下载的官网提供的带jar包的插件,还是会报错,报出几个xml文件找不到

cp: copyFileSync: could not write to dest file (code=ENOENT):/Users/mehdigriche/work/cam1/test/platforms/android/res/xml/config.xml

Parsing /Users/mehdigriche/work/cam1/test/platforms/android/res/xml/config.xml failed (node:2306) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: ENOENT: no such file or directory, open '/Users/mehdigriche/work/cam1/test/platforms/android/res/xml/config.xml'

在网上百度了各种解决办法,还去谷歌各种查

终于找到一个办法

更改Api.js下的这段文件

        root: self.root,

        www: path.join(self.root, 'assets/www'),

        res: path.join(self.root, 'res'),

        platformWww: path.join(self.root, 'platform_www'),

        configXml: path.join(self.root, 'res/xml/config.xml'),

        defaultConfigXml: path.join(self.root, 'cordova/defaults.xml'),

        strings: path.join(self.root, 'res/values/strings.xml'),

        manifest: path.join(self.root, 'AndroidManifest.xml'),

        build: path.join(self.root, 'build'),

        javaSrc: path.join(self.root, 'src'),

        // NOTE: Due to platformApi spec we need to return relative paths here

        cordovaJs: 'bin/templates/project/assets/www/cordova.js',

        cordovaJsSrc: 'cordova-js-src'

更改为:

    root: self.root,

    www: path.join(self.root, 'assets/www'),

    res: path.join(self.root, 'res'),

    platformWww: path.join(self.root, 'platform_www'),

    configXml: path.join(self.root, 'app/src/main/res/xml/config.xml'),

    defaultConfigXml: path.join(self.root, 'cordova/defaults.xml'),

    strings: path.join(self.root, 'app/src/main/res/values/strings.xml'),

    manifest: path.join(self.root, 'app/src/main/AndroidManifest.xml'),

    build: path.join(self.root, 'build'),

    javaSrc: path.join(self.root, 'app/src/main/java/'),

    // NOTE: Due to platformApi spec we need to return relative paths here

    cordovaJs: 'bin/templates/project/assets/www/cordova.js',

    cordovaJsSrc: 'cordova-js-src'

文件是找到了,但是jar包里面的方法又出问题了,无法再java文件中找到,而且吧,即使不用的jar包的方法成了编译,把插件更改之后,竟然还是打包的上一次的结果,通过这个方法把这个插件完全清理干净之后,才可以新的编译

  1. Remove the platform: ionic cordova platform rm android
  2. Delete the following folders from your app folder: platforms,plugins & www
  3. Make sure your dependencies are available by running: npm install
  4. Add back the platform, this step will recreate the folders deleted in step 2 above: ionic cordova platform add android
  5. Finally, build your app: ionic cordova build android

所以上面那种更改Api.js的方法,肯定是有问题了。


后来试了下ionic中的几个插件,发现都是java文件的就可以使用,我都在下载到本地再进行加入的

有些会出现这个问题

variable missing(use:--variable API_KEY=value)问题

    只需要在后面加上 --variable API_KEY=09cc87d24aeae2673cf111f  后面那串可以随便更改,即完美解决。


既然jar包不行,nnd一气之下就把jar包反编译,都变成java文件,然后加入

编译还是出错,说java文件找不到,nnd,检查之后发现原来是包名的问题,好解决,建立正确的文件夹就可以了,但是问什么自动生成的那个java文件的包名就可以随便改,我就不清楚了。

好了,现在jar包的问题搞定了,但是又出来问题了,

android.os.SystemProperties

这个类找不到,我还是走不不少歪路的,先查的资料是需要jar包,把

Android SDK\platforms\android-xx\data\layoutlib.jar文件加到当前工程的附加库路径中,然后在源程序中就可以Import了。


可是我的插件就是用不了jar包,然后我急中生智,就把SystemProperties类的源代码找到,写了进去,悔不该不在android中测试啊,这是个隐藏类,不能这么用,一直出bug,后来才想到有可能是这个问题,然后就继续找方法呗

通过动态获取的方法获取这个类的两个方法get和set

public static String getProperty(String key, String defaultValue) {
String value = defaultValue;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class, String.class);
value = (String)(get.invoke(c, key, "unknown" ));
} catch (Exception e) {
e.printStackTrace();
}finally {
return value;
}
}

public static void setProperty(String key, String value) {
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method set = c.getMethod("set", String.class, String.class);
set.invoke(c, key, value );
} catch (Exception e) {
e.printStackTrace();
}
}

好了,下一个bug

在android中,调用这个方法是把自己传了进去,在cordova中怎么办,这个我们就在debug模式中调试,好了,知道了,原来是需要传入context,拿在cordovaplugin中有没有context,找了好多方法都是有问题,都快绝望的时候,我就想着试一试

import android.content.Context;
private Context context;

直接往进导,我去竟然成功了。

然后就成功了,成功了。




展开阅读全文

没有更多推荐了,返回首页