在APK构建执行期间Google地图崩溃

时间:2016-10-20 05:36:44

标签: android google-maps android-gradle assert debug-build

我在我的应用中使用谷歌地图。我试图在包含Map的Fragment中使用MapView和SupportMapFragment。 出现的问题导致谷歌地图在地图初始化过程中(在我测试的所有设备中)之后崩溃,但是当从Android Studio(使用Run)运行时,它按预期工作。这是堆栈跟踪(我在所有执行中得到的都是AssertionError):

  

10-19 12:17:27.244 2256-2638 / com.google.android.gms E / BaseAppContext:尝试停止全局GMSCore RequestQueue。这可能是无意的,所以无视。   10-19 12:17:28.640 1921-1921 / com.google.android.gms.persistent E / BluetoothAdapter:蓝牙绑定器为空   10-19 12:17:29.537 1921-1921 / com.google.android.gms.persistent E / BluetoothAdapter:蓝牙活页夹为空   10-19 12:17:29.542 2256-2677 / com.google.android.gms E / MDM:[142] rpv.a:无法连接到Google API客户端:ConnectionResult {statusCode = API_UNAVAILABLE,resolution = null,message = NULL}   10-19 12:17:30.112 1921-1921 / com.google.android.gms.persistent E / ChimeraRcvrProxy:找不到Chimera接收器impl类com.google.android.gms.auth.setup.devicesignals.LockScreenChimeraReceiver,丢弃广播   10-19 12:17:31.602 2393-2501 / com.app E / Surface:getSlotFromBufferLocked:未知缓冲区:0xaa112310   10-19 12:17:36.351 2776-2782 /? E / art:向调试器发送回复失败:管道损坏   10-19 12:17:37.267 1269-1617 /? E / SurfaceFlinger:ro.sf.lcd_density必须定义为构建属性   10-19 12:17:46.449 1269-1269 /? E / EGL_emulation:tid 1269:eglCreateSyncKHR(1370):错误0x3004(EGL_BAD_ATTRIBUTE)   10-19 12:17:47.050 2393-2501 / com.app E / Surface:getSlotFromBufferLocked:未知缓冲区:0xaa112700      [10-19 12:17:47.094 2393:2842 D /]   HostConnection :: get()建立新主机连接0xb4050b90,tid 2842   10-19 12:17:47.222 1899-2797 / com.android.inputmethod.latin E / Surface:getSlotFromBufferLocked:unknown buffer:0xae4428c0   10-19 12:17:48.704 2393-2769 / com.app E / UncaughtException:java.lang.AssertionError   在com.google.a.b.a.m $ a。(未知来源)   在com.google.a.b.a.m $ 19.a(未知来源)   在com.google.a.f.a(未知来源)   在com.google.a.b.a.b.a(未知来源)   在com.google.a.f.a(未知来源)   在com.google.a.b.a.i.a(未知来源)   在com.google.a.b.a.i.a(未知来源)   在com.google.a.b.a.i $ 1.(未知来源)   在com.google.a.b.a.i.a(未知来源)   在com.google.a.b.a.i.a(未知来源)   

如此处所述,我在build gradle中声明了API密钥: Google Maps Signed APK Android

我如何初始化地图的代码示例:

public class MainMapFragment extends BaseFragment implements{...
    @Override
public void onCreate(Bundle savedInstanceState) {
    Log.d(Consts.TAGS.FRAG_MAIN_MAP,"BEGIN onCreate()");
    super.onCreate(savedInstanceState);

    FragmentManager fm = getChildFragmentManager();
    _mapFragment = (SupportMapFragment) fm.findFragmentByTag(Consts.TAGS.UTIL_MAP);
    if (_mapFragment == null) {
        Log.d(Consts.TAGS.FRAG_MAIN_MAP,"mapFragment is null. creating new map...");
        _mapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.map_container, _mapFragment).commit();
        _mapFragment.getMapAsync(this);
    }
@Override
public void onMapReady(GoogleMap googleMap) {
    Log.d(Consts.TAGS.FRAG_MAIN_MAP,"BEGIN onMapReady()");
    _map = googleMap;
    //_map.setInfoWindowAdapter(this);
    _map.setInfoWindowAdapter(new CDInfoWindowAdapter(getActivity(),_markersPos));
    _map.setOnInfoWindowClickListener(this);
    _map.setPadding(120, 120, 170, 200);
    MapsInitializer.initialize(getActivity());        
    initilizeMap();
}

}

这是片段布局:

<RelativeLayout tools:context=".MainMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map_container"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
 <!--<fragment-->
        <!--android:id="@+id/map"-->
        <!--android:name="com.google.android.gms.maps.SupportMapFragment"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="match_parent"-->
        <!--/>-->
 <!--<com.google.android.gms.maps.MapView-->
     <!--xmlns:android="http://schemas.android.com/apk/res/android"-->
     <!--android:layout_width="match_parent"-->
     <!--android:layout_height="match_parent"-->
     <!--android:id="@+id/map_view"-->
     <!--/>
-->
</RelativeLayout>

如果代码在“运行”模式下工作但在“构建APK”模式下无效,可能会出现什么问题?

3 个答案:

答案 0 :(得分:2)

你已经采取了一种正确的方法来获得用于烧录APK的SHA-1密钥。我想,您应该检查开发人员控制台上的注册密钥并将两个密钥放在那里:debug和release。如果两者都在寻找包名称,请确保它是清单文件中定义的内容。然后等待几分钟,直到服务器配置好您的密钥。希望能帮助到你。祝你好运

答案 1 :(得分:1)

您的apk的地图密钥似乎有问题。您是否为您的包生成了一个新密钥以及用于构建apk的已用密钥?

答案 2 :(得分:0)

我为了纠正它而做了些什么(因为该应用尚未准备好投放,而Google API和SDK试图使用与apk版本类型无关的密钥)配置gradle build以按预期工作:

    buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
        **debuggable true**
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        resValue "string", "google_maps_api_key", "***************"
    }
}