2016-07-30 5 views
0

Этот код сейчас показывает расположение устройства. Я получаю JSON из URL-адреса и разбираю его ниже. Я хочу показать это как маркеры в моей MapActivity. Я получаю java.lang.NullPointerException на mMap.addMarket (_markeroptions).Android: Показать маркеры в MapActivity

Я получаю данные JSON, эта часть работает, просто не может отображать ее на Карте. Ваше руководство будет полезно.

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

// Add stDisplayListView code here 
JSONArray jsonArray; 
String json_string; 

// End stDisplayListView 



public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
LocationRequest mLocationRequest; 
GoogleApiClient mGoogleApiClient; 
private GoogleMap mMap; 


Location mLastLocation; 
Marker mCurrLocationMarker; 

Marker doctorLocationMarker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 
    // int x =_st.jsonArray.length(); 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     checkLocationPermission(); 
    } 



    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

} 




    /** 
* Manipulates the map once available. 
* This callback is triggered when the map is ready to be used. 
* This is where we can add markers or lines, add listeners or move the camera. In this case, 
* we just add a marker near Sydney, Australia. 
* If Google Play services is not installed on the device, the user will be prompted to install 
* it inside the SupportMapFragment. This method will only be triggered once the user has 
* installed Google Play services and returned to the app. 
*/ 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    // int count = _st.doctorAdapter.getCount(); 
    // int i =1; 
    json_string = getIntent().getExtras().getString("JSON_DTA"); 
    try { 
     int count =0 ; 
     //jsonObject = new JSONObject(json_string); 
     jsonArray = new JSONArray(json_string); 
     int _id; 
     String _doctorname; 
     String _doclat; 
     String _doclong; 
     //List<Marker> markers = new ArrayList<Marker>(); 

     while(count < jsonArray.length()) 
     { 
      JSONObject JO = jsonArray.getJSONObject(count); 
      _id = JO.getInt("id"); 
      _doctorname = JO.getString("doctorname"); 
      _doclat = JO.getString("latitude"); 
      _doclong = JO.getString("longitude"); 

      count++; 

      Double d = Double.parseDouble(_doclat); 
      Double e = Double.parseDouble(_doclong); 

      LatLng latLng = new LatLng(d,e); 
      //mMap = googleMap; 

      MarkerOptions _markeroptions = new MarkerOptions() 
        .position(latLng); 
      mMap.addMarker(_markeroptions); 




     } 

    } 
    catch (JSONException e) { 
     e.printStackTrace(); 


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

    // int a = _st.json_string.length(); 
    // 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)); 
} 
} 
protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 
@Override 
public void onConnected(@Nullable 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); 
    } 

} 

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

    //ParseJSONdata parseJSONdata = new ParseJSONdata(); 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

} 

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 expanation 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. 
       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. 
    } 
} 
+2

Просто посмотрите на код. Вы назначаете mMap * после * вы его используете. Легко исправить. –

+0

Итак, MarkerOptions _markeroptions = new MarkerOptions() .position (latLng); mMap = googleMap; ' должно быть исправить? –

+0

Переместить весь код маркера после инициализации всей карты –

ответ

0
When onMapReady() method is call you used map Object without initialization and after you initialize, so then have return null pointer. 

mMap = googleMap; //Map initialize by this line 
    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); 
    } 


this code put above try catch in onMapReady() method and run your code. 
Смежные вопросы