Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Ionic中的本机Cordova插件检索和显示值_Cordova_Ionic Framework_Ionic2_Phonegap Plugins_Cordova Plugins - Fatal编程技术网

从Ionic中的本机Cordova插件检索和显示值

从Ionic中的本机Cordova插件检索和显示值,cordova,ionic-framework,ionic2,phonegap-plugins,cordova-plugins,Cordova,Ionic Framework,Ionic2,Phonegap Plugins,Cordova Plugins,我正在尝试从我在Cordova中构建的本机SDK插件中检索一个标识号,但无论我如何尝试,都无法获取该标识号。我有一个本地Android应用程序,可以从设备上获取数字,但代码不能直接转换为Cordova 工作Android代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Device = SdkForAndroid.getInstance(

我正在尝试从我在Cordova中构建的本机SDK插件中检索一个标识号,但无论我如何尝试,都无法获取该标识号。我有一个本地Android应用程序,可以从设备上获取数字,但代码不能直接转换为Cordova

工作Android代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Device = SdkForAndroid.getInstance(this);

    // First, we test if the device was already initialized. 
    if (!Device.isInitialized()) {

        Log.i(TAG, "mobile device not initialized yet");

        initializeSDK();

    } else {

        // if we already initialized, show the Secured Objects we got

        //Log.i(TAG, "device is initialized. deviceId: " + mobileDevice.getDeviceId());
        TextView textView = (TextView) findViewById(R.id.txtDeviceId);
        textView.setText("" + Device.getDeviceId());
    }
}

Private void initializeSDK() {
    new Thread() {

        @Override
        public void run() {
            try {
                String deviceId = Device.initialize();//hidden sdk code

                Log.i(TAG, "initialized SDK, deviceId = " + deviceId);
            } catch (Exception e) {
                Log.e(TAG, "failed to initialize SDK", e);
            } 
        }
    }.start();
}
科尔多瓦代码:

public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    this.callbackContext = callbackContext;
    if (action.equals("initializeSDK")) {
        cordova.getActivity().runOnUiThread(
            new Runnable() {
                public void run() {
                        isInitialized();
                    }
                });
            return true;
        }
protected void isInitialized(){
                  Device = SdkForAndroid.getInstance(cordova.getActivity());
                  try{
                        if (!Device.isInitialized()) {
                            Log.i(TAG, "mobile device not initialized yet");
                            initSDK();
                        } else {
                            Log.i(TAG, "mobile device is initialized. deviceId: " + Device.getDeviceId());
                        }
                        this.callbackContext.success(mobileDevice.getDeviceId());
                  } catch (Exception e){
                        this.callbackContext.error("Error");
                  }

}

protected void initSDK(){
    cordova.getThreadPool().execute(new Runnable() {
        public void run() {
                    try{
                        String deviceId = mobileDevice.initialize()
                            //hidden sdk code
                        Log.i(TAG, "initialized SDK, deviceId = " + deviceId);
                                callbackContext.success(deviceId);
                            } catch (Exception e){
                                Log.e(TAG, "failed to initialize SDK", e);
                                callbackContext.error("Error");
                            }
                }
            });
}
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    this.callbackContext = callbackContext;
    if (action.equals("initializeSDK")) {
        cordova.getActivity().runOnUiThread(
            new Runnable() {
                public void run() {
                        isInitialized();
                    }
                });
            return true;
        }
protected void isInitialized(){
    Device = SdkForAndroid.getInstance(cordova.getActivity());
    try{
        if (!Device.isInitialized()) {
            Log.i(TAG, "mobile device not initialized yet");
            initSDK();
        } else {
            Log.i(TAG, "mobile device is initialized. deviceId: " + Device.getDeviceId());
            this.callbackContext.success(Device.getDeviceId());
        }
    } catch (Exception e){
        this.callbackContext.error("Error");
    }

}

protected void initSDK(){
    cordova.getThreadPool().execute(new Runnable() {
        public void run() {
                try{
                    String deviceId = mobileDevice.initialize()
                        //hidden sdk code
                    Log.i(TAG, "initialized SDK, deviceId = " + deviceId);
                    callbackContext.success(deviceId);
                } catch (Exception e){
                    Log.e(TAG, "failed to initialize SDK", e);
                    callbackContext.error("Error");
                }
        }
    });
}
Javascript代码:

var exec = require('cordova/exec');

module.exports = {
    initializeSDK: function (success, fail) {
        cordova.exec(success, fail, 'BlueIDplugin', 'initializeSDK', []);
    }
};
离子型appcomponent.ts

 initiateSDK(){

    this.BlueIdPlugin.initializeSDK(
      function(success){
        console.log(deviceId);
      },
      function(fail){
        console.log("Error getting device id")
      }
    )

    this.BlueIdPlugin.initializeSDK();
    console.log(this.BlueIdPlugin.getDeviceId());
  }

我认为我正确地链接了代码,因为SDK是用我的控制台日志初始化的。问题是我无法显示deviceId。我真的不确定如何与离子本身的问题互动,我相信问题确实存在,因为我没有正确地调用成功回调。请帮忙(

您似乎在两次调用成功回调,即使设备未初始化:

this.callbackContext.success(mobileDevice.getDeviceId());
这会导致调用callbackContext两次,Cordova不允许这样做(除非您明确请求)。因此,请尝试以下操作:

科尔多瓦代码:

public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    this.callbackContext = callbackContext;
    if (action.equals("initializeSDK")) {
        cordova.getActivity().runOnUiThread(
            new Runnable() {
                public void run() {
                        isInitialized();
                    }
                });
            return true;
        }
protected void isInitialized(){
                  Device = SdkForAndroid.getInstance(cordova.getActivity());
                  try{
                        if (!Device.isInitialized()) {
                            Log.i(TAG, "mobile device not initialized yet");
                            initSDK();
                        } else {
                            Log.i(TAG, "mobile device is initialized. deviceId: " + Device.getDeviceId());
                        }
                        this.callbackContext.success(mobileDevice.getDeviceId());
                  } catch (Exception e){
                        this.callbackContext.error("Error");
                  }

}

protected void initSDK(){
    cordova.getThreadPool().execute(new Runnable() {
        public void run() {
                    try{
                        String deviceId = mobileDevice.initialize()
                            //hidden sdk code
                        Log.i(TAG, "initialized SDK, deviceId = " + deviceId);
                                callbackContext.success(deviceId);
                            } catch (Exception e){
                                Log.e(TAG, "failed to initialize SDK", e);
                                callbackContext.error("Error");
                            }
                }
            });
}
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    this.callbackContext = callbackContext;
    if (action.equals("initializeSDK")) {
        cordova.getActivity().runOnUiThread(
            new Runnable() {
                public void run() {
                        isInitialized();
                    }
                });
            return true;
        }
protected void isInitialized(){
    Device = SdkForAndroid.getInstance(cordova.getActivity());
    try{
        if (!Device.isInitialized()) {
            Log.i(TAG, "mobile device not initialized yet");
            initSDK();
        } else {
            Log.i(TAG, "mobile device is initialized. deviceId: " + Device.getDeviceId());
            this.callbackContext.success(Device.getDeviceId());
        }
    } catch (Exception e){
        this.callbackContext.error("Error");
    }

}

protected void initSDK(){
    cordova.getThreadPool().execute(new Runnable() {
        public void run() {
                try{
                    String deviceId = mobileDevice.initialize()
                        //hidden sdk code
                    Log.i(TAG, "initialized SDK, deviceId = " + deviceId);
                    callbackContext.success(deviceId);
                } catch (Exception e){
                    Log.e(TAG, "failed to initialize SDK", e);
                    callbackContext.error("Error");
                }
        }
    });
}
appcomponent.ts:

initiateSDK(){
    this.BlueIdPlugin.initializeSDK(
      function(success){
        console.log(deviceId);
      },
      function(fail){
        console.log("Error getting device id")
      }
    )
}

原来问题出在插件顶部的包名上。它的末尾有一个额外的文件夹目录,所以插件实际上没有连接到Ionic应用程序

所以本质上

   <feature name="IDplugin">
        <param name="android-package" value="IdCordovaPlugin.IDplugin"/>
   </feature>

我犯了一个非常愚蠢的错误,后来通过logcat调试发现了这个错误。

这不起作用,伙计:(当我尝试函数(成功)和函数(失败)时)他们两个都没有被调用。我不确定在看不到完整代码的情况下我能提出更多建议。我建议在Android Studio中运行它,并在Java中的适当位置放置断点,还将Webview连接到Chrome DevTools进行远程调试,并在Javascript中放置适当的断点。