棉花糖系统中地图片段活动闪退问题

7

我正在使用FragmentActivity来加载地图。在Java类中,执行setContentView时出错。我的Mapsreen.java代码如下: 在一些设备上运行良好,在Marshmallow上会崩溃。还有其他原因吗?

public class MapScreen extends FragmentActivity implements LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_screen);
    ....

    SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    googleMap = fm.getMap();
}

    and my xml has fragment using SupportMapFragment as well. map_screen.xml is like :


    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" />

        <ImageView
            android:id="@+id/startActivityButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginLeft="50dp"
           android:layout_marginRight="50dp"
            android:layout_marginBottom="44dp"
           android:background="@drawable/end_meetup_btn"
         />

    </RelativeLayout>

我找不到同样的问题。在Marshmallow中出现崩溃:“二进制XML文件第7行:充气类片段错误”。请给出建议!尝试查找“Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.mkdir()' on a null object reference”。

    12-18 13:40:14.425: E/AndroidRuntime(8026): FATAL EXCEPTION: main
    12-18 13:40:14.425: E/AndroidRuntime(8026): Process: com.kindlebit.urban_exchange, PID: 8026
    12-18 13:40:14.425: E/AndroidRuntime(8026): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kindlebit.urban_exchange/com.kindlebit.urban_exchange.MapScreen}: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class fragment
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.ActivityThread.-wrap11(ActivityThread.java)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.os.Handler.dispatchMessage(Handler.java:102)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.os.Looper.loop(Looper.java:148)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.ActivityThread.main(ActivityThread.java:5417)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at java.lang.reflect.Method.invoke(Native Method)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    12-18 13:40:14.425: E/AndroidRuntime(8026): Caused by: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class fragment
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.Activity.setContentView(Activity.java:2166)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.kindlebit.urban_exchange.MapScreen.onCreate(MapScreen.java:109)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.Activity.performCreate(Activity.java:6237)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     ... 9 more
    12-18 13:40:14.425: E/AndroidRuntime(8026): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     ... 17 more
    12-18 13:40:14.425: E/AndroidRuntime(8026): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.mkdir()' on a null object reference
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.gmm6.m.ad.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.gmm6.c.h.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.gmm6.c.y.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.e.bd.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.e.ev.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.e.z.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.maps.api.android.lib6.e.y.a(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.maps.internal.u.onTransact(SourceFile:107)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.os.Binder.transact(Binder.java:387)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.dynamic.zza$4.zzb(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.dynamic.zza.zza(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1185)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1287)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2243)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:278)
    12-18 13:40:14.425: E/AndroidRuntime(8026):     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)

你在清单文件中指定了什么? - Pankaj
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="key" /> - Heena Arora
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> - Heena Arora
5个回答

4
问题出在“Micro-max Android one mobile”上,这是一个6.0 Marshmallow系统的设备。该设备没有足够的内部或外部存储空间,甚至没有SD卡。根据George在以下链接中的回答:NullPointerException from Google maps,我安装了存储卡,现在不再崩溃了。所以我发现问题是更新的Google Play服务需要空间(更新的Google照片),而我的设备空间不足。另外,一个错误行显示为“Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.mkdir()' on a null object reference”。我决定在安装SD卡后进行检查。结果它成功了。

多么大的一个错误啊! - Piyush
是的,你说得对。我在Micromax AQ4509上也遇到了同样的问题。 - Amol Suryawanshi
我想捕获这个错误并向最终用户显示一条消息,提示插入SD卡。 - Vinil Chandran

1
<!-- EXTERNAL_STORAGE permissions are optional for Android 6.0 onwards. -->
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="22" />
    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="22" />

将此内容添加到您的清单中。也许地图需要SD卡权限进行一些额外的缓存或其他操作。

1
问题已在Google Play服务库的9.0.83版本中得到修复。

0
在您的清单文件中添加SD卡权限。
    <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     />

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

0

这只是我做的一个变通方法。如果下面的检查失败,我会加载一个带有错误的片段,而不是加载地图。

/** Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接