选择地点或尝试返回时,Android地方选择器会显示空白屏幕

时间:2016-06-14 21:22:44

标签: java android google-maps google-places-api

我正在尝试在我的Android应用中实施Google Maps Places API。

单击按钮时,它会打开位置选择器,拾取器工作正常(您可以四处移动,放大和缩小,搜索并转到当前位置),直到您尝试单击“选择此位置”为止按钮;单击按钮时,将打开一个空白屏幕,唯一的选择是关闭应用程序。 按下后退按钮时会出现同样的情况(导航栏或AppBar中的按钮)

Image: Inside the Place Picker Activity

Image: Blank Screen

几周前工作正常,然后它停止工作,一天前它再次开始工作,今天它停止了工作。

打开地方选择器的代码:

    private void openPlacePicker() {
       Log.i(TAG, "open place picker");

       PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
       try { 
           startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST);                          
       }
       catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) {
           e.printStackTrace();
       }
    }

是的,我在执行该功能之前已经为ACCESS_FINE_LOCATION添加了权限检查。

活动结果代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i(TAG, "onActivityResult");
    if (requestCode == PLACE_PICKER_REQUEST) {
        if (resultCode == RESULT_OK) {
            final Place place = PlacePicker.getPlace(this, data);
    (...)

我的日志没有显示任何错误,并且未调用OnActivityResult日志:

D/libgps: proxy_gps_stop: called.
D/libgps: proxy_gps_status_cb: called.
D/libgps: proxy_gps_status_cb: called.
I/art: Background partial concurrent mark sweep GC freed 58725(4MB) AllocSpace objects, 23(2MB) LOS objects, 40% free, 14MB/23MB, paused 1.422ms total 101.850ms
D/gpsd: WakeLock(Release,GPSD)
I/Auth: [AuthDelegateWrapper] Service intent: Intent { cmp=com.google.android.gms/.auth.account.authenticator.DefaultAuthDelegateService }.
I/Auth: [AuthDelegateWrapper] Service intent: Intent { cmp=com.google.android.gms/.auth.account.authenticator.DefaultAuthDelegateService }.
I/Auth: [AuthDelegateWrapper] Service intent: Intent { cmp=com.google.android.gms/.auth.account.authenticator.DefaultAuthDelegateService }.
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
I/GCoreUlr: Successfully inserted 1 locations
I/WifiHAL: Got channel list with 11 channels
I/WifiHAL: Got channel list with 9 channels
I/WifiHAL: Got channel list with 13 channels
W/ActivityManager: Launch timeout has expired, giving up wake lock!

我的清单元数据和权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    (...)

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AIza(...)" />
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

我已在Google控制台页面中检查,包名称和SHA-1指纹是否正确。 当我在概述&gt; Google Maps API&gt; Google Places API for Android&gt;用法,它显示没有使用什么,它应该显示一些,因为正如我之前所说,一天前它工作,我用它。

这个问题发生在我的Nexus 9(Android N)和Moto G3(Android M)上。

注意:在Moto G上它会第一次工作,用户点击一个按钮,打开选择器,用户点击选择器的“选择位置”按钮,转到上一个活动一切正常;但如果他再次点击按钮打开选择器,并且他再次尝试点击选择器的“选择位置”按钮,他将转到空白屏幕,并且必须关闭应用程序并再次尝试。

TLDR; 当我尝试选择一个位置或离开场地选择器活动时,我的Android应用程序中的场所选择器会变为空白屏幕。

由于

2 个答案:

答案 0 :(得分:1)

正如我之前的评论所指出的,我今天早些时候遇到了完全相同的问题。 为我解决的是取代:

compile 'com.google.android.gms:play-services:9.0.0'

compile 'com.google.android.gms:play-services-location:9.0.0'

此更改来自this Stack post

注意:如果您使用的不只是location库中的play-services,请确保包含其他组件,例如

compile "com.google.android.gms:play-services-games:9.0.0"
compile "com.google.android.gms:play-services-plus:9.0.0"
compile "com.google.android.gms:play-services-ads:9.0.0"

答案 1 :(得分:0)

此错误timeout has expired, giving up wake lock!表示您的活动需要很长时间才能启动。如果您在UI线程上进行大量处理,Android会杀死您的应用程序。您应该使用AsyncTask进行任何处理密集型操作。无法显示活动,因为它仍在尝试完成执行;同时ActivityManager已超时。

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

Asyntask的示例实现:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
}

protected void onProgressUpdate(Integer... progress) {
}

protected void onPostExecute(Long result) {
}
}

对于选择位置时的空白屏幕,请确保您拥有manifest file

中的权限
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/ >
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>