【问题标题】:Why is LocationSettingsResult startResolutionForResult not calling onActivityResult?为什么 LocationSettingsResult startResolutionForResult 没有调用 onActivityResult?
【发布时间】:2020-10-23 22:00:55
【问题描述】:

我看过这个问答LocationSettingsRequest dialog - onActivityResult() skipped。这不是同一个问题,因为一切都已经在 Activity 中完成了。

所使用的代码几乎是 Google Play 服务示例中给出的代码。

我有一个活动LocationActivity,它连接到 GoogleApiClient 以获取用户的位置。连接后,我创建一个LocationSettingsRequest 以确保已打开位置设置。该活动正在实施ResultCallback<LocationSettingsResult>

ResultCallback<LocationSettingsResult>.onResult() 被调用,如果result.getStatus().getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIREDstatus.startResolutionForResult(this, REQUEST_CHECK_SETTINGS) 被调用并显示对话框。 问题,无论选择什么,onActivityResult() 都不会被调用。

@Override
public void onConnected(Bundle connectionHint) {
    Log.i(TAG, "GoogleApiClient connected");
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
        .addLocationRequest(new LocationRequest().setPriority(LocationRequest.PRIORITY_LOW_POWER));

    PendingResult<LocationSettingsResult> result =
        LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());

    result.setResultCallback(this);
}

.

@Override
public void onResult(LocationSettingsResult result) {
    final Status status = result.getStatus();
    Log.d(TAG, "onResult() called with: " + "result = [" + status.getStatusMessage() + "]");
    switch (status.getStatusCode()) {
        case LocationSettingsStatusCodes.SUCCESS:
            getLocation();
            break;
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
            // Location settings are not satisfied. But could be fixed by showing the user
            // a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                status.startResolutionForResult(this, REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException e) {
                Log.d(TAG, "", e);
                // Ignore the error.
            }
            break;
        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
            showManualInputDialog();
            break;
    }
}

我从来没有到过这里:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult() called with: " + "requestCode = [" + requestCode + "], resultCode = [" + resultCode + "], data = [" + data + "]");
    switch (requestCode) {
        case REQUEST_CODE_RESOLUTION:
            retryConnecting();
            break;
        case REQUEST_CHECK_SETTINGS:
            if (resultCode == Activity.RESULT_OK) {
                getLocation();
            } else {
                showManualInputDialog();
            }
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
            break;
    }
}

顺便说一句。它在我的 S3 上工作了几次。据我所知,当我选择不再询问时,它停止了工作。但是,它从未在模拟器或 Tab 10 上运行过,并且不再适用于我的 S3。

【问题讨论】:

  • 你是否声明过 onActivity 结果在同一个活动中??

标签: android google-play-services


【解决方案1】:

如果您在 Fragment 中运行此代码,则不要使用 startResolutionForResult()。而是使用 startIntentSenderForResult(status.getResolution().getIntentSender(), REQUEST_CODE_LOCATION_SETTING, null, 0, 0, 0, null);

并在您的片段中覆盖 onaActivityResult()。 结果只会传递给这个方法。

【讨论】:

  • 你能说出你为什么建议这个吗,我之前这样放过,我在 crashlytics 中发现了一些崩溃 致命异常:java.lang.NullPointerException 尝试调用虚拟方法 'void android.app.Activity.startIntentSenderForResult (android.content.IntentSender, int, android.content.Intent, int, int, int)' 在空对象引用上 e.startResolutionForResult(activity, RequestCode.LOCATION_SETTING)
  • @Sirumalayil 没有其他方法可以在片段中实现这一点。
【解决方案2】:

嗯,我觉得很傻。我的 Activity 在 Manifest 中有 noHistory="true",所以当另一个 Activity 启动时,没有什么可以返回。

【讨论】:

  • 去过!我花了14天左右才意识到。当我发现这一点时,我既松了口气,又气愤
【解决方案3】:

在我的情况下,出现了这个错误: 我用过

public abstract class AGoogleDriveBase extends ABase implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {
//...
@Override
    protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
//...

并且这个函数不是用

调用的
try {
            result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
        } catch (SendIntentException e) {
            Log.e(TAG, "Exception while starting resolution activity", e);
        }

因为当我使用主要活动时

public class myAct extends AGoogleDriveBase implements ... {
//...
@Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {

未调用的超级方法(不存在此字符串):

 super.onActivityResult(requestCode, resultCode, data);

【讨论】:

    【解决方案4】:

    您可以查看Google Play Location Sample,因为您的代码非常相似。

    根据我对您的样本的了解,onResult() 可能不会被调用,因为案例不是LocationSettingsStatusCodes.RESOLUTION_REQUIRED。它没有调用startResolutionForResult 或其中的底层setActivityForResult

    【讨论】:

    • onResult() 正在被调用,LocationSettingsStatusCodes.RESOLUTION_REQUIRED 案例正在被击中,这会打开对话框以打开设置。在那之后,我的代码没有回调到onActivityResult()
    【解决方案5】:

    如果有人偶然发现了这个问题,gianlucaparadise 的回答是解决这个问题的更好方法之一。答案虽然删掉了,但是增加了很多价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 2021-03-25
      • 2019-03-31
      • 2014-08-26
      • 1970-01-01
      相关资源
      最近更新 更多