Могу ли я передать ResolvableApiException для нового действия? - PullRequest
1 голос
/ 07 марта 2019

Я использую Сервисы Google Play, чтобы узнать местоположение пользователя (пакет com.google.android.gms:play-services-location:16.0.0).Как описано здесь , вы можете предложить пользователю включить настройки местоположения, если необходимо, через диалоговое окно, которое запускается с помощью startResolutionForResult:

task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
    if (e instanceof ResolvableApiException) {
        try {
            ResolvableApiException resolvable = (ResolvableApiException) e;
            resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
        } catch (IntentSender.SendIntentException sendEx) {
            // Ignore the error.
        }
    }
}

Однако я хотел бы запустить этодиалоговое окно в новом действии началось с нажатия на уведомление.Для этого я пытаюсь добавить ResolvableApiException resolvable к цели для нового действия, чтобы я мог вызвать startResolutionForResult внутри нового класса деятельности.В частности, у меня есть:

final Intent intent = new Intent(context, NewActivity.class);
final Bundle extras = new Bundle();
extras.putSerializable(EXTRA_EXCEPTION, resolvable);
intent.putExtras(extras);

Я получаю следующую ошибку:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.google.android.gms.common.api.ResolvableApiException)
Caused by: java.io.NotSerializableException: com.google.android.gms.common.api.Status

ResolvableApiException в конечном счете наследуется от Throwable, который реализует Serializable, поэтому я надеялся, что яможет добавить resolvable в качестве сериализуемого дополнения.Но кажется, что поле ResolvableApiException Status не сериализуемо.

Какие-либо предложения о том, как я могу заставить этот подход работать, или другой подход, который я могу использовать, чтобы вызвать диалоговое окно, нажав на уведомление?Спасибо!

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

У меня теперь есть рабочее решение!

Ключ должен использовать getResolution() вместо startResolutionForResult(), как описано здесь .getResolution() возвращает ожидающее намерение, которое является Parcelable и может быть присоединено к намерению для нового действия, запущенного при нажатии уведомления:

final Intent intent = new Intent(context, NewActivity.class);
intent.putExtra(EXTRA_PENDING_INTENT, resolvable.getResolution());

Затем я могу извлечь ожидающее намерение в моем новом действии иЗапустите диалоговое окно с помощью startIntentSenderForResult():

@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
    ...

    final PendingIntent pendingIntent = getIntent().getParcelableExtra(EXTRA_PENDING_INTENT);

    try {
        startIntentSenderForResult(pendingIntent.getIntentSender(), RC_LOCATION_SETTINGS, null, 0, 0, 0);
    } catch (IntentSender.SendIntentException e) {
        // Ignore the error
    }
}

Такой подход с ожидающим намерением имеет гораздо больше смысла, поскольку позволяет выбирать, когда запускать диалоговое окно разрешения.

1 голос
/ 07 марта 2019

Вместо сериализации всего исключения, похоже, что Status является Parcelable, и вы можете воссоздать ResolvableApiException из Status.

// save to bundle
extras.putParcelable(EXTRA_RESOLVABLE_EXCEPTION_STATUS, e.getStatus());

А затем, чтобы получить, вы должны сделать следующее:

// get from bundle
Status status = bundle.getParcelable(EXTRA_RESOLVABLE_EXCEPTION_STATUS); // might have to cast as Status
ResolvableApiException resolvable = new ResolvableApiException(status);
...