java - 获取离用户最近的医院名称,而无需使用实际的 Google 地图,只需使用地点 api
问题描述
我需要该应用程序找到用户最近的医院的名称并将其显示在 TextView 中,我见过的唯一示例是使用带有位置 API 的实际谷歌地图但是我需要使用 Places api 来工作得到医院的名称并返回。这是我到目前为止的代码(这里我尝试了日志名称):
private void findHospital() {
List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME);
FetchPlaceRequest fetchPlaceRequest = FetchPlaceRequest.builder("Hospital",placeFields).build();
placesClient.fetchPlace(fetchPlaceRequest).addOnSuccessListener(new OnSuccessListener<FetchPlaceResponse>() {
@Override
public void onSuccess(FetchPlaceResponse fetchPlaceResponse) {
Place place = fetchPlaceResponse.getPlace();
Log.i("Hospital","Place found" + place.getName());
}
});
}
但是代码会引发错误,这是 logcat:
2020-04-10 16:15:32.877 24773-24773/com.example.blooddonorsystem E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.blooddonorsystem, PID: 24773
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.blooddonorsystem/com.example.blooddonorsystem.HospitalInNeedActivity}: java.lang.IllegalStateException: Places must be initialized first.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.IllegalStateException: Places must be initialized first.
at com.google.android.libraries.places.internal.zzft.zzb(com.google.android.libraries.places:places@@2.2.0:11)
at com.google.android.libraries.places.api.Places.zza(com.google.android.libraries.places:places@@2.2.0:36)
at com.google.android.libraries.places.api.Places.createClient(com.google.android.libraries.places:places@@2.2.0:30)
at com.example.blooddonorsystem.HospitalInNeedActivity.onCreate(HospitalInNeedActivity.java:76)
at android.app.Activity.performCreate(Activity.java:7825)
at android.app.Activity.performCreate(Activity.java:7814)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
编辑:
修复了权限问题,现在我在调试中得到了这个:
W/looddonorsyste: Accessing hidden method Lsun/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object; (greylist, linking, allowed)
W/looddonorsyste: Accessing hidden method Lsun/misc/Unsafe;->getInt(Ljava/lang/Object;J)I (greylist, linking, allowed)
D/TransportRuntime.SQLiteEventStore: Storing event with priority=DEFAULT, name=LE for destination cct
D/TransportRuntime.JobInfoScheduler: Upload for context TransportContext(cct, DEFAULT, ) is already scheduled. Returning...
D/TransportRuntime.SQLiteEventStore: Storing event with priority=DEFAULT, name=LE for destination cct
D/TransportRuntime.JobInfoScheduler: Upload for context TransportContext(cct, DEFAULT, ) is already scheduled. Returning...
解决方案
您必须首先初始化 google places sdk。
if (!Places.isInitialized()) {
Places.initialize(getApplicationContext(), getString(R.string.api_key), Locale.US);
}
推荐阅读
- angular - Angular 8 - 如何使用 ngxbootstrap/datepicker 仅显示日期和月份
- ionic-framework - ionic 6 websocket客户端cordova插件
- ios - Paypal Native Checkout SDK 抛出错误 - 在 Swift 5 中“无法加载模块 'PayPalCheckout”
- google-bigquery - 如何禁用 Google Big Query 中的预览功能?
- reactjs - 在 Heroku 上构建 Parcel React 应用程序失败
- ios - AVAudioPlayer 播放断断续续且无限?
- pos - 发布 DUKPT 密钥管理时 TermApp Postillion 上的 PIN 转换错误
- rspec - Rspec使用具有`before_validation`回调的范围验证唯一性
- boolean - 使用 9 位加法器进行 9 位减法
- java - 当我尝试 Blaze Persistence 文档示例时发生 ClassCastException