- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
调用 onSensorChanged
方法时如何旋转标记?我尝试了这段代码,但出现了 NullPointerException。我将 mMap 声明为全局变量并将其加载到 onMapReady 中。我想在我的 onSensorChanged
方法中使用它。我该如何解决这个问题?
我收到此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.getUiSettings().setZoomControlsEnabled(true);
latLng_dest = getIntent().getExtras().getParcelable("latLng_dest");
Log.d("LatLng_dest : ", latLng_dest.toString());
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST);
return;
}
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(false);
// Call our direction function
getDeviceLocation();
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor == mRotationSensor) {
if (event.values.length > 4) {
float[] truncatedRotationVector = new float[4];
System.arraycopy(event.values, 0, truncatedRotationVector, 0, 4);
updateSensor(truncatedRotationVector);
} else {
updateSensor(event.values);
}
}
}
private void updateSensor(float[] vectors) {
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrixFromVector(rotationMatrix, vectors);
int worldAxisX = SensorManager.AXIS_X;
int worldAxisZ = SensorManager.AXIS_Z;
float[] adjustedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisX, worldAxisZ, adjustedRotationMatrix);
float[] orientation = new float[3];
SensorManager.getOrientation(adjustedRotationMatrix, orientation);
azimuth = orientation[0]* FROM_RADS_TO_DEGS;
float pitch = orientation[1] * FROM_RADS_TO_DEGS;
float roll = orientation[2] * FROM_RADS_TO_DEGS;
Log.d("", "updateSensor: Pitch "+pitch);
Log.d("", "updateSensor: Roll "+roll);
Log.d("", " "+mMap);
markerOptions = new MarkerOptions().icon(bitmapDescriptorFromVector(MapsActivity.this, R.drawable.ic_navigation_black_24dp));
((TextView)findViewById(R.id.svtv2)).setText("Azimuth: "+azimuth+"\n"+"Pitch: "+pitch+"\n"+"Roll: "+roll);
mMap.addMarker(markerOptions.rotation(azimuth));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
initMap();
//markerOptions = new MarkerOptions().icon(bitmapDescriptorFromVector(MapsActivity.this, R.drawable.ic_navigation_black_24dp));
Button button = findViewById(R.id.but_dir);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView = findViewById(R.id.svtv);
textView.setText(instruction);
}
});
/*new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
}
},0,1);*/
//Aquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
final TextView live_inst = findViewById(R.id.svtv2);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
//makeUseOfNewLocation(location);
updateDeviceLocation(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 0, locationListener);
try {
mSensorManager = (SensorManager) getSystemService(MapsActivity.SENSOR_SERVICE);
mRotationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
mSensorManager.registerListener(this, mRotationSensor, SENSOR_DELAY);
} catch (Exception e) {
Toast.makeText(this, "Hardware compatibility issue", Toast.LENGTH_LONG).show();
}
}
最佳答案
通常,onSenorChanged 会在您启动应用程序屏幕时立即触发。
通过这种方式,在传感器值更改后,您将尝试旋转 map 对象上的标记,该标记将为空,因为它是异步调用。
在调用“rotateMarker”方法之前进行空检查。
示例:
If (mMap != null) {
// do rotate Map marker
}
注意:即使发生非常微小的变化,传感器值也会发生变化。只是为了增强性能,请使用 + 或 - 5 校准传感器值。
希望这些信息有帮助!
关于java - 如何在onSensorChanged中使用GoogleMap.addMarker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54728209/
调用 onSensorChanged 方法时如何旋转标记?我尝试了这段代码,但出现了 NullPointerException。我将 mMap 声明为全局变量并将其加载到 onMapReady 中。我
我正在寻找使用 R 函数 leaflet::addMarkers 时重叠标签的修复方法。 long % addTiles() %>% # Add default OpenStreetMap ma
我正在实现一个 map ,需要在运行时显示您当前的位置。到目前为止,我没有遇到任何问题,但今天在学习如何设置纬度和经度的教程时,我在为我的项目初始化 map 标记时遇到了麻烦。 addMarker
我正在使用异步任务来查询数据库并填充包含两个 double 的地 block 对象的 ArrayList,一个用于经度和纬度。 ArrayList mPoints = new ArrayLis
我试图为我的自定义 Google map 应用程序创建搜索栏,但每次我尝试搜索位置时,应用程序都会强制关闭。按顺序来说,看起来我做的一切都是正确的。问题是,当我尝试搜索位置时,它只是强制关闭应用程序,
尝试在我们的应用程序上加载谷歌地图时出现 nullpointerException,如下所示。java 类扩展自 AppCompatActivty和里面intialiseMap()我们尝试getMap
我一直在努力将 Primefaces Showcase 中的 GMap AddMarker 和 Selection 示例结合起来。 我在这里尝试实现的目标是,当单击已使用 JavaScript 添加到
谁能告诉我我的代码有什么问题,当我在我的 ionic 2 应用 中加载 google map 时,标记没有出现在 第一次。它会在我第二次或之后加载 map 时加载。 谷歌地图将如何显示用户位置和标记位
我在如何使用 onQueryTextSubmit 和 onQueryTextChange 时遇到问题,我想要的是使用我的 addMarker 上的代码段获得可搜索的车牌号。我现在的问题是我的 onQu
场景 读取初始用户位置并添加标记 + 将相机位置设置为该位置。 每次用户拖动/缩放相机时,我都需要调用网络服务并传递 map 的矩形坐标。此 Web 服务返回一个位置列表,这些位置将显示为 map 范
我正在添加 removeMarker 和 addMarker 但它显示了这个 -未为类“GoogleMapController”定义方法“addMarker”。尝试将名称更正为现有方法的名称,或定义名
感谢您抽出宝贵时间阅读本文。 我在大约一个月前(2014 年 8 月 29 日)向 Google Play 商店发布了一个应用,使用相同数量的标记时这不是问题。本周,当我进入我的应用程序时,我注意到在
我是一名优秀的程序员,十分优秀!