android - 在谷歌地图自定义标记不显示在三星 S8 或相同版本 7.0 在 Android

标签 android google-maps fragment

我正在创建一个带有自定义纬度和经度标记的 Google map 。这些标记在 Samsung S4 手机上正确显示,但在 S8 或更高版本上不显示。我授予所有许可。我还将点击监听器放在自定义标记上。这些在 S4 或低版本中都可以正常工作,但在高版本 api mobile 中不起作用。

我哪里错了?这是我的代码:

if (ActivityCompat.checkSelfPermission(getActivity(),
        Manifest.permission.ACCESS_FINE_LOCATION) !=
        PackageManager.PERMISSION_GRANTED &&
        ActivityCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_COARSE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED) {
    requestPermission();
    // TODO: Consider calling
    //    ActivityCompat#requestPermissions
    // here to request the missing permissions, and then overriding
    //   public void onRequestPermissionsResult(int requestCode, 
    String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the 
            documentation
    // for ActivityCompat#requestPermissions for more details.
    //            return false;
} else {

    mSetUpMap();
}


private void requestPermission() {
    ActivityCompat.requestPermissions(getActivity(), new
            String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

}

public void mSetUpMap() {
    googleMap.clear();
    /**Create dummy Markers List*/
    List<Marker> markersList = new ArrayList<Marker>();
    for (City item : cityList) {

        if (googleMap != null) {
            Marker m1 = googleMap.addMarker(new MarkerOptions().position(new
                    LatLng(item.getLatitude(),
                    item.getLongitude())).title(item.getName()).anchor(0.5f,
                    0.5f).icon(BitmapDescriptorFactory.fromBitmap(getCustomMarker(
                    item.getDrawableId(), item.getName()))));
            markersList.add(m1);
        }

    }
    googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(final Marker marker) {
            ValueAnimator ani = ValueAnimator.ofFloat(0, 1); //change for 
            (0, 1)if you want a fade in
            ani.setDuration(2000);
            ani.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    marker.setAlpha((float) animation.getAnimatedValue());
                }

            });
            ani.start();
            if (marker.getTitle().equals(cityList.get(0).getName())) {
                AppUtil.city = cityList.get(0);

            } else if (marker.getTitle().equals(cityList.get(1).getName())) {
                AppUtil.city = cityList.get(1);

            } else if (marker.getTitle().equals(cityList.get(2).getName())) {
                AppUtil.city = cityList.get(2);

            } else if (marker.getTitle().equals(cityList.get(3).getName())) {
                AppUtil.city = cityList.get(3);

            } else if (marker.getTitle().equals(cityList.get(4).getName())) {
                AppUtil.city = cityList.get(4);

            }
            FragmentTransaction transaction =
                    getFragmentManager().beginTransaction();
            transaction.replace(R.id.frame_container, new
                    CityDetailFragment());
            transaction.commit();
/*((CityDetailFragment) adapter.getItem(1)).setupData();
viewPager.setCurrentItem(1,false);*/
            return true;
        }
    });

    /**create for loop for get the latLngbuilder from the marker list*/
    builder = new LatLngBounds.Builder();
    for (Marker m : markersList) {
        builder.include(m.getPosition());
    }
    /**initialize the padding for map boundary*/
    final int padding = 150;
    /**create the bounds from latlngBuilder to set into map camera*/
    final LatLngBounds bounds = builder.build();
    /**create the camera with bounds and padding to set into map*/
    cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
    /**call the map call back to know map is loaded or not*/

    googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
        @Override
        public void onMapLoaded() {
            googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,
                    padding));
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(12));
        }
    });
}

private Bitmap createStoreMarker() {
    ViewGroup continer = null;

    View markerLayout = view.inflate(null,
            R.layout.store_marker_layout, continer);

    markerLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
            View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0,
            View.MeasureSpec.UNSPECIFIED));
    markerLayout.layout(0, 0, markerLayout.getMeasuredWidth(),
            markerLayout.getMeasuredHeight());

    final Bitmap bitmap =
            Bitmap.createBitmap(markerLayout.getMeasuredWidth(),
                    markerLayout.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    markerLayout.draw(canvas);
    return bitmap;
}

最佳答案

试试这个

public class MainActivity extends AppCompatActivity implements 
OnMapReadyCallback {

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

    try {

        boolean success = 

    googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(
   MainActivity.this, 
   R.raw.style_json));

        if (!success) {
            Log.e("google map", "Style parsing failed.");
        }
    } catch (Resources.NotFoundException e) {
        Log.e("google map", "Can't find style. Error: ", e);
    }

    mSetUpMap();

}



private static final String TAG = "MapActivity";

private static final String FINE_LOCATION = 
Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COURSE_LOCATION = 
Manifest.permission.ACCESS_COARSE_LOCATION;

private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;


private Boolean mLocationPermissionsGranted = false;
private GoogleMap mMap;

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

    getLocationPermission();
   }

    private void initMap(){
    Log.d(TAG, "initMap: initializing map");
    SupportMapFragment mapFragment = (SupportMapFragment) 
    getSupportFragmentManager().findFragmentById(R.id.map);

    mapFragment.getMapAsync(MainActivity.this);
}

     private void getLocationPermission(){
    Log.d(TAG, "getLocationPermission: getting location permissions");
    String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION};

    if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
            FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
            mLocationPermissionsGranted = true;
            initMap();
        }else{
            ActivityCompat.requestPermissions(this,
                    permissions,
                    LOCATION_PERMISSION_REQUEST_CODE);
        }
       }else{
        ActivityCompat.requestPermissions(this,
                permissions,
                LOCATION_PERMISSION_REQUEST_CODE);
       }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull 
    String[] permissions, @NonNull int[] grantResults) {
    Log.d(TAG, "onRequestPermissionsResult: called.");
    mLocationPermissionsGranted = false;




        switch (requestCode) {

            case LOCATION_PERMISSION_REQUEST_CODE : {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == 
       PackageManager.PERMISSION_GRANTED) {

                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    Toast.makeText(getApplicationContext(), "Permission 
   granted", Toast.LENGTH_SHORT).show();
                    initMap();

                } else {

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

        }


        }
  private void mSetUpMap() {
     // your method code 

     }
  }

关于android - 在谷歌地图自定义标记不显示在三星 S8 或相同版本 7.0 在 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49665239/

相关文章:

java - Caldroid 的背景绘制

Android 设备无法在 Jelly Bean 4.2.2 上捕捉低质量视频

android - 禁用 RecyclerView 项目拖动时的振动

java - 膨胀类 fragment 谷歌 API 时出错

google-maps - 使用 Google Maps API v3 禁用兴趣点信息窗口

javascript 函数返回未定义

android - 使用多个 RecyclerView 和其他 View 保存/恢复 NestedScrollView 的状态

android - Android中的 "context"是什么意思?

android - android fragment 之间的通信

安卓应用 : show PreferenceFragment as a dialog?