OnActivityResult не вызывается, если не запрашиваются разрешения - PullRequest
0 голосов
/ 21 ноября 2018

Мое приложение запускает действие из другого пакета с 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>
...