我正在尝试为Android编写一个简单的cordova-plugin,但我陷入了崩溃,我不知道如何解决。
我基本上按照这些步骤来创建简单的插件,它运行良好。
http://www.mat-d.com/site/tutorial-creating-a-cordova-phonegap-plugin-for-android-app/
然而,我的插件必须调用打包为.aar文件的活动。基本上我有一个完整的应用程序与java /布局需要由插件触发。
我按照这些步骤将我的.aar文件添加到cordova的android版本中。
Cordova plugin development - adding aar
它也有效。现在,到目前为止,我的插件结构中存在这些文件(由于我保留了大部分原始名称,因此现在已经非常黑了):
在我的yourFile.gradle中我有这个:
repositories{
jcenter()
flatDir{
dirs 'libs'
}
}
dependencies {
compile(name:'mylittlelibrary-release', ext:'aar')
compile 'com.android.volley:volley:1.0.0'
}
android {
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
}
}
我的“CoolPlugin.java”的主要部分如下所示:
public class CoolPlugin extends CordovaPlugin {
public CoolPlugin() {}
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
}
public boolean execute(final String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
cordova.getActivity().runOnUiThread(new Runnable() {
public void run() {
final Context context = cordova.getActivity().getApplicationContext();
try {
Intent intent = new Intent(context, testv.com.mylittlelibrary.MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
cordova.getActivity().startActivity(intent);
} catch (Exception e) {
String errorText = e.toString();
Toast toast = Toast.makeText(context, errorText, duration);
toast.show();
}
我的“mylittlelibrary-release.aar”在命名空间“testv.com.mylittlelibrary”下有其主要活动,因此MainActivity.java看起来像这样:
package testv.com.mylittlelibrary;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import com.android.volley.*;
import com.android.volley.toolbox.*;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
etc...
我正在阅读下面的帖子,看起来我需要以某种方式注册我的aar文件的主要活动。
open an activity from a CordovaPlugin
我不完全确定如何做到这一点,所以我进入了自动生成的AndroidManifest.xml
C:\科尔多瓦\你好\平台\机器人\的AndroidManifest.xml
并使用命名空间内部修改了活动:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="com.example.hello" 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" android:supportsRtl="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" 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>
<activity android:label="@string/activity_name"
android:launchMode="singleTop"
android:name="testv.com.mylittlelibrary.MainActivity">
</activity>
</application>
<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="23" />
</manifest>
我安装了插件并使用以下方式运行应用程序:
cordova plugin add c:/CoolPlugin/
cordova build android
cordova run android
html文件中有一个触发插件的按钮,然后按照您在“mylittlelibrary-release.aar”文件的“MainActivity”上看到的那样触发我的活动。
然而,我一直在崩溃。我相信android插件无法正确解析命名空间并抛出此异常。
com.example.hello E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hello, PID: 13119
java.lang.NoClassDefFoundError: Failed resolution of: Ltestv/com/mylittlelibrary/MainActivity;
at CoolPlugin$1.run(CoolPlugin.java:59)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
我也相信这与在testv.com.mylittlelibrary下正确注册MainActivity有关。但我无法弄清楚怎么做在cordova。我需要解决这个问题,所以我很高兴能给你一些我的声誉,以获得一个可以解锁我的可靠答案。
谢谢。答案 0 :(得分:3)
清单:
android:theme="@style/Theme.AppCompat.Light"
Gradle:
dependencies {
compile(name:'mylittlelibrary-release', ext:'aar')
compile 'com.android.support:support-v13:23.1.0'
compile 'com.android.support:support-v4:23.1.0'
compile 'com.android.support:gridlayout-v7:23.1.1'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'