Приложение для Android отключается, когда режим полета выключен

#java #android-studio #google-maps #android-fragments

#java #android-studio #google-карты #android-фрагменты

Вопрос:

Я создаю приложение, в котором у меня есть фрагмент Карт Google. В моем onCreate() методе MainActivity я отображаю этот фрагмент Google Maps, который отлично работает во всех случаях, кроме режима полета. Если я отключу режим полета во время работы приложения, мое приложение отключится. Я попытался включить некоторые журналы, чтобы узнать, какие методы вызываются, и, по-видимому, следующие методы вызываются по порядку:

onPause() в MapFragment

onPause() в MainActivity

onCreate() в MainActivity

onResume() в MainActivity

и, наконец, приложение onMapReady(GoogleMap googleMap) загружается в MapFragment при вызове

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();
    }
}
 

Вот мой фрагмент карты

 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());
    }
}
 

Пожалуйста, помогите мне понять, что происходит, и отладить этот фрагмент кода.

Заранее благодарю вас.

Комментарии:

1. Я только что отредактировал свой пост, чтобы включить логическое

2. покажите свой код, пожалуйста

3. Я только что загрузил свой код MainActivity и MapsFragment

Ответ №1:

Измените onviewсозданный с помощью этой части кода. Надеюсь, это поможет.

 @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);
 

}

Комментарии:

1. Большое вам спасибо. Я только что попробовал это, и, по-видимому, я все еще получаю ту же ошибку: 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);
}
 

}

Комментарии:

1. Большое вам спасибо. Я просто попытался реализовать мой MapsFragment точно так, как вы предложили, но я все равно получаю NullPointerException . Я не знаю, может быть, проблема в устройстве, на котором я его тестирую, потому что я не понимаю, почему отключение режима полета запускает все эти методы в первую очередь ( onPause() , onResume как в, так MainActivity и в MapsFragment