2014-12-03 1 views
4

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; 
    } 
    } 
} 
} 

답변

15

내가 할하는 데 필요한 모든 전에 cordova.setActivityResultCallback (this);를 실행하는 것이라고 밝혀 cordova.getActivity().startActivityForResult (intent, REQUEST_CODE_PICK_ACCOUNT);.

+0

경우에 누군가가 ... 여기, 간단한 예를 원하는 나를 위해 일한 것입니다. 어떤 대안? – dpaksoni

+0

죄송합니다, 모르겠습니다. 그들은 뭔가를 바꿔야 만합니다. – Agamemnus

+0

'CordovaInterface.java'에서 : _ 결과를 완성하기를 원하는 활동을 시작하십시오. 이 액티비티가 종료되면 onActivityResult() 메소드가 호출됩니다 ._ 'public void startActivityForResult (CordovaPlugin 명령, Intent intent, int requestCode); ' –

1

저자는 이미 질문에 대답했지만 그것은 내 경우에는 작동하지 않습니다

public final int MY_OP = 11; 
private CallbackContext callback = null; 

@Override 
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException 
{ 
    if (action.equals("SERVICE NAME")) 
    { 
     String param = ""; 
     try 
     { 
      param = args.getString(0); 
     } 
     catch(Exception e) 
     { 
     } 

     callback = callbackContext; 

     cordova.setActivityResultCallback (this); 

     Intent intent = new Intent(); 
     intent.setClassName("com.pkg.drs","com.pkg.drs.ActivityToCall"); 
     intent.putExtra("my_param", param); 

     cordova.startActivityForResult (this, intent, MY_OP); 
     return true; 
    } 

    return false; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(requestCode == MY_OP) 
    { 
     if(resultCode == Activity.RESULT_OK && data.hasExtra("return_val")) 
     { 
      PluginResult result = new PluginResult(PluginResult.Status.OK, data.getStringExtra("return_val")); 
      result.setKeepCallback(true); 
      callback.sendPluginResult(result); 
     } 
     else 
     { 
      PluginResult result = new PluginResult(PluginResult.Status.ERROR, "no params returned successfully"); 
      result.setKeepCallback(true); 
      callback.sendPluginResult(result); 
     } 
    } 
}