0

我正在开发这个 Android 应用程序以在设备上运行。我正在使用 Ionic 和 Angular 来开发应用程序。

现在我需要使用 Plugman 创建一个自定义插件。此插件应允许用户使用 IBM APP ID 进行身份验证。

我按照这里提到的说明https://github.com/ibm-cloud-security/appid-clientsdk-android 创建了我的 gradle 文件。

但是,当我运行 ionic cordova run android --verbose --debug 时出现此错误

  • 出了什么问题:任务执行失败:app:processDebugManifest。

java.lang.NullPointerException(没有错误信息)

而且我不知道根本原因是什么。这是我第一次开发自定义插件。我的怀疑依赖于依赖,但我不知道是什么部分导致了这个问题。

Ionic Framework : @ionic/angular 5.0.7
@angular-devkit/build-angular : 0.803.26
@angular-devkit/schematics : 8.3.26
@angular/cli : 8.3.26
@ionic/angular-toolkit : 2.2.0

Cordova:

Cordova CLI : 10.0.0
Cordova Platforms : android 8.1.0
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 4.2.1, (and 7 other plugins)

Utility:

cordova-res (update available: 0.14.0) : 0.10.0
native-run (update available: 1.0.0) : 0.3.0

System:

Android SDK Tools : 26.1.1 (C:\\Android\\sdk)
NodeJS : v14.2.0 (C:\Program Files\\nodejs\\node.exe)
npm : 6.14.4
OS : Windows 10```

LOG=======================================
C:\project_cren\plugin\ci-uix-mobile-master>ionic cordova run android --verbose --debug
  ionic:lib Terminal info: { ci: false, shell: 'C:\\WINDOWS\\system32\\cmd.exe', tty: false, windows: true } +0ms
  ionic:lib CLI global options: { _: [ 'cordova', 'run', 'android' ], help: null, h: null, verbose: true, quiet: null, interactive: false, color: true, confirm: null, json: null, debug: true, project: null, '--': [] } +4ms
  ionic:lib:project Project type from config: @ionic/angular (angular) +0ms
  ionic:lib:project Project details: { configPath: 'C:\\project_cren\\plugin\\ci-uix-mobile-master\\ionic.config.json', errors: [], context: 'app', type: 'angular' } +1ms
  ionic Context: { binPath: 'C:\\Users\\AMANDODOSSANTOSNETO\\AppData\\Roaming\\npm\\node_modules\\@ionic\\cli\\bin\\ionic', libPath: 'C:\\Users\\AMANDODOSSANTOSNETO\\AppData\\Roaming\\npm\\node_modules\\@ionic\\cli', execPath: 'C:\\project_cren\\plugin\\ci-uix-mobile-master', version: '6.7.0' } +0ms
  ionic:lib:integrations:cordova:config Loading Cordova Config (config.xml: 'C:\\project_cren\\plugin\\ci-uix-mobile-master\\config.xml', package.json: 'C:\\project_cren\\plugin\\ci-uix-mobile-master\\package.json') +0ms
  ionic:commands:run Native platform devices: [] +0ms
  ionic:lib:integrations:cordova:config Loading Cordova Config (config.xml: 'C:\\project_cren\\plugin\\ci-uix-mobile-master\\config.xml', package.json: 'C:\\project_cren\\plugin\\ci-uix-mobile-master\\package.json') +11s
  ionic:lib:build build options: {
  ionic:lib:build   '--': [],
  ionic:lib:build   engine: 'cordova',
  ionic:lib:build   platform: 'android',
  ionic:lib:build   project: 'app',
  ionic:lib:build   verbose: false,
  ionic:lib:build   configuration: undefined,
  ionic:lib:build   sourcemaps: undefined,
  ionic:lib:build   cordovaAssets: true,
  ionic:lib:build   watch: undefined,
  ionic:lib:build   type: 'angular'
  ionic:lib:build } +0ms
  ionic:lib:hooks Looking for ionic:build:before npm script. +0ms
  ionic:lib:build Looking for ionic:build npm script. +154ms
  ng:analytics getGlobalAnalytics +0ms
  ng:analytics Client Analytics config found: false +47ms
  ng:analytics Analytics disabled. Ignoring all analytics. +1ms
  ng:analytics getSharedAnalytics +0ms
  
  
  
  
  WARNING in ./src/app/invoice-detail/invoice-detail.component.scss
Module Warning (from ./node_modules/postcss-loader/src/index.js):
Warning

(4:3) start value has mixed support, consider using flex-start instead
 @ ./src/app/invoice-detail/invoice-detail.component.ts 27:41-83
 @ ./src/app/app.module.ts
 @ ./src/main.ts
 @ multi ./src/main.ts
  ionic:lib:hooks Looking for ionic:build:after npm script. +40s

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugManifest'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 13s
C:\project_cren\plugin\ci-uix-mobile-master\platforms\android\gradlew: Command failed with exit code 1 Error output:
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugManifest'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 13s
[ERROR] An error occurred while running subprocess cordova.

        cordova.cmd build android --debug --verbose exited with exit code 1.

        Re-running this command with the --verbose flag may provide more information.
  ionic:utils-process onBeforeExit handler: 'process.exit' received +0ms
  ionic:utils-process onBeforeExit handler: running 2 functions +1ms
  ionic:utils-process error while killing process tree for 17344: Error: Command failed: taskkill /pid 17344 /T /F
  ionic:utils-process ERROR: The process "17344" not found.
  ionic:utils-process 
  ionic:utils-process     at ChildProcess.exithandler (child_process.js:303:12)
  ionic:utils-process     at ChildProcess.emit (events.js:315:20)
  ionic:utils-process     at maybeClose (internal/child_process.js:1051:16)
  ionic:utils-process     at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5) {
  ionic:utils-process   killed: false,
  ionic:utils-process   code: 128,
  ionic:utils-process   signal: null,
  ionic:utils-process   cmd: 'taskkill /pid 17344 /T /F'
  ionic:utils-process } +472ms
  ionic:utils-process onBeforeExit handler: error from function: Error: Command failed: taskkill /pid 17344 /T /F
  ionic:utils-process ERROR: The process "17344" not found.
  ionic:utils-process 
  ionic:utils-process     at ChildProcess.exithandler (child_process.js:303:12)
  ionic:utils-process     at ChildProcess.emit (events.js:315:20)
  ionic:utils-process     at maybeClose (internal/child_process.js:1051:16)
  ionic:utils-process     at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5) {
  ionic:utils-process   killed: false,
  ionic:utils-process   code: 128,
  ionic:utils-process   signal: null,
  ionic:utils-process   cmd: 'taskkill /pid 17344 /T /F'
  ionic:utils-process } +21ms
  ionic:utils-process error while killing process tree for 2628: Error: Command failed: taskkill /pid 2628 /T /F
  ionic:utils-process ERROR: The process "2628" not found.
  ionic:utils-process 
  ionic:utils-process     at ChildProcess.exithandler (child_process.js:303:12)
  ionic:utils-process     at ChildProcess.emit (events.js:315:20)
  ionic:utils-process     at maybeClose (internal/child_process.js:1051:16)
  ionic:utils-process     at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5) {
  ionic:utils-process   killed: false,
  ionic:utils-process   code: 128,
  ionic:utils-process   signal: null,
  ionic:utils-process   cmd: 'taskkill /pid 2628 /T /F'
  ionic:utils-process } +40ms
  ionic:utils-process onBeforeExit handler: error from function: Error: Command failed: taskkill /pid 2628 /T /F
  ionic:utils-process ERROR: The process "2628" not found.
  ionic:utils-process 
  ionic:utils-process     at ChildProcess.exithandler (child_process.js:303:12)
  ionic:utils-process     at ChildProcess.emit (events.js:315:20)
  ionic:utils-process     at maybeClose (internal/child_process.js:1051:16)
  ionic:utils-process     at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5) {
  ionic:utils-process   killed: false,
  ionic:utils-process   code: 128,
  ionic:utils-process   signal: null,
  ionic:utils-process   cmd: 'taskkill /pid 2628 /T /F'
  ionic:utils-process } +8ms
  ionic:utils-process processExit: exiting (exit code: 1) +4ms

GRADLE FILE=====================================================================
android {
    //compileSdkVersion 29
    //buildToolsVersion "29.0.3"

    defaultConfig {
       manifestPlaceholders = ['appIdRedirectScheme': android.defaultConfig.applicationId]
    }
}

dependencies {
   implementation 'com.github.ibm-cloud-security:appid-clientsdk-android:6.+'
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

JAVA FILE ==============================================
package ibm.com.ibmappidcordovaplugin;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.ibm.cloud.appid.android.api.AppID;
import com.ibm.cloud.appid.android.api.AuthorizationException;
import com.ibm.cloud.appid.android.api.AuthorizationListener;
import com.ibm.cloud.appid.android.api.LoginWidget;
import com.ibm.cloud.appid.android.api.tokens.AccessToken;
import com.ibm.cloud.appid.android.api.tokens.IdentityToken;
import com.ibm.cloud.appid.android.api.tokens.RefreshToken;

/**
 * This class echoes a string called from JavaScript.
 */
public class ibmappidcordovaplugin extends CordovaPlugin {
    //PluginResult result = null;
    private CallbackContext callbackContext = null;
    private static final String SHOW_AUTH = "authentication";
    LoginWidget loginWidget;
    loginWidget = AppID.getInstance().getLoginWidget();

    public ibmappidcordovaplugin(){
        AppID.getInstance().initialize(getApplicationContext(), "cdb1c3ab-e8cf-49cf-9dff-9dfa4bf2a898", AppID.REGION_US_SOUTH);
    }

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        this.callbackContext = callbackContext;
        String msg = args.getJSONObject(0).getString("msg");
        if (action.equals("authentication")) {
            //String message = args.getString(0);
            this.coolMethod(msg, callbackContext);
            return true;
        }
        return false;
    }

    private void coolMethod(String message, CallbackContext callbackContext) {
        if (message != null && message.length() > 0) {
            auth();
            callbackContext.success(create());
        } else {
            callbackContext.error("Expected one non-empty string argument.");
        }
    }

    private void auth(){
        loginWidget.launch(this, new AuthorizationListener() {

            @Override
            public void onAuthorizationSuccess(final AccessToken accessToken, final IdentityToken identityToken,
                                               RefreshToken refreshToken) {
                
                cordova.getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                       
                        console.log("Name: " + identityToken.getName());
                        console.log("user: " + accessToken.getScope());
                        console.log("getIdentities " + identityToken.getIdentities());
                        console.log("getRaw " + identityToken.getRaw());

                        for (String name : identityToken.getAudience() ) {
                            console.log("AUD: " +name);
                        }

                        for (String name : identityToken.getAuthenticationMethods() ) {
                            console.log("AUTH: " +name);
                        }

                        try {
                            JSONObject ob = identityToken.getPayload();

                            console.log("getPayload " + ob.getString("preferred_username"));
                        }
                        catch (Exception e){
                            console.log("Error: " + e.getMessage());
                        }
                    }
                });
            }

            @Override
            public void onAuthorizationCanceled() {
                
            }

            @Override
            public void onAuthorizationFailure (AuthorizationException exception) {
                
                
            }
        });
    }

    private String create(/*IdentityToken identityToken*/){
        String response = "";
        try {
            JSONObject token = new JSONObject();
            String t = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImFwcElkLWNkYjFjM2FiLWU4Y2YtNDljZi05ZGZmLTlkZmE0YmYyYTg5OC0yMDIwLTA5LTI1VDE1OjE5OjI4LjIxNyIsInZlciI6NH0.eyJpc3MiOiJodHRwczovL3VzLXNvdXRoLmFwcGlkLmNsb3VkLmlibS5jb20vb2F1dGgvdjQvY2RiMWMzYWItZThjZi00OWNmLTlkZmYtOWRmYTRiZjJhODk4IiwiYXVkIjpbIjc5NWUzMmVlZWFjMzIzMTM5YmM5ZWU3YmQ2NWEyMTc5YjNhNzc3ZjgiXSwiZXhwIjoxNjAyOTc2ODg0LCJ0ZW5hbnQiOiJjZGIxYzNhYi1lOGNmLTQ5Y2YtOWRmZi05ZGZhNGJmMmE4OTgiLCJpYXQiOjE2MDI5NzMyODQsImVtYWlsIjoiYW1hbmRvc0Bici5pYm0uY29tIiwibmFtZSI6IlZvbHVudGFyaW8gRmVsaXogZGEgVmlkYSIsInN1YiI6ImMyMjQ3ZWU3LTc3ZDEtNDFhMy04NjQ3LWRmNTNhMWMyMWJiMiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiIxMjM0NTY3OCIsImdpdmVuX25hbWUiOiJWb2x1bnRhcmlvIiwiZmFtaWx5X25hbWUiOiJGZWxpeiBkYSBWaWRhIiwiaWRlbnRpdGllcyI6W3sicHJvdmlkZXIiOiJjbG91ZF9kaXJlY3RvcnkiLCJpZCI6IjU0NmU5NTk5LWJjMGItNDIxNi04YzljLTQ2N2RjZWQ5NjQ4NCJ9XSwiYW1yIjpbImNsb3VkX2RpcmVjdG9yeSJdfQ.C4_2mj3fx3IwfqH4_O8CR4NtSNpgR7WTbjOz9j1XvrAZS9uiTswMyCn9q8N8pIh6BuP2RTmBhAtnkjAYt0rkHOtEHutf9J79GkpN33-H5P-5k9pqopUuawyFZlfEuH3m76PVnH2XkDUZ1EOTRKrtuHIyYS74tGOYgF8r3hBwjSbFZPTchkNAQmqn5FTgJ6LzUa3xBWt3C1nkvMw3nKrorAUtrsCZXD9PGJKlqJhpZXH9renSRa4KDDwswHzhLGiIghgAmvVoNwOsUWrWbQF88EGDKAkyQRCnTRo2lqdANtYlIwsVitGc9zkje6wDOhjjfZ6g24sj9Id-kK7Sw813aQ";
            token.put("name", "Fulando da Silva"/*identityToken.getName()*/);
            token.put("email", "fulano@test.com"/*identityToken.getEmail()*/);
            token.put("token", t/*identityToken.getRaw()*/);
            response = token.toString();
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }
        return response;
    }
}
4

0 回答 0