2016-04-26 57 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