在Android活动中未调用OnActivityResult()

在Android活动中未调用OnActivityResult(),android,android-intent,android-activity,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.getServi

我正在尝试从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);
//File1.java-这是一个非活动
ArrayList CACertsList=新的ArrayList();
CACertsList.add(encodedCACert1);
CACertsList.add(encodedCACert2);
上下文上下文=_serviceInstance.getServiceContext();
意向意向=新意向(上下文,cacertinstalactivity.class);
intent.addFlags(intent.FLAG\u活动\u新任务);
intent.putExtra(“CERTDATA”,CACertsList);
背景。开始触觉(意图);
以及实际活动

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);
}
}
公共类CACertInstallActivity扩展活动
{
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle Bundle=getIntent().getExtras();
ArrayList CACerts=bundle.getStringArrayList(“CERTDATA”);
对于(int i=0;i
舱单声明

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

我有两个问题。一个是当我安装多个证书时,只有一个证书安装提示出现。另一个是从未调用onActivityResult方法。有人能找出我所做的错误吗

此外,CreateSinstallIntent不会返回值

   * <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.
*与{@link Activity#startActivityForResult}一起使用时,
*如果创建了凭据,将返回{@link Activity#RESULT_OK}
*已成功安装,否则{@link
*将返回活动#结果_取消}。

对于未调用onActivityResult,请尝试更改
上下文。startActivity(intent);
对于
上下文。startActivityForResult(intent);
可能已经晚了,但是
startActivityForResult(intent,2)
不是从上下文调用的,而是从活动调用的

因此,从扩展了AppCompatActivityActivity的类中,您只需调用:

startActivityForResult(intent, 2);
现在,关于您遇到的错误,您可能已经解决了这个问题,但是您必须等待
onActivityResult
之后才能开始安装以下证书

同时从您的意图中删除标志

在我这边,我基本上创建了一个队列(一个列表),它接收所有证书,然后处理这个列表,每次在ActivityResult上执行
,您只需启动下一个证书安装


我现在唯一的问题是,如果有人单击“取消””按钮,则不会调用
onActivityResult
函数。通常情况下,情况不应该是这样。

是钥匙链活动(您从startActivityForResult开始的活动)singleInstance?您还可以放置android清单吗?keychain活动是由keychain API@android.security.keychain提供的,我猜,它删除了您添加的标志(以intent.addFlags(…)开头的行)应该可以解决问题。如果可行,我将解释原因:)@Semih删除CACertInstallActivity intent上的标志并没有调用ActivityForresult。删除File1.java上的标志导致异常。ServiceContext没有可用的startActivityForResult