Android-плагин Cordova на ActiveResult никогда не выполняется, решение

Если вы работаете над плагином, который использует сторонний API и является кодом, который вы не можете просто изменить по своему желанию, вы можете найти код, который использует функцию onActivityResult для получения результата из API.

Ну, это совсем не проблема, если вы работаете над любым проектом Android, но если вы пытались решить эту задачу, работая над плагином Cordova, возможно, вы хотите убить себя прямо сейчас, потому что он просто не работает. Поэтому, пожалуйста, не делайте этого, но не сегодня.

Возможно, вы уже заметили (капитан, очевидно), что эта проблема связана с Main Cordova Activity, которая по какой-то причине не срабатывает, и вы не можете переопределить этот метод. Таким образом, решение, теоретически очень простое, просто создайте намерение и делегируйте событие этому намерению и извлеките его в Cordova, используя cordova.startActivityForResult,

В следующем примере мы будем использовать Средство выбора файлов OneDrive как пример.

Решение

Как уже говорилось ранее, вы не можете просто переопределить onActivityResult в рамках той же Cordova Activity, поэтому мы собираемся создать Пустое представление (новое намерение), которое будет запускать Filepicker. Чтобы создать пустое действие, добавьте следующую разметку в plugin.xml файл для создания полезного представления (которым мы собираемся манипулировать с классом Java позже). В этом случае имя будет (у Intent должно быть то же имя класса Java) DialogShowPicker, обратите внимание, что он должен быть внутри тега платформы Android:


Это должно создать активность в проекте, и мы можем назвать это в нашем основном классе. Вам просто нужно создать новое намерение, дать имя (которое мы дали ранее в файле plugin.xml) действия и отправить его в качестве параметра в cordova.startActivityForResult который сделает трюк для вас.

Перейдите к функции execute вашего основного класса и обработайте упомянутый алгоритм. Следуйте этому примеру:

package com.ourcodeworld.plugins.onedrivefilepicker;// Change the package name according to your plugin.
import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.content.Context;// To toast
import android.widget.Toast;// ToToast
import android.os.Bundle;
public class myPluginMainClass extends CordovaPlugin {
private static final String ACTION_SHOWPICKER = "showpicker";
private CallbackContext PUBLIC_CALLBACKS = null;
@Override
public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
final JSONObject arg_object = data.getJSONObject(0);
String ONEDRIVE_APP_ID = "thisisTheAppIdfortheExample";
String LINK_MODE = "download";
PUBLIC_CALLBACKS = callbackContext;
// If the showpicker action is executed from javascript, start the activity that starts the picker
if (ACTION_SHOWPICKER.equals(action)) {
// The intent expects as first parameter the given name for the activity in your plugin.xml
Intent intent = new Intent("com.ourcodeworld.plugins.onedrivefilepicker.DialogShowPicker");
// Send some info to the activity to retrieve it later
intent.putExtra("app_id", ONEDRIVE_APP_ID);
intent.putExtra("link_mode", LINK_MODE);
// Now, cordova will expect for a result using startActivityForResult and will be handle by the onActivityResult.
cordova.startActivityForResult((CordovaPlugin) this, intent, 0);
}
// Send no result, to execute the callbacks later
PluginResult pluginResult = new  PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true); // Keep callback
return true;
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if(resultCode == cordova.getActivity().RESULT_OK){
Bundle extras = data.getExtras();// Get data sent by the Intent
String information = extras.getString("data"); // data parameter will be send from the other activity.
tolog(information); // Shows a toast with the sent information in the other class
PluginResult resultado = new PluginResult(PluginResult.Status.OK, "this value will be sent to cordova");
resultado.setKeepCallback(true);
PUBLIC_CALLBACKS.sendPluginResult(resultado);
return;
}else if(resultCode == cordova.getActivity().RESULT_CANCELED){
PluginResult resultado = new PluginResult(PluginResult.Status.OK, "canceled action, process this in javascript");
resultado.setKeepCallback(true);
PUBLIC_CALLBACKS.sendPluginResult(resultado);
return;
}
// Handle other results if exists.
super.onActivityResult(requestCode, resultCode, data);
}
// A function to show a toast with some data, just demo
public void tolog(String toLog){
Context context = cordova.getActivity();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, toLog, duration);
toast.show();
}
}

Теперь нам нужно разобраться с тем, что произойдет, когда начнется деятельность. Создать класс Java (DialogShowPicker.java) внутри вашего кода Android и не забудьте включить его в свой плагин. Класс Java должен выглядеть следующим образом:

package com.ourcodeworld.plugins.onedrivefilepicker;// Change the package name acording to your plugin name
import org.apache.cordova.*;
import android.app.Activity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.os.Bundle;
import com.microsoft.onedrivesdk.picker.*;
public class DialogShowPicker extends Activity{
private boolean firstTime = true;
@Override
public void onStart() {
super.onStart();
// Write your code inside this condition
// Here should start the process that expects the onActivityResult
if(firstTime == true){
// Do something at first initialization
// And retrieve the parameters that we sent before in the Main file of the plugin
Bundle extras = getIntent().getExtras();
if (extras != null) {
String appId = extras.getString("app_id");
linkMode = extras.getString("link_mode");
mPicker = Picker.createPicker(appId);
// startPicking method will execute onActivityResult whe na file is selected.
if(linkMode.equals("view")){
mPicker.startPicking(this, LinkType.WebViewLink);
}else if(linkMode.equals("download")){
mPicker.startPicking(this, LinkType.DownloadLink);
}
}
}
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
firstTime = false;// There's a result, allow to exit the activity !
// Do something with the result of the Intent data
// Send parameters to retrieve in cordova.
Intent intent = new Intent();
intent.putExtra("data", "This is the sent information from the 2 activity :) ");
setResult(Activity.RESULT_OK, intent);
finish();// Exit of this activity !
}
}

И добавьте его в свой плагин, используя:


Затем просто выполните функцию с помощью javascript (который вы должны определить сами, как хотите в плагине). Вы можете увидеть следующую диаграмму, чтобы увидеть, что мы только что сделали:

Заметки

  • Вы можете отправлять только примитивные значения между Intents (строки и числа)

Повеселись

Ссылка на основную публикацию
Adblock
detector