Android活动中未调用OnActivityResult()

时间:2015-02-18 21:19:41

标签: android android-intent android-activity

我正在尝试从android中的类安装CA证书。这就是我在做的事。

//File1.java - This is a non-activity

ArrayList<String> CACertsList = new ArrayList<String>();
CACertsList.add(encodedCACert1);
CACertsList.add(encodedCACert2);

Context context = _serviceInstance.getServiceContext();
Intent intent = new Intent(context, CACertInstallActivity.class);
intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
intent.putExtra( "CERTDATA", CACertsList );
context.startActivity(intent);

实际活动

public class CACertInstallActivity extends Activity
{

   @Override
   public void onCreate( Bundle savedInstanceState )
   {
       super.onCreate( savedInstanceState );

       Bundle bundle = getIntent().getExtras();
       ArrayList<String> CACerts = bundle.getStringArrayList("CERTDATA");

       for( int i = 0; i < CACerts.size(); i++ )
       {
        try
        {
            // Convert base64encoded Cert data to byte array and converting it into X509 Certificate format
            byte[] certData = Base64.decode( CACerts.get(i) );
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            InputStream in = new ByteArrayInputStream(certData);
            X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in);

            // Start the install intent for the cert
            Intent intent = KeyChain.createInstallIntent();
            intent.addFlags( Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP );
            intent.putExtra( KeyChain.EXTRA_CERTIFICATE, cert.getEncoded() );
            intent.putExtra( KeyChain.EXTRA_NAME, cert.getIssuerDN().getName() );
            this.startActivityForResult(intent,2);
        }
        catch (CertificateException e1) 
        {
            e1.printStackTrace();
        }
        catch (IOException e1) 
        {
            e1.printStackTrace();
        }
    }



@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data )
{
   if( resultCode == RESULT_OK )
   {
        // Success
   }
   else
   {
        // Failed
   }

   super.onActivityResult(requestCode, resultCode, data);
}
}

清单声明

 <activity android:configChanges="orientation|screenSize|keyboard|keyboardHidden" android:name=".activity.CACertInstallActivity"/>    

我有两个问题。一个是当我安装多个证书时,只有一个证书安装提示即将出现。另一个是永远不会调用onActivityResult方法。任何人都可以找出我正在做的错误吗?

此外,createInstallIntent确实返回值

   * <p>When used with {@link Activity#startActivityForResult},
 * {@link Activity#RESULT_OK} will be returned if a credential was
 * successfully installed, otherwise {@link
 * Activity#RESULT_CANCELED} will be returned.

2 个答案:

答案 0 :(得分:2)

如果没有调用onActivityResult,请尝试更改context.startActivity(intent);的{​​{1}}

答案 1 :(得分:1)

可能会迟到,但startActivityForResult(intent, 2)不会从上下文调用,而是来自活动。

因此,从一个延伸 AppCompatActivity 活动的类中,您只需要调用:

startActivityForResult(intent, 2);

现在,关于你得到的错误,你可能已经解决了这个问题,但你必须等到onActivityResult才能启动另一个Intent来安装以下证书。

同时从您的意图中删除标记。

从我这边起,我基本上建立了一个队列(一个列表),它获取所有证书,然后处理这个列表,每次你继续onActivityResult,你只需启动下一个证书意图安装。

我现在唯一的问题是,如果有人点击&#34; 取消&#34;则不会调用onActivityResult功能。按钮。通常情况并非如此。