2016-04-26 80 views
2

我正在尝试为android编写一个简单的cordova-plugin,但我陷入了崩溃,我不知道如何解决。无法使用.aar文件从cordova插件启动活动

我基本上按照这些步骤来创建简单的插件,它工作正常。

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 

存在触发插件,你就在“mylittlelibrary-release.aar”文件“MainActivity”看到这则触发我的活动html文件按钮。

但是,我不断收到这次崩溃。我相信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有关。但我不知道如何在科尔多瓦做。我需要解决这个问题,所以我很乐意为您提供一个可靠的解决方案来解决我的问题。

谢谢。

回答

2

不要说,这很简单的错误。图书馆错过了一些进口和主题。这解决了这个问题。

清单:

android:theme="@style/Theme.AppCompat.Light" 

摇篮:

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' 
+0

你好,很高兴你制定出一个解决方案。我需要你对下面的建议。我有一个类似的方式,其中包含类和方法在活动中提到的aar文件。但我需要创建一个活动,它将驻留在aar文件之外并位于我的Cordova插件中。这怎么能实现?任何建议? – Stallion

+0

我也尝试过你的方式。创建一个库。使用Native android应用程序测试该库并运行良好。但是,当作为一个pluginname.aar文件包含在混合应用程序中,并且包含hello \ platforms \ android \ AndroidManifest.xml中的清单时,我得到错误。引起:java.lang.ClassNotFoundException:未在路径DexPathList中找到类“nativeplugin.cclib.MainActivity”。任何想法为什么它不能提及? – Stallion

+0

你可以看看http://stackoverflow.com/questions/41245394/start-activity-inside-cordova-plugins-aars-file-in-ionic2链接哪个有类似的问题? – Stallion