在Android活动中未调用OnActivityResult()
我正在尝试从android中的类安装CA证书。这就是我正在做的在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
//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)
不是从上下文调用的,而是从活动调用的
因此,从扩展了AppCompatActivity或Activity的类中,您只需调用:
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