Мое приложение запускает действие из другого пакета с startActivityForResult
.Я обнаружил проблемы, когда мое действие по запуску было воссоздано, и увидел, что onActivityResult
не вызывается в этом случае после возвращения запущенного действия.(Он вызывается правильно, если я не активирую воссоздание активности.)
Это шаги, которые я выполнил:
- Начало моей деятельности
- Нажмите кнопку, которая вызывает
startActivityForResult
в приложении ykDroid - Перевести мое приложение в фоновый режим.Это приводит к разрушению моей активности, поскольку я включил это в настройках разработчика Android
- Верните мое приложение на передний план (я вижу, что OnCreate вызывается)
- Проведите Yubikey NEO, который вызывает другойвозвращаемая активность.
- Посмотрите logcat, чтобы увидеть, что OnActivityResult не вызывается.
Я обнаружил, что если я вызываю RequestPermissions
для Permission.UseFingerprint, я получаю обратный вызов OnActivityResult даже после того, какактивный отдых.Понятия не имею почему.Кто-нибудь может объяснить это поведение?Может ли это быть связано с ykDroid?см. https://github.com/pp3345/ykDroid для их исходного кода.
Вот что я использовал для тестирования (Xamarin Android):
[Activity(Label = "@string/app_name", Theme = "@style/MyTheme")]
public class DatabaseSettingsActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.yubichall_test);
FindViewById<Button>(Resource.Id.btn_yubichall).Click += (sender, args) =>
{
byte[] challenge64 = new byte[64];
for (int i = 0; i < 64; i++)
{
challenge64[i] = (byte) i;
}
var chalIntent = TryGetYubichallengeIntentOrPrompt(challenge64, true);
StartActivityForResult(chalIntent, 123);
};
//Uncomment this and it will work
/* if ((int)Build.VERSION.SdkInt >= 23)
RequestPermissions(new[] { Manifest.Permission.UseFingerprint }, 99);*/
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
Kp2aLog.Log("OnActivityResult: " + requestCode);
if (resultCode == Result.Ok)
{
byte[] challengeResponse = data.GetByteArrayExtra("response");
if ((challengeResponse != null) && (challengeResponse.Length > 0))
{
FindViewById<TextView>(Resource.Id.text_result).Text =
MemUtil.ByteArrayToHexString(challengeResponse);
}
}
}
public Intent TryGetYubichallengeIntentOrPrompt(byte[] challenge, bool promptToInstall)
{
Intent chalIntent = new Intent("net.pp3345.ykdroid.intent.action.CHALLENGE_RESPONSE");
chalIntent.PutExtra("challenge", challenge);
IList<ResolveInfo> activities = PackageManager.QueryIntentActivities(chalIntent, 0);
bool isIntentSafe = activities.Count > 0;
if (isIntentSafe)
{
return chalIntent;
}
if (promptToInstall)
{
//please install https://play.google.com/store/apps/details?id=net.pp3345.ykdroid&hl=en
}
return null;
}
}
, где макет yubicall_test равен
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<Button android:id="@+id/btn_yubichall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="yubi challenge"
/>
<TextView
android:id="@+id/text_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>