0

我试图让我的位置点击保存按钮&存储在 数据库。在谷歌地图API v2中获取我的位置空指针在片段中

问题:

当我试图让我的位置,它让我看到空指针异常。

任何人都可以告诉我什么是错的代码?

我的代码:

public class OthersFragment extends Fragment implements OnMapReadyCallback,GoogleApiClient.ConnectionCallbacks, 
      GoogleApiClient.OnConnectionFailedListener { 
     View view; 

     private GoogleMap mMap; 
     GoogleApiClient mGoogleApiClient; 
     Double latitude; 
     Double longitude; 
     String strplace; 

     public static OthersFragment newInstance() { 
      OthersFragment fragment = new OthersFragment(); 
      return fragment; 
     } 

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

    //  mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
    //    .addApi(LocationServices.API) 
    //    .addConnectionCallbacks(this) 
    //    .addOnConnectionFailedListener(this) 
    //    .build(); 

      view = inflater.inflate(R.layout.fragment_other, null, false); 
      SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager().findFragmentById(R.id.map); 
      mapFragment.getMapAsync(this); 
      return view; 
     } 

     @Override 
     public void onMapReady(GoogleMap googleMap) { 
      mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
        .addApi(LocationServices.API) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .build(); 

      mMap = googleMap; 

      // Add a marker in Sydney and move the camera 
      LatLng sydney = new LatLng(-34, 151); 
      mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
      mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 

      mMap.setMyLocationEnabled(true); 

      mMap.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener() { 
       @Override 
       public boolean onMyLocationButtonClick() { 

        Location mylocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
        ShowPopUp(mylocation); 
        return true; 
       } 
      }); 

      googleMap.getUiSettings().setZoomControlsEnabled(true); 
      googleMap.getUiSettings().setAllGesturesEnabled(true); 


     } 

     private void ShowPopUp(final Location mylocation) { 

      int popupWidth = 300; 
      int popupHeight = 150; 

      // Inflate the popup_layout.xml 
      LinearLayout viewGroup = (LinearLayout)view.findViewById(R.id.popup); 
      LayoutInflater layoutInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View layout = layoutInflater.inflate(R.layout.popup, viewGroup); 

      // Creating the PopupWindow 
      final PopupWindow popup = new PopupWindow(); 
      popup.setContentView(layout); 
      popup.setWidth(popupWidth); 
      popup.setHeight(popupHeight); 
      popup.setFocusable(true); 

      // Some offset to align the popup a bit to the right, and a bit down, relative to button's position. 
      int OFFSET_X = 30; 
      int OFFSET_Y = 30; 

      // Clear the default translucent background 
      popup.setBackgroundDrawable(new BitmapDrawable()); 

      // Displaying the popup at the specified location, + offsets. 
      popup.showAtLocation(layout, Gravity.NO_GRAVITY, + OFFSET_X, OFFSET_Y); 

      // Getting a reference to Close button, and close the popup when clicked. 
      Button save = (Button) layout.findViewById(R.id.save); 
      Button retrieve = (Button) layout.findViewById(R.id.retrieve); 
      final EditText place = (EditText)layout.findViewById(R.id.place); 
      final EditText phone = (EditText)layout.findViewById(R.id.phone); 

      save.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         String action = "save"; 
         String strplace = place.getText().toString(); 
         String strphone = phone.getText().toString(); 
        new storePoints().execute(strplace,String.valueOf(mylocation.getLatitude()), String.valueOf(mylocation.getLongitude()), action); 
        popup.dismiss(); 

       } 
      }); 

      retrieve.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        String action = "retrieve"; 
        strplace = place.getText().toString(); 
        String strphone = phone.getText().toString(); 
        new retrievePoints().execute(strplace, action); 
        popup.dismiss(); 
       } 
      }); 

     } 


     @Override 
     public void onConnected(Bundle bundle) { 

     } 

     @Override 
     public void onConnectionSuspended(int i) { 

     } 

     @Override 
     public void onConnectionFailed(ConnectionResult connectionResult) { 

     } 

     private class storePoints extends AsyncTask<String, Void, String> { 

      @Override 
      protected String doInBackground(String... params) { 

       try { 
        String place = (String) params[0]; 
        // String phone = (String) params[1]; 
        String latitude = (String) params[1]; 
        String longitude = (String) params[2]; 
        String action = (String) params[3]; 

        String link = "http://192.168.0.152/prestige/saveCoord.php"; 
        // String link = "http://10.0.2.2/coordinates/coord.php"; 

        String data = URLEncoder.encode("station_name", "UTF-8") + "=" + URLEncoder.encode(place, "UTF-8"); 
        // data += "&" + URLEncoder.encode("phone", "UTF-8") + "=" + URLEncoder.encode(phone, "UTF-8"); 
        data += "&" + URLEncoder.encode("latitude", "UTF-8") + "=" + URLEncoder.encode(latitude, "UTF-8"); 
        data += "&" + URLEncoder.encode("longitude", "UTF-8") + "=" + URLEncoder.encode(longitude, "UTF-8"); 

        URL url = new URL(link); 
        URLConnection conn = url.openConnection(); 

        conn.setDoOutput(true); 
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

        wr.write(data); 
        wr.flush(); 

        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

        StringBuilder sb = new StringBuilder(); 
        String line = null; 

        // Read Server Response 
        while ((line = reader.readLine()) != null) { 
         sb.append(line); 
         break; 
        } 
        return sb.toString(); 

       } catch (Exception e) { 
        return new String("Exception: " + e.getMessage()); 
       } 

      } 

      @Override 
      protected void onPostExecute(String result) { 

       Toast.makeText(OthersFragment.this.getContext(), result, Toast.LENGTH_LONG).show(); 


      } 
     } 


     private class retrievePoints extends AsyncTask<String, Void, String>{ 


      @Override 
      protected String doInBackground(String... params) { 

       try { 
        String place = (String) params[0]; 
        String phone = (String) params[1]; 

        String link = "http://192.168.0.152/prestige/retCoord.php"; 
        // String link = "http://10.0.2.2/coordinates/retCoord.php"; 

        String data = URLEncoder.encode("station_name", "UTF-8") + "=" + URLEncoder.encode(place, "UTF-8"); 
        data += "&" + URLEncoder.encode("phone", "UTF-8") + "=" + URLEncoder.encode(phone, "UTF-8"); 


        URL url = new URL(link); 
        URLConnection conn = url.openConnection(); 

        conn.setDoOutput(true); 
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

        wr.write(data); 
        wr.flush(); 

        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

        StringBuilder sb = new StringBuilder(); 
        String line = null; 

        // Read Server Response 
        while ((line = reader.readLine()) != null) { 
         sb.append(line); 
         break; 
        } 
        return sb.toString(); 

       } catch (Exception e) { 
        return new String("Exception: " + e.getMessage()); 
       } 

      } 

      @Override 
      protected void onPostExecute(String result) { 

       // Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show(); 

       try { 

        mMap.clear(); // clear all the markers on the map. 
        JSONArray loc_arr = new JSONArray(result); 
        for (int i = 0; i < loc_arr.length(); i++){ 
         JSONObject loc_obj = loc_arr.getJSONObject(i); 
         Double latitude = Double.valueOf((loc_obj.getString("latitude"))); 
         Double longitude = Double.valueOf((loc_obj.getString("longitude"))); 
         String place = loc_obj.getString("station_name"); 
         //    Toast.makeText(MainActivity.this, "latitude: "+latitude +"\t Longitude: " + longitude+"\t Place: "+place, Toast.LENGTH_SHORT).show(); 


         Marker marker= mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("Place: "+place).snippet("Latitude: " +latitude+",Longitude: "+longitude)); 
         marker.showInfoWindow(); 

         mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,longitude),28)); 

        } 

       } catch (JSONException e) { 

        e.printStackTrace(); 

       } 
      } 
     } 


    } 

错误日志:

06-20 12:30:42.740 6682-6682/com.example.barbegambino.apslocate E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.barbegambino.apslocate, PID: 6682 
    java.lang.NullPointerException 
      at com.example.barbegambino.apslocate.fragments.OthersFragment$2.onClick(OthersFragment.java:166) 
      at android.view.View.performClick(View.java:4463) 
      at android.view.View$PerformClick.run(View.java:18789) 
      at android.os.Handler.handleCallback(Handler.java:808) 
      at android.os.Handler.dispatchMessage(Handler.java:103) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5299) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
      at dalvik.system.NativeStart.main(Native Method) 
+0

登录猫明确报告中指出,其NullPointerException异常。所以检查mylocation参数是否为null。如果不为null,请执行你的功能。也尝试获取谷歌API客户端连接后最后知道的位置。因此,将您的getLastLocation代码部分移至onConnected部分。 – RameshJaga

回答

0

例如尝试得到最后已知位置如下图所示,

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

private GoogleMap mMap; 
GoogleApiClient mGoogleApiClient; 
Location mLastLocation; 
Marker mCurrLocationMarker; 
LocationRequest mLocationRequest; 

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

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     checkLocationPermission(); 
    } 

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 

    //Initialize Google Play Services 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      buildGoogleApiClient(); 
      mMap.setMyLocationEnabled(true); 
     } 
    } 
    else { 
     buildGoogleApiClient(); 
     mMap.setMyLocationEnabled(true); 
    } 
} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnected(Bundle bundle) { 

    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000); 
    mLocationRequest.setFastestInterval(1000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 
else{ 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if (mLastLocation != null) { 
     // work with your last location. 
    } else { 
     Toast.makeText(this, R.string.no_location, Toast.LENGTH_LONG).show(); 
    } 
} 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onLocationChanged(Location location) { 

     mLastLocation = location; 
     if (mCurrLocationMarker != null) { 
      mCurrLocationMarker.remove(); 
     } 

     //Place current location marker 
     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("Current Position"); 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
     mCurrLocationMarker = mMap.addMarker(markerOptions); 

     //move map camera 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
     mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 

     //stop location updates 
     if (mGoogleApiClient != null) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
     } 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 

} 

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
public boolean checkLocationPermission(){ 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Asking user if explanation is needed 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

      //Prompt the user once explanation has been shown 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted. Do the 
       // contacts-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 

        if (mGoogleApiClient == null) { 
         buildGoogleApiClient(); 
        } 
        mMap.setMyLocationEnabled(true); 
       } 

      } else { 

       // Permission denied, Disable the functionality that depends on this permission. 
       Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other permissions this app might request. 
     // You can add here other case statements according to your requirement. 
    } 
} 
} 
0

我加入这个它为我工作。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.fragment_entry, null, false); 

     //added 

    if (!isGooglePlayServicesAvailable()) { 

     Toast.makeText(getContext(), "Google Play Services is not available", Toast.LENGTH_LONG).show(); 

     getActivity().finish(); 
    } 

    mGoogleApiClient = new GoogleApiClient.Builder(getContext()) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 

    SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

    return view; 
} 

这也我增加

@Override 
public void onStart() { 
    super.onStart(); 

    mGoogleApiClient.connect(); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    mGoogleApiClient.disconnect(); 

} 

private boolean isGooglePlayServicesAvailable() { 
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getContext()); 
    if (ConnectionResult.SUCCESS == status) { 
     return true; 
    } else { 
     GooglePlayServicesUtil.getErrorDialog(status, getActivity(), 0).show(); 
     Toast.makeText(getContext(), "Google Play Services is not Available", Toast.LENGTH_LONG).show(); 
     return false; 
    } 
}