1

Я пытаюсь установить пользовательский маркер в GMaps, для которого я создал пользовательский макет. Я надувать свой собственный макет в моей Карты активности затем преобразовать его в растр, а затем передавая ту же растровое BitmapDescriptorFactory.fromBitmap(bitmap), но я получаю java.lang.NullPointerException: null reference Вот моя карта активностьИсключение Null Pointer при попытке установить пользовательский маркер в GMaps

public class GPSLocation extends FragmentActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, OnMapReadyCallback { 
    LatLng latLng = null; 
    GoogleApiClient googleApiClient; 
    GoogleMap map; 
    int animation = 0; 
    TextView marker; 
    View v; 
    Bitmap mainBitmap; 
    LayoutInflater inflater; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     inflater = getLayoutInflater(); 
     setContentView(R.layout.activity_gpslocation); 
     v = inflater.inflate(R.layout.marker,null); 
     marker = (TextView) v.findViewById(R.id.marker); 
     mainBitmap = ConvertToBitmap(v); 

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

    } 

    protected Bitmap ConvertToBitmap(View v) { 
     Bitmap map2; 
     Log.v("BitmapObject", "Inside"); 
     v.setDrawingCacheEnabled(true); 
     v.buildDrawingCache(); 
     return map2 = v.getDrawingCache(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

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

    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     map = googleMap; 
    } 

    //Gets Current Location 
    private LatLng getCurrentLocation() { 
     new SamLocationRequestService(GPSLocation.this).executeService(new SamLocationRequestService.SamLocationListener() { 
      @Override 
      public void onLocationUpdate(Location location, Address address) { 
       latLng = new LatLng(location.getLatitude(), location.getLongitude()); 

       drawMarker(latLng, mainBitmap, "My Location"); 
       getPlaces(location.getLatitude() + "", location.getLongitude() + "", "500", "atm"); 
       Toast.makeText(GPSLocation.this, location.getLatitude() + "," + location.getLongitude() + "", Toast.LENGTH_SHORT).show(); 
      } 
     }); 


     return latLng; 
    } 

    //Check GPS is turned On or not 
    private void checkGps() { 
     if (googleApiClient == null) { 
      googleApiClient = new GoogleApiClient.Builder(GPSLocation.this) 
        .addApi(LocationServices.API) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this).build(); 
      googleApiClient.connect(); 

      LocationRequest locationRequest = LocationRequest.create(); 
      locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      locationRequest.setInterval(30 * 1000); 
      locationRequest.setFastestInterval(5 * 1000); 
      LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest); 
      builder.setAlwaysShow(true); 
      PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build()); 
      result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
       @Override 
       public void onResult(LocationSettingsResult result) { 
        final Status status = result.getStatus(); 
        final LocationSettingsStates state = result.getLocationSettingsStates(); 
        switch (status.getStatusCode()) { 
         case LocationSettingsStatusCodes.SUCCESS: 
          getCurrentLocation(); 
          googleApiClient = null; 
          // All location settings are satisfied. The client can initialize location 
          // requests here. 
          break; 
         case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
          // Location settings are not satisfied. But could be fixed by showing the user 
          // a dialog. 
          try { 
           // Show the dialog by calling startResolutionForResult(), 
           // and check the result in onActivityResult(). 
           status.startResolutionForResult(GPSLocation.this, 1000); 
          } catch (IntentSender.SendIntentException e) { 
           // Ignore the error. 
          } 
          googleApiClient = null; 
          break; 
         case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
          // Location settings are not satisfied. However, we have no way to fix the 
          // settings so we won't show the dialog. 
          googleApiClient = null; 
          break; 
        } 
       } 
      }); 
     } 
    } 
    //End 

    public void drawMarker(LatLng latLng, Bitmap bitmap, String name) { 


     if (animation == 0) { 
      map.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13)); 
      CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(latLng)    // Sets the center of the map to location user 
        .zoom(15)     // Sets the zoom 
        .bearing(90)    // Sets the orientation of the camera to east 
        .tilt(40)     // Sets the tilt of the camera to 30 degrees 
        .build();     // Creates a CameraPosition from the builder 
      map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
      animation = 1; 
     } 

     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title(name); 
     markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); 
     map.addMarker(markerOptions); 
    } 


    void getPlaces(String lat, String lon, String radious, String type) { 
     StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); 
     sb.append("location=" + lat + "," + lon); 
     sb.append("&radius=" + radious); 
     sb.append("&types=" + type); 
     sb.append("&sensor=true"); 
     sb.append("&key=MyAPIKey"); 
     AndroidNetworking.initialize(GPSLocation.this); 
     AndroidNetworking.get(sb.toString()) 
       //.addJSONObjectBody(object) 
       .setTag("Token") 
       .setPriority(Priority.MEDIUM) 
       .build() 
       .getAsJSONObject(new JSONObjectRequestListener() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          JSONArray array = response.getJSONArray("results"); 
          for (int i = 0; i < array.length(); i++) { 

           JSONObject object = array.getJSONObject(i); 
           String latitude = object.getJSONObject("geometry").getJSONObject("location").getString("lat"); 
           String longitude = object.getJSONObject("geometry").getJSONObject("location").getString("lng"); 
           String name = object.getString("name"); 
           String vicinity = object.getString("vicinity"); 
           String reference = object.getString("reference"); 
           LatLng latLng = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude)); 
           marker.setText(name.toString()); 
           //drawMarker(latLng, mainBitmap, name + "\n" + vicinity); 
          } 
          //drawMarker(CurrentPos, "My Location", "0", BitmapDescriptorFactory.HUE_BLUE); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onError(ANError anError) { 

        } 
       }); 
    } 

} 

Мой заказ Компоновка Маркер, который я раздувания в Мой Java файл (marker.xml):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/llm" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <TextView 
     android:layout_width="30dp" 
     android:layout_height="30dp" 
     android:background="@drawable/google_selector" 
     android:gravity="center" 
     android:padding="2dp" 
     android:text="ATM" 
     android:textColor="#FFFFFF" 
     android:textSize="9dp" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/marker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:padding="4dp" 
     android:text="Axis" 
     android:textColor="#000000" 
     android:textSize="9dp" /> 
</LinearLayout> 

Мой журнал ошибок:

12-25 19:22:27.330 32741-32741/? E/AndroidRuntime: FATAL EXCEPTION: main 
                Process: com.example.aamir.myapplication, PID: 32741 
                java.lang.NullPointerException: null reference 
                 at maps.w.d.a(Unknown Source) 
                 at maps.ad.f$a.<init>(Unknown Source) 
                 at maps.ad.f.a(Unknown Source) 
                 at maps.ad.S.<init>(Unknown Source) 
                 at maps.ad.t.a(Unknown Source) 
                 at xj.onTransact(:com.google.android.gms.DynamiteModulesB:167) 
                 at android.os.Binder.transact(Binder.java:392) 
                 at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source) 
                 at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source) 
                 at com.example.aamir.myapplication.GPSLocation.drawMarker(GPSLocation.java:190) 
                 at com.example.aamir.myapplication.GPSLocation$1.onLocationUpdate(GPSLocation.java:109) 
                 at com.entire.sammalik.samlocationandgeocoding.SamLocationRequestService.onLocationChanged(SamLocationRequestService.java:101) 
                 at com.google.android.gms.location.internal.zzk$zzb.handleMessage(Unknown Source) 
                 at android.os.Handler.dispatchMessage(Handler.java:111) 
                 at android.os.Looper.loop(Looper.java:207) 
                 at android.app.ActivityThread.main(ActivityThread.java:5776) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

PS: Я использую Android Library Networking для Net работа.

+0

Ну, что-то в 'GPSLocation.drawMarker' равно –

+0

Ошибка указывает на эту строку addMarker (markerOptions) внутри Метод drawMarker() – Aamir

+0

Правильно, так что что-то в пределах ваших параметров Marker равно null ... Например, вы уверены, что битмап не равен нулю? –

ответ

1

Я думаю, Null Pointer Exception должен быть не готов еще когда вы звоните drawMarker способ внутри getCurrentLocation() способ.

Try вызов getCurrentLocation() метода из onMapReady метода, когда карта готова к использованию и удалить getCurrentLocation() вызов метода внутри onCreate метода.

0

Я использовал метод преобразования битмапа из учебника this, и он сработал. Может быть, я делал что-то неправильно в преобразовании макета в растровое изображение .. спасибо всем за вашу помощь.