【问题标题】:Android App crushes when airplane mode is turned off关闭飞行模式时 Android 应用程序崩溃
【发布时间】:2021-03-15 08:22:58
【问题描述】:

我正在构建一个应用程序,其中有一个 Google 地图片段。在我的 MainActivity onCreate() 方法中,我显示了这个谷歌地图片段,它在所有情况下都可以正常工作,除了飞行模式。如果我在应用程序运行时关闭飞行模式,我的应用程序就会崩溃。我试图包含一些日志以查看调用了哪些方法,显然,按顺序调用了以下方法:

onPause() 在 MapFragment 中

onPause() 在 MainActivity

onCreate() 在 MainActivity

onResume() 在 MainActivity

最后,当我调用时,应用程序在 MapFragment 中的 onMapReady(GoogleMap googleMap) 中崩溃

MapsInitializer.initialize(getActivity());

我不明白的是在关闭飞行模式时如何以及为什么调用这些方法以及如何防止应用程序崩溃。

这是错误的堆栈跟踪

2020-12-03 05:32:44.070 700-700/com.example.mutapamaps E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mutapamaps, PID: 700
    java.lang.NullPointerException: Context is null
        at com.google.android.gms.common.internal.Preconditions.checkNotNull(com.google.android.gms:play-services-basement@@17.3.0:11)
        at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source)
        at com.example.mutapamaps.Fragments.MapFragment.onMapReady(MapFragment.java:218)
        at com.google.android.gms.maps.zzac.zza(Unknown Source)
        at com.google.android.gms.maps.internal.zzaq.dispatchTransaction(Unknown Source)
        at com.google.android.gms.internal.maps.zzb.onTransact(Unknown Source)
        at android.os.Binder.transact(Binder.java:504)
        at dt.aZ(:com.google.android.gms.dynamite_mapsdynamite@204516046@20.45.16 (040306-0):2)
        at com.google.maps.api.android.lib6.impl.bi.run(:com.google.android.gms.dynamite_mapsdynamite@204516046@20.45.16 (040306-0):1)
        at android.os.Handler.handleCallback(Handler.java:836)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6251)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

这是我的 MainActivity

public class MainActivity extends AppCompatActivity{

    public static FragmentManager fragmentManager;
    public static final String LOG_TAG = "LOG_TAG";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(LOG_TAG, "Main activity created");
        super.onCreate(savedInstanceState);

        // init airplane mode receiver
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
                if(isAirplaneModeOn){
                    Log.i(LOG_TAG, "Airplane mode turned on");// handle Airplane Mode on
                } else {
                    Log.i(LOG_TAG, "Airplane mode turned off");
                }
            }
        };
        this.registerReceiver(receiver, intentFilter);


        setContentView(R.layout.activity_main);
        fragmentManager = getSupportFragmentManager();
        displayFragment(new MapFragment());
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.i(LOG_TAG, "Main activity paused");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.i(LOG_TAG, "Main activity resumed");
    }


    public void displayFragment(Fragment fragmentActivity){

        // start the transaction
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragmentActivity).
                    addToBackStack(fragmentActivity.getClass().getSimpleName()).commit();
    }
}

这是我的 MapFragment

public class MapsFragment extends Fragment implements
        OnMapReadyCallback {


    public MapsFragment() {
        // Required empty public constructor
        super();
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_map, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        FrameLayout map_frame = view.findViewById(R.id.map_frame);

        // configure map
        MapView mapFragment = view.findViewById(R.id.map_view);
        mapFragment.onCreate(savedInstanceState);
        mapFragment.onResume();
        mapFragment.getMapAsync(this);
        View mapView = mapFragment.getRootView();
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i(LOG_TAG, "MapFragment resumed");
    }


    @Override
    public void onPause() {
        super.onPause();
        Log.i(LOG_TAG, "Map fragment paused");
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        Log.i(LOG_TAG, "onMapReadyCalled");
        MapsInitializer.initialize(getActivity());
    }
}

请您帮助我了解发生了什么并调试这段代码。

提前谢谢你。

【问题讨论】:

  • 我刚刚编辑了我的帖子以包含逻辑
  • 请出示您的代码
  • 我刚刚上传了我的 MainActivity 和 MapsFragment 代码

标签: java android-studio google-maps android-fragments


【解决方案1】:

使用这部分代码更改 onViewCreated。希望对您有所帮助。

@Override
 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
 FrameLayout map_frame = view.findViewById(R.id.map_frame);

 // configure map
 MapView mapFragment = view.findViewById(R.id.map_view);
 mapFragment.onCreate(savedInstanceState);
 mapFragment.onResume();
 mapFragment.getMapAsync(this);
 View mapView = mapFragment.getRootView();
 super.onViewCreated(mapView , savedInstanceState);

}

【讨论】:

  • 非常感谢。我刚刚尝试过,显然我仍然遇到同样的错误:java.lang.NullPointerException: Context is null,当我打电话给MapsInitializer.initialize(getActivity())时它仍然会发生
【解决方案2】:

用这个替换你的 MapsFragment。

public class MapsFragment extends Fragment implements
    OnMapReadyCallback {

  Context context;


public MapsFragment() {
    // Required empty public constructor
    super();
}

    @Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_map, container, false);
}


@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    FrameLayout map_frame = view.findViewById(R.id.map_frame);

    // configure map
    MapView mapFragment = view.findViewById(R.id.map_view);
    mapFragment.onCreate(savedInstanceState);
    mapFragment.onResume();
    mapFragment.getMapAsync(this);
    View mapView = mapFragment.getRootView();
    super.onViewCreated(view, savedInstanceState);
}

@Override
public void onResume() {
    super.onResume();
    Log.i(LOG_TAG, "MapFragment resumed");
}


@Override
public void onPause() {
    super.onPause();
    Log.i(LOG_TAG, "Map fragment paused");
}

@Override
public void onMapReady(GoogleMap googleMap) {
    Log.i(LOG_TAG, "onMapReadyCalled");
    MapsInitializer.initialize(context);
}

}

【讨论】:

  • 非常感谢。我刚刚尝试完全按照您的建议实现我的MapsFragment,但我仍然得到NullPointerException。我不知道问题是否出在我正在测试它的设备上,因为我不明白的一个主要问题是为什么关闭飞行模式会首先触发所有这些方法(onPause()onResume MainActivityMapsFragment
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2012-11-06
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2018-03-04
  • 2013-08-18
  • 2017-10-14
相关资源
最近更新 更多