首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >谷歌地图的加速检测在android studio中不起作用

谷歌地图的加速检测在android studio中不起作用
EN

Stack Overflow用户
提问于 2020-05-11 20:32:28
回答 1查看 118关注 0票数 0

我正在使用Android Studio制作一个应用程序,其中google地图显示用户的位置,我想添加一个加速度检测器,以便当用户的加速度非常大时,弹出一个警告对话框。

带有用户位置的地图正在工作,但当我尝试添加加速度传感器时,应用程序崩溃(没有错误警告)。代码如下:

代码语言:javascript
运行
复制
public abstract class Mapa extends FragmentActivity implements OnMapReadyCallback, SensorEventListener {

    private GoogleMap mMap;

    LocationManager locationManager;
    LocationListener locationListener;

    private SensorManager sensorManager;
    Sensor accelerometer;

    private SensorManager sensorManager2;
    Sensor giroscopio;


    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mapa);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
        sensorManager.registerListener(Mapa.this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        float acX;
        acX = sensorEvent.values[0];       
        if (acX >= 10 ){
            AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
            builder1.setMessage("Warning!");
            AlertDialog mensajealerta = builder1.create();
            mensajealerta.show();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                LatLng posicion = new LatLng(location.getLatitude(), location.getLongitude());
                mMap.clear();

                mMap.addMarker(new MarkerOptions().position(posicion).title("Estás aquí!"));
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(posicion, 20));
            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle) {
            }

            @Override
            public void onProviderEnabled(String s) {
            }

            @Override
            public void onProviderDisabled(String s) {
            }
        };

        if (Build.VERSION.SDK_INT < 23) {
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        } else {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){

                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            } else {               locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

                Location ultimaPosicion = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                LatLng posicion = new LatLng(ultimaPosicion.getLatitude(), ultimaPosicion.getLongitude());
                mMap.clear();

                mMap.addMarker(new MarkerOptions().position(posicion).title("Estás aquí!"));
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(posicion, 20));
            }
        }
    }
}

我不知道哪里出了错,你能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 17:26:00

我最终自己找到了答案,所以我会把答案贴出来,以防其他人需要它。

显然,当你将谷歌地图和加速度计放在同一活动中时,它不起作用,所以我不得不将它们分开。为了做到这一点,我使用了一个服务来检测加速。

我设法让我的服务运行起来,如下所示:Android sensors not working in a service

完成此操作后,我使用LocalBroadcastManager:How to use LocalBroadcastManager?将加速度计信息发送到我的地图活动

通过遵循这两个问题中的说明,我成功地让它工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61729793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档