首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >碎片NullPointerException全球定位系统

碎片NullPointerException全球定位系统
EN

Stack Overflow用户
提问于 2015-07-06 18:47:36
回答 3查看 307关注 0票数 1

我已经创建了一个操作栏导航选项卡布局,在其中一个选项卡中,我希望显示google并获取我的当前位置,我使用了LocationListener来获取位置,但这是重放错误,这是我的代码。

包装com.example.prototype.tabs;

代码语言:javascript
复制
import java.util.Timer;









import com.example.prototype.MainActivity;
import com.example.prototype.R;
import com.example.prototype.utility.GpsTracker;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.Circle;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.support.v4.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

public class NearByPlacesFragment extends Fragment  implements OnMapReadyCallback, LocationListener {

    GoogleMap gmap;
    Marker mp;
    LatLng ll;
    Location l;
    Context ctx=getActivity();
    double lat,lon;
    boolean isGpsEnabled,isNetworkAvailable,isLocationSet;
    LocationManager lmgr;
    long minTime = 60*1000*1;
    long minDistance = 10;
    Location loc;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.nearbyplaces, container, false);
         l=getLocation();
        if(l==null){Toast.makeText(getActivity(), "null", Toast.LENGTH_LONG).show();}
        SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);

        return rootView;

    }



    @Override
    public void onMapReady(GoogleMap map) {
        // TODO Auto-generated method stub

            map.getUiSettings().setAllGesturesEnabled(true);
            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            map.setMyLocationEnabled(true);
            if(l!=null)
            ll = new LatLng(l.getLatitude() , l.getLongitude());
            map.addMarker(new MarkerOptions().position(ll).title("Marker in Sydney"));


    }



     public Location getLocation(){

         lmgr=(LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);


         if(lmgr==null){Toast.makeText(getActivity(), "null manager", Toast.LENGTH_LONG).show();}


         isGpsEnabled=lmgr.isProviderEnabled(LocationManager.GPS_PROVIDER);
         isNetworkAvailable=lmgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

         if(isGpsEnabled==true){
        setLocationManager("gps");
         }
         else if(isNetworkAvailable==true){
             setLocationManager("network");
          }



         return loc;




     }

     private boolean setLocationManager(String s){

         if(s.equals("gps")){

                lmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, this);
                loc=lmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);        
         }

         else{

                lmgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, this);
                loc=lmgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);

         }


         return isLocationSet;
     }



    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

    }



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

    }



    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }



    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }








}

日志是:

代码语言:javascript
复制
07-07 00:05:02.424: E/dalvikvm(22824): Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zza
07-07 00:05:02.491: E/dalvikvm(22824): Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.ij.a
07-07 00:05:02.755: E/AndroidRuntime(22824): FATAL EXCEPTION: main
07-07 00:05:02.755: E/AndroidRuntime(22824): java.lang.NullPointerException
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.example.prototype.tabs.NearByPlacesFragment.getLocation(NearByPlacesFragment.java:92)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.example.prototype.tabs.NearByPlacesFragment.onCreateView(NearByPlacesFragment.java:62)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1105)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:551)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:494)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.example.prototype.MainActivity.onTabSelected(MainActivity.java:172)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:570)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:1067)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java:519)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.view.View.performClick(View.java:4211)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.view.View$PerformClick.run(View.java:17446)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.os.Handler.handleCallback(Handler.java:725)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.os.Looper.loop(Looper.java:153)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at android.app.ActivityThread.main(ActivityThread.java:5297)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at java.lang.reflect.Method.invokeNative(Native Method)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at java.lang.reflect.Method.invoke(Method.java:511)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-07 00:05:02.755: E/AndroidRuntime(22824):    at dalvik.system.NativeStart.main(Native Method)
07-07 00:05:03.027: E/NativeCrypto(22824): ssl=0x60ac2588 cert_verify_callback x509_store_ctx=0x6151aab0 arg=0x0
07-07 00:05:03.027: E/NativeCrypto(22824): ssl=0x60ac2588 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_ECDSA
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-06 18:59:00

主要的问题是,在进行此操作之前,您正在调用getActivity()

代码语言:javascript
复制
 Context ctx=getActivity();

相反,在getActivity()中调用onCreateView()

代码语言:javascript
复制
public class NearByPlacesFragment extends Fragment  implements OnMapReadyCallback, LocationListener {

    GoogleMap gmap;
    Marker mp;
    LatLng ll;
    Location l;
    Context ctx; //modified
    double lat,lon;
    boolean isGpsEnabled,isNetworkAvailable,isLocationSet;
    LocationManager lmgr;
    long minTime = 60*1000*1;
    long minDistance = 10;
    Location loc;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        ctx=getActivity(); //added

        View rootView = inflater.inflate(R.layout.nearbyplaces, container, false);
         l=getLocation();
        if(l==null){Toast.makeText(getActivity(), "null", Toast.LENGTH_LONG).show();}
        SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);

        return rootView;

    }

您还应该确保不尝试使用空位置放置标记:

代码语言:javascript
复制
@Override
public void onMapReady(GoogleMap map) {
    // TODO Auto-generated method stub

        map.getUiSettings().setAllGesturesEnabled(true);
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.setMyLocationEnabled(true);

        //added brackets:
        if(loc!=null){
            ll = new LatLng(loc.getLatitude() , loc.getLongitude());
            map.addMarker(new MarkerOptions().position(ll).title("Marker in Sydney"));
        }


}

您还应该使用位置回调来更新loc

代码语言:javascript
复制
@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    loc = location;
    if(loc!=null){
        ll = new LatLng(loc.getLatitude() , loc.getLongitude());
        map.addMarker(new MarkerOptions().position(ll).title("Marker in Sydney"));
    }


}
票数 0
EN

Stack Overflow用户

发布于 2015-07-06 18:55:29

代码语言:javascript
复制
if(lmgr==null){{Toast.makeText(getActivity(), "null manager", Toast.LENGTH_LONG).show();}

}

你正在做一个空检查,但它所做的只是打开一个烤面包。你还是想打电话给isGpsEnabled=lmgr.isProviderEnabled(LocationManager.GPS_PROVIDER);

票数 0
EN

Stack Overflow用户

发布于 2015-07-06 19:14:55

将以下代码添加到片段中:

代码语言:javascript
复制
@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ctx = activity;
    }

这将修复Null指针异常。

关于ApOps问题,请重新提供以下链接:

android.app.AppOpsManager not find in android project

Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zza

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31253353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档