无法使用.aar文件

时间:2016-04-26 21:09:48

标签: android-activity cordova-plugins

我正在尝试为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

它也有效。现在,到目前为止,我的插件结构中存在这些文件(由于我保留了大部分原始名称,因此现在已经非常黑了):

enter image description here

在我的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。我需要解决这个问题,所以我很高兴能给你一些我的声誉,以获得一个可以解锁我的可靠答案。

谢谢。

1 个答案:

答案 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'