什么时候在应用程序中调用 OnResult? (结果回调)
When is OnResult called in an application ? (ResultCallback)
我从 google places api 开始,我正在尝试获取设备的当前位置,这是我到目前为止所做的,但我无法弄清楚代码的方式和时间内部 OnResult 被调用,因为其中的日志未在 logcat 中打印:
Log.d("2^^check1111","nside : beforee");
try {
if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
Log.d("2here now","yoyo0");
ActivityCompat.requestPermissions(getActivity(), new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 123);
}
Log.d("999here now","yoyo0");
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi.getCurrentPlace(mGoogleApiClient, null);
Log.d("888here now","after result");
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
@Override
public void onResult(@NonNull PlaceLikelihoodBuffer likelyPlaces) {
// utils.showLog(TAG, "" + likelyPlaces.getCount());
/// Toast.makeText(getActivity().getApplicationContext(),"inside : onResult",Toast.LENGTH_LONG).show();
Log.d("2^^check","nside : onResul");
if (likelyPlaces.getCount() > 0) {
// Toast.makeText(getActivity().getApplicationContext(),"inside :likely >0",Toast.LENGTH_LONG).show();
Log.d("2^^check2","nside :likely >0");
PlaceLikelihood placeLikelihood = likelyPlaces.get(0);
// String content = "";
if (placeLikelihood != null && placeLikelihood.getPlace() != null && !TextUtils.isEmpty(placeLikelihood.getPlace().getName())) {
Log.d("2^^check3","nside : placelikelihood not nu");
// Toast.makeText(getActivity().getApplicationContext(),"inside : placelikelihood not null",Toast.LENGTH_LONG).show();
LatLng FromLatLng = placeLikelihood.getPlace().getLatLng();
Log.d("2^^check4","4444"+FromLatLng);
// Toast.makeText(getActivity().getApplicationContext(),"inside : latlng :"+FromLatLng,Toast.LENGTH_LONG).show();
newLatLng = FromLatLng;
FromLat = FromLatLng.latitude;
FromLng = FromLatLng.longitude;
}
} else {
Toast.makeText(getActivity(), "Auto Location can't fetch", Toast.LENGTH_SHORT).show();
}
likelyPlaces.release();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
您需要在 AndroidManifest.xml
中设置 ACCESS_FINE_LOCATION
权限。如果未设置,则位置数据将不可用,并且永远不会发布结果。
您需要注册一个 API 密钥,否则将不会显示结果。
在这里注册:https://developers.google.com/places/android-api/signup
然后在您的 AndroidManifest.xml
中包含:
<application>
...
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY"/>
</application>
编辑:
所以我将你的代码添加到一个新项目中,发现 onResult()
从未执行过。然而,经过一些更改后,我能够让它工作。
首先,我将 activity 设为 FragmentActivity
然后我像这样使用 GoogleApiClient.Builder()
:
final GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Places.PLACE_DETECTION_API)
.addApi(Places.GEO_DATA_API)
.enableAutoManage(this, this)
.build();
执行此操作后,我看到 onResult()
正在执行。
我从 google places api 开始,我正在尝试获取设备的当前位置,这是我到目前为止所做的,但我无法弄清楚代码的方式和时间内部 OnResult 被调用,因为其中的日志未在 logcat 中打印:
Log.d("2^^check1111","nside : beforee");
try {
if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
Log.d("2here now","yoyo0");
ActivityCompat.requestPermissions(getActivity(), new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 123);
}
Log.d("999here now","yoyo0");
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi.getCurrentPlace(mGoogleApiClient, null);
Log.d("888here now","after result");
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
@Override
public void onResult(@NonNull PlaceLikelihoodBuffer likelyPlaces) {
// utils.showLog(TAG, "" + likelyPlaces.getCount());
/// Toast.makeText(getActivity().getApplicationContext(),"inside : onResult",Toast.LENGTH_LONG).show();
Log.d("2^^check","nside : onResul");
if (likelyPlaces.getCount() > 0) {
// Toast.makeText(getActivity().getApplicationContext(),"inside :likely >0",Toast.LENGTH_LONG).show();
Log.d("2^^check2","nside :likely >0");
PlaceLikelihood placeLikelihood = likelyPlaces.get(0);
// String content = "";
if (placeLikelihood != null && placeLikelihood.getPlace() != null && !TextUtils.isEmpty(placeLikelihood.getPlace().getName())) {
Log.d("2^^check3","nside : placelikelihood not nu");
// Toast.makeText(getActivity().getApplicationContext(),"inside : placelikelihood not null",Toast.LENGTH_LONG).show();
LatLng FromLatLng = placeLikelihood.getPlace().getLatLng();
Log.d("2^^check4","4444"+FromLatLng);
// Toast.makeText(getActivity().getApplicationContext(),"inside : latlng :"+FromLatLng,Toast.LENGTH_LONG).show();
newLatLng = FromLatLng;
FromLat = FromLatLng.latitude;
FromLng = FromLatLng.longitude;
}
} else {
Toast.makeText(getActivity(), "Auto Location can't fetch", Toast.LENGTH_SHORT).show();
}
likelyPlaces.release();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
您需要在 AndroidManifest.xml
中设置 ACCESS_FINE_LOCATION
权限。如果未设置,则位置数据将不可用,并且永远不会发布结果。
您需要注册一个 API 密钥,否则将不会显示结果。
在这里注册:https://developers.google.com/places/android-api/signup
然后在您的 AndroidManifest.xml
中包含:
<application>
...
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY"/>
</application>
编辑:
所以我将你的代码添加到一个新项目中,发现 onResult()
从未执行过。然而,经过一些更改后,我能够让它工作。
首先,我将 activity 设为 FragmentActivity
然后我像这样使用 GoogleApiClient.Builder()
:
final GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Places.PLACE_DETECTION_API)
.addApi(Places.GEO_DATA_API)
.enableAutoManage(this, this)
.build();
执行此操作后,我看到 onResult()
正在执行。