Android — Исключение NullPointerException при запуске приложения с включенным GPS

#java #android #gps #google-maps-android-api-2

#java #Android #gps #google-карты-android-api-2

Вопрос:

Это мой код. Произошла ошибка, когда я запускаю приложение с включенным GPS. Это также означает, что при отключенном GPS приложение работает отлично.

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View v = inflater.inflate(R.layout.fragment_map, null, false);        

        map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map))
                .getMap();
        map.setMyLocationEnabled(true);

        LocationManager lm=(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
        Criteria c = new Criteria();
        String provider = lm.getBestProvider(c, false);

        final TextView switchStatus = (TextView) v.findViewById(R.id.switchStatus);
        Switch mySwitch = (Switch) v.findViewById(R.id.gpsSwitch);

        boolean statusOfGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        if (statusOfGPS){
            mySwitch.setChecked(true);
            switchStatus.setText("GPS Switch is currently ON");
        }
        else{               
            mySwitch.setChecked(false);
            switchStatus.setText("GPS Switch is currently OFF");
        }

        mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {           
          if(isChecked){
           switchStatus.setText("GPS Switch is currently ON");
           Intent viewIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
           startActivity(viewIntent);         
          }else{
           switchStatus.setText("GPS Switch is currently OFF");
          }           
         }
        });

        //check the current state before we display the screen
        if(mySwitch.isChecked()){
         switchStatus.setText("GPS Switch is currently ON");
        }
        else {
         switchStatus.setText("GPS Switch is currently OFF");
        }

        Location l = lm.getLastKnownLocation(provider);

        if(l!=null)
        {
            onLocationChanged(l);   
        }

        lm.requestLocationUpdates(provider, 20000, 0, this);

        return v;
}

    @Override
    public void onLocationChanged(Location location) {
        TextView ln=(TextView)getView().findViewById(R.id.lng);
        TextView lt=(TextView)getView().findViewById(R.id.lat);

        // Getting latitude of the current location
        double latitude = location.getLatitude();

        // Getting longitude of the current location
        double longitude = location.getLongitude();     

        // Creating a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

        Marker myLoc = map.addMarker(new MarkerOptions()
        .position(latLng)
        .title("MyLocation")
        .snippet("I am at ")
        .icon(BitmapDescriptorFactory
            .fromResource(R.drawable.ic_launcher)));

        // Showing the current location in Google Map
        map.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        // Zoom in the Google Map
        map.animateCamera(CameraUpdateFactory.zoomTo(15));  

        ln.setText("long: " longitude);
        lt.setText("lat: " latitude);
    }

    @Override
    public void onProviderDisabled(String provider) {
        if (provider.equals("gps")){
            TextView ln=(TextView) getView().findViewById(R.id.lng);
            ln.setText("GPS is OFF");
        }

    }

    @Override
    public void onProviderEnabled(String provider) {
        if (provider.equals("gps")){
            TextView ln=(TextView) getView().findViewById(R.id.lng);
            ln.setText("GPS is ON... wait for updates");
        }

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }
 

Вот журнал ошибок, но я не знаю, какая часть моего кода выдает ошибку.

     06-22 13:18:21.639: E/AndroidRuntime(26702): FATAL EXCEPTION: main
    06-22 13:18:21.639: E/AndroidRuntime(26702): java.lang.NullPointerException
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at com.gpsocial.fragments.MapFragment.onLocationChanged(MapFragment.java:103)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at com.gpsocial.fragments.MapFragment.onCreateView(MapFragment.java:93)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1064)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.view.ViewPager.populate(ViewPager.java:911)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.View.measure(View.java:16848)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.View.measure(View.java:16848)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.View.measure(View.java:16848)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.View.measure(View.java:16848)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2191)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1354)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1537)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1251)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6379)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.Choreographer.doCallbacks(Choreographer.java:591)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.Choreographer.doFrame(Choreographer.java:561)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.os.Handler.handleCallback(Handler.java:730)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.os.Handler.dispatchMessage(Handler.java:92)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.os.Looper.loop(Looper.java:137)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at android.app.ActivityThread.main(ActivityThread.java:5493)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at java.lang.reflect.Method.invokeNative(Native Method)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at java.lang.reflect.Method.invoke(Method.java:525)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
    06-22 13:18:21.639: E/AndroidRuntime(26702):    at dalvik.system.NativeStart.main(Native Method)
 

Кто-нибудь может помочь с этим? Это было бы очень ценно.

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

1. Что такое строка 103 com.gpsocial.fragments.MapFragment ?

2. @Raghunandan это имя моего класса.

3. что такое строка 103 в этом классе??

Ответ №1:

Вы не можете использовать getView() from onCreateView() . Он возвращает значение null именно потому, что вы на самом деле еще не закончили выполнение onCreateView() .

Вероятно, лучшим вариантом было бы отложить этот вызов до более позднего этапа жизненного цикла. Например, использование onStart() было бы хорошим выбором.

Другим возможным обходным путем было бы назначить возвращаемое представление переменной memeber, например:

 private View mMainView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View v = inflater.inflate(R.layout.fragment_map, null, false);
    mMainView = v;
    ...
}
 

А затем используйте mMainView in onLocationChanged() .

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

1. @Адриан, я рад. Пожалуйста, не забудьте принять ответ, если он был полезен 😉