我正在尝试从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.
答案 0 :(得分:2)
如果没有调用onActivityResult,请尝试更改context.startActivity(intent);
的{{1}}
答案 1 :(得分:1)
可能会迟到,但startActivityForResult(intent, 2)
不会从上下文调用,而是来自活动。
因此,从一个延伸 AppCompatActivity 或活动的类中,您只需要调用:
startActivityForResult(intent, 2);
现在,关于你得到的错误,你可能已经解决了这个问题,但你必须等到onActivityResult
才能启动另一个Intent来安装以下证书。
同时从您的意图中删除标记。
从我这边起,我基本上建立了一个队列(一个列表),它获取所有证书,然后处理这个列表,每次你继续onActivityResult
,你只需启动下一个证书意图安装。
我现在唯一的问题是,如果有人点击&#34; 取消&#34;则不会调用onActivityResult
功能。按钮。通常情况并非如此。