我可以将ResolvableApiException传递给新活动吗?

时间:2019-03-06 22:06:31

标签: android google-play-services google-location-services

我正在使用Google Play服务来获取用户的位置(软件包com.google.android.gms:play-services-location:16.0.0)。如here所述,您可以根据需要通过使用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的{​​{1}},所以我希望可以添加Serializable作为可序列化的附加内容。但是看来resolvable的{​​{1}}字段不可序列化。

关于如何使这种方法起作用或可以通过点击通知来触发对话框的另一种方法有何建议?谢谢!

2 个答案:

答案 0 :(得分:2)

我现在有一个可行的解决方案!

关键是使用getResolution()而不是startResolutionForResult(),如here所述。 getResolution()返回挂起的意图,该意图是可打包的,并且可以附加到在点击通知时启动的新活动的意图:

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 :(得分:1)

看起来Status是可打包的,而不是序列化整个异常,您可以从状态重新创建ResolvableApiException

// 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);