Cordova는 onActivityResult를 CordovaPlugin 클래스에 전달하는 자동 방법이 있습니까?Cordova에서 onActivityResult 전달
여기, 내 현재 파일의 수동으로 그 일 :
package com.myapp;
import android.os.Bundle;
import org.apache.cordova.*;
import android.content.Intent;
import com.flyingsoftgames.googleplaytoken.GooglePlayToken;
public class MyApp extends CordovaActivity {
@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {
GooglePlayToken.runOnActivityResult (requestCode, resultCode, data);
}
@Override public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
super.init();
super.loadUrl(Config.getStartUrl());
}
}
내가 "자동으로"를 통해 전달 된 데이터를 얻을 수 https://github.com/apache/cordova-plugin-camera/blob/master/src/android/CameraLauncher.java에 사용되는 동일한 기술을 사용하려고 -하지만 충돌합니다. 여기에는 작업 클래스 (수동 및 비 데이터 통과) 및 비 작동 (자동 데이터 통과) 버전의 대상 클래스가 있습니다. 처음에는 일하고 그 다음엔 일하지 않습니다.
작업, 데이터가 통과되지 스루 :
// Working, no data pass-through.
package com.flyingsoftgames.googleplaytoken;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.AccountPicker;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.apache.cordova.PluginResult.Status;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;
import android.content.Intent;
import android.app.Activity;
import android.accounts.AccountManager;
import android.os.AsyncTask;
import android.os.Bundle;
import java.io.IOException;
import android.util.Log;
public class GooglePlayToken extends CordovaPlugin {
private static final String LOG_TAG = "GooglePlayToken";
private static final int REQ_SIGN_IN_REQUIRED = 55664;
public static CordovaInterface cordova = null;
public static CallbackContext tryConnectCallback = null;
public static String accessToken = "";
public static final int REQUEST_CODE_PICK_ACCOUNT = 1000;
@Override public void initialize (CordovaInterface initCordova, CordovaWebView webView) {
cordova = initCordova;
super.initialize (cordova, webView);
}
private void pickUserAccount() {
String[] accountTypes = new String[]{"com.google"};
Intent intent = AccountPicker.newChooseAccountIntent(null, null, accountTypes, false, null, null, null, null);
cordova.getActivity().startActivityForResult (intent, REQUEST_CODE_PICK_ACCOUNT);
}
public static void runOnActivityResult (int requestCode, int resultCode, Intent data) {
if ((requestCode == REQUEST_CODE_PICK_ACCOUNT) && (resultCode == Activity.RESULT_OK)) {
new RetrieveTokenTask().execute (data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME));
}
}
public boolean execute (String action, JSONArray inputs, CallbackContext callbackContext) throws JSONException {
if ("tryConnect".equals(action)) {
tryConnect (callbackContext);
} else if ("getAccessToken".equals(action)) {
callbackContext.sendPluginResult (new PluginResult (PluginResult.Status.OK, accessToken));
}
return true;
}
// tryConnect runs the callback with a value of false if Google Play Services isn't available.
public void tryConnect (CallbackContext callbackContext) {
tryConnectCallback = callbackContext;
pickUserAccount();
}
private static class RetrieveTokenTask extends AsyncTask<String, Void, String> {
@Override protected String doInBackground (String... params) {
String accountName = params[0];
String scope = "oauth2:" + Scopes.PROFILE;
Context context = cordova.getActivity().getApplicationContext();
try {
accessToken = GoogleAuthUtil.getToken(context, accountName, scope);
} catch (IOException e) {
String errormessage = e.getMessage();
if (tryConnectCallback != null) tryConnectCallback.error ("Error: " + errormessage + "."); tryConnectCallback = null;
} catch (UserRecoverableAuthException e) {
cordova.getActivity().startActivityForResult (e.getIntent(), REQ_SIGN_IN_REQUIRED);
} catch (GoogleAuthException e) {
String errormessage = e.getMessage();
if (tryConnectCallback != null) tryConnectCallback.error ("Error: " + errormessage + "."); tryConnectCallback = null;
}
return accessToken;
}
@Override protected void onPostExecute (String newAccessToken) {
super.onPostExecute (newAccessToken);
accessToken = newAccessToken;
if (tryConnectCallback != null) {
tryConnectCallback.sendPluginResult (new PluginResult (PluginResult.Status.OK, accessToken));
tryConnectCallback = null;
}
}
}
}
비 작업을 데이터가 통과 :
// Crashy/non-working, data pass-through.
package com.flyingsoftgames.googleplaytoken;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.AccountPicker;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.apache.cordova.PluginResult.Status;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;
import android.content.Intent;
import android.app.Activity;
import android.accounts.AccountManager;
import android.os.AsyncTask;
import android.os.Bundle;
import java.io.IOException;
import android.util.Log;
public class GooglePlayToken extends CordovaPlugin {
private final String LOG_TAG = "GooglePlayToken";
private final int REQ_SIGN_IN_REQUIRED = 55664;
public CordovaInterface cordova = null;
public CallbackContext tryConnectCallback = null;
public String accessToken = "";
public final int REQUEST_CODE_PICK_ACCOUNT = 1000;
@Override public void initialize (CordovaInterface initCordova, CordovaWebView webView) {
Log.e (LOG_TAG, "initialize");
cordova = initCordova;
super.initialize (cordova, webView);
}
private void pickUserAccount() {
Log.e (LOG_TAG, "pickUserAccount");
String[] accountTypes = new String[]{"com.google"};
Intent intent = AccountPicker.newChooseAccountIntent(null, null, accountTypes, false, null, null, null, null);
//cordova.startActivityForResult ((CordovaPlugin) this, intent, REQUEST_CODE_PICK_ACCOUNT); // Tried this, too.
cordova.getActivity().startActivityForResult (intent, REQUEST_CODE_PICK_ACCOUNT);
}
//public static void runOnActivityResult (int requestCode, int resultCode, Intent data) {
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
Log.e (LOG_TAG, "runOnActivityResult");
if ((requestCode == REQUEST_CODE_PICK_ACCOUNT) && (resultCode == Activity.RESULT_OK)) {
new RetrieveTokenTask().execute (intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME));
}
}
public boolean execute (String action, JSONArray inputs, CallbackContext callbackContext) throws JSONException {
Log.e (LOG_TAG, "execute: " + action);
if ("tryConnect".equals(action)) {
tryConnect (callbackContext);
} else if ("getAccessToken".equals(action)) {
callbackContext.sendPluginResult (new PluginResult (PluginResult.Status.OK, accessToken));
}
return true;
}
// tryConnect runs the callback with a value of false if Google Play Services isn't available.
public void tryConnect (CallbackContext callbackContext) {
Log.e (LOG_TAG, "tryConnect");
tryConnectCallback = callbackContext;
pickUserAccount();
}
private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
@Override protected String doInBackground (String... params) {
Log.e (LOG_TAG, "RetrieveTokenTask");
String accountName = params[0];
String scope = "oauth2:" + Scopes.PROFILE;
Context context = cordova.getActivity().getApplicationContext();
try {
accessToken = GoogleAuthUtil.getToken(context, accountName, scope);
GoogleAuthUtil.clearToken (context, accessToken);
accessToken = GoogleAuthUtil.getToken(context, accountName, scope);
Log.e (LOG_TAG, accessToken);
} catch (IOException e) {
String errormessage = e.getMessage();
if (tryConnectCallback != null) tryConnectCallback.error ("Error: " + errormessage + "."); tryConnectCallback = null;
} catch (UserRecoverableAuthException e) {
cordova.getActivity().startActivityForResult (e.getIntent(), REQ_SIGN_IN_REQUIRED);
} catch (GoogleAuthException e) {
String errormessage = e.getMessage();
if (tryConnectCallback != null) tryConnectCallback.error ("Error: " + errormessage + "."); tryConnectCallback = null;
}
return accessToken;
}
@Override protected void onPostExecute (String newAccessToken) {
super.onPostExecute (newAccessToken);
accessToken = newAccessToken;
if (tryConnectCallback != null) {
tryConnectCallback.sendPluginResult (new PluginResult (PluginResult.Status.OK, accessToken));
tryConnectCallback = null;
}
}
}
}
경우에 누군가가 ... 여기, 간단한 예를 원하는 나를 위해 일한 것입니다. 어떤 대안? – dpaksoni
죄송합니다, 모르겠습니다. 그들은 뭔가를 바꿔야 만합니다. – Agamemnus
'CordovaInterface.java'에서 : _ 결과를 완성하기를 원하는 활동을 시작하십시오. 이 액티비티가 종료되면 onActivityResult() 메소드가 호출됩니다 ._ 'public void startActivityForResult (CordovaPlugin 명령, Intent intent, int requestCode); ' –