在 Ionic 中检索和显示来自原生 Cordova 插件的值
Retreiving and displaying a value from a native Cordova plugin in Ionic
我正在尝试从我在 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");
}
}
});
}
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。我真的不确定如何与 ionic 本身的问题进行交互,我相信问题确实存在,因为我没有正确调用成功回调。请帮忙! :(
似乎你调用了两次成功回调,即使设备没有初始化:
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(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>
必须与 Cordova java 插件顶部的包名称相匹配
package IdCordovaPlugin;
我犯了一个非常愚蠢的错误,后来通过 logcat 调试发现。
我正在尝试从我在 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");
}
}
});
}
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。我真的不确定如何与 ionic 本身的问题进行交互,我相信问题确实存在,因为我没有正确调用成功回调。请帮忙! :(
似乎你调用了两次成功回调,即使设备没有初始化:
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(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>
必须与 Cordova java 插件顶部的包名称相匹配
package IdCordovaPlugin;
我犯了一个非常愚蠢的错误,后来通过 logcat 调试发现。