为什么 LocationSettingsResult startResolutionForResult 不调用 onActivityResult?
Why is LocationSettingsResult startResolutionForResult not calling onActivityResult?
我看过这个问答。这不是同一个问题,因为一切都已经在 Activity 中完成了。
所使用的代码几乎是 Google Play 服务示例中给出的代码。
我有一个 activity、LocationActivity
,它连接到 GoogleApiClient 以获取用户的位置。连接后,我创建一个 LocationSettingsRequest
以确保位置设置已打开。 activity 正在实施 ResultCallback<LocationSettingsResult>
.
ResultCallback<LocationSettingsResult>.onResult()
被调用,如果 result.getStatus().getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIRED
则调用 status.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 上也不再运行。
您可以查看 Google Play Location Sample 因为您的代码与它非常相似。
据我所知,您的样本可能不会调用 onResult(),因为情况并非如此 LocationSettingsStatusCodes.RESOLUTION_REQUIRED
。它不调用 startResolutionForResult
或其中的底层 setActivityForResult
。
嗯,我觉得很傻。我的 Activity 在清单中有 noHistory="true"
,所以当另一个 Activity 启动时,没有什么可返回的。
在我的例子中出现了这个错误:
我用过
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);
}
因为当我使用 main activity
public class myAct extends AGoogleDriveBase implements ... {
//...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
未调用超级方法(此字符串不存在):
super.onActivityResult(requestCode, resultCode, data);
如果您是 运行 Fragment 中的此代码,则不要使用 startResolutionForResult()。而是使用
startIntentSenderForResult(status.getResolution().getIntentSender(), REQUEST_CODE_LOCATION_SETTING, null, 0, 0, 0, null);
和您的片段中的覆盖程序 onaActivityResult()。
结果将仅传递给此方法。
如果有人偶然发现了这个问题,gianlucaparadise 的回答是解决这个问题的更好方法之一。答案虽然删了,但是增加了很多价值。
我看过这个问答
所使用的代码几乎是 Google Play 服务示例中给出的代码。
我有一个 activity、LocationActivity
,它连接到 GoogleApiClient 以获取用户的位置。连接后,我创建一个 LocationSettingsRequest
以确保位置设置已打开。 activity 正在实施 ResultCallback<LocationSettingsResult>
.
ResultCallback<LocationSettingsResult>.onResult()
被调用,如果 result.getStatus().getStatusCode() == LocationSettingsStatusCodes.RESOLUTION_REQUIRED
则调用 status.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 上也不再运行。
您可以查看 Google Play Location Sample 因为您的代码与它非常相似。
据我所知,您的样本可能不会调用 onResult(),因为情况并非如此 LocationSettingsStatusCodes.RESOLUTION_REQUIRED
。它不调用 startResolutionForResult
或其中的底层 setActivityForResult
。
嗯,我觉得很傻。我的 Activity 在清单中有 noHistory="true"
,所以当另一个 Activity 启动时,没有什么可返回的。
在我的例子中出现了这个错误: 我用过
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);
}
因为当我使用 main activity
public class myAct extends AGoogleDriveBase implements ... {
//...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
未调用超级方法(此字符串不存在):
super.onActivityResult(requestCode, resultCode, data);
如果您是 运行 Fragment 中的此代码,则不要使用 startResolutionForResult()。而是使用
startIntentSenderForResult(status.getResolution().getIntentSender(), REQUEST_CODE_LOCATION_SETTING, null, 0, 0, 0, null);
和您的片段中的覆盖程序 onaActivityResult()。 结果将仅传递给此方法。
如果有人偶然发现了这个问题,gianlucaparadise 的回答是解决这个问题的更好方法之一。答案虽然删了,但是增加了很多价值。