我正在嘗試爲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
它還工作。現在,我至今在我的插件結構,這些文件(當然是相當黑客攻擊,現在因爲我一直最原始的名字):
在我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有關。但我不知道如何在科爾多瓦做。我需要解決這個問題,所以我很樂意爲您提供一個可靠的解決方案來解決我的問題。
謝謝。
你好,很高興你制定出一個解決方案。我需要你對下面的建議。我有一個類似的方式,其中包含類和方法在活動中提到的aar文件。但我需要創建一個活動,它將駐留在aar文件之外並位於我的Cordova插件中。這怎麼能實現?任何建議? – Stallion
我也嘗試過你的方式。創建一個庫。使用Native android應用程序測試該庫並運行良好。但是,當作爲一個pluginname.aar文件包含在混合應用程序中,並且包含hello \ platforms \ android \ AndroidManifest.xml中的清單時,我得到錯誤。引起:java.lang.ClassNotFoundException:未在路徑DexPathList中找到類「nativeplugin.cclib.MainActivity」。任何想法爲什麼它不能提及? – Stallion
你可以看看http://stackoverflow.com/questions/41245394/start-activity-inside-cordova-plugins-aars-file-in-ionic2鏈接哪個有類似的問題? – Stallion