Java 使用SensorEventListener注册SensorManager会在运行应用程序时引发ClassCastException

Java 使用SensorEventListener注册SensorManager会在运行应用程序时引发ClassCastException,java,android,google-maps,Java,Android,Google Maps,我正在尝试开发一个运动传感应用程序 为此,我创建了两个活动。 第一个活动从用户处获取纬度和经度,并有一个按钮保存数据并将其传递到下一个活动。 第二个活动是GoogleMaps活动,我使用用户数据和所有相应的管理器(传感器管理器、加速计等) 第一页工作正常,但当我输入数据并按下按钮时,应用程序停止。 在日志中,它显示MapsActivity类中抛出了ClassCastException 请帮忙 错误: 12-21 17:14:44.564 5417-5417/com.example.anurag.

我正在尝试开发一个运动传感应用程序

为此,我创建了两个活动。
第一个活动从用户处获取纬度和经度,并有一个按钮保存数据并将其传递到下一个活动。
第二个活动是GoogleMaps活动,我使用用户数据和所有相应的管理器(传感器管理器、加速计等)

第一页工作正常,但当我输入数据并按下按钮时,应用程序停止。
在日志中,它显示MapsActivity类中抛出了ClassCastException

请帮忙

错误:

12-21 17:14:44.564 5417-5417/com.example.anurag.anurag_latest_morgenall E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.example.anurag.anurag_latest_morgenall, PID: 5417
  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.anurag.anurag_latest_morgenall/com.example.anurag.anurag_latest_morgenall.MapsActivity}: java.lang.ClassCastException: com.example.anurag.anurag_latest_morgenall.MapsActivity cannot be cast to android.hardware.SensorEventListener
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
      at android.app.ActivityThread.access$800(ActivityThread.java:151)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5254)
      at java.lang.reflect.Method.invoke(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
   Caused by: java.lang.ClassCastException: com.example.anurag.anurag_latest_morgenall.MapsActivity cannot be cast to android.hardware.SensorEventListener
      at com.example.anurag.anurag_latest_morgenall.MapsActivity.onCreate(MapsActivity.java:49)
      at android.app.Activity.performCreate(Activity.java:5990)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372)
MainActivity.java文件:

package com.example.anurag.anurag_latest_morgenall;

import android.app.usage.UsageEvents;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {

    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    float x,  y;

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

        final EditText latitude = (EditText) findViewById(R.id.latitude1);
        final EditText longitude = (EditText) findViewById(R.id.longitude1);
        Button button = (Button) findViewById(R.id.button1);

        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                x= Float.parseFloat(latitude.getText().toString());
                y= Float.parseFloat(longitude.getText().toString());

                Intent intent=new Intent(getApplicationContext(),MapsActivity.class);
                Bundle extras= new Bundle();
                extras.putFloat("LATITUDE",x);
                extras.putFloat("LONGITUDE",y);
                intent.putExtras(extras);
                startActivity(intent);

            }

        });


    }


    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    public Action getIndexApiAction() {
        Thing object = new Thing.Builder()
                .setName("Main Page") // TODO: Define a title for the content shown.
                // TODO: Make sure this auto-generated URL is correct.
                .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
                .build();
        return new Action.Builder(Action.TYPE_VIEW)
                .setObject(object)
                .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                .build();
    }




}
package com.example.anurag.anurag_latest_morgenall;

import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.icu.text.SimpleDateFormat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.util.Date;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private SensorManager sensorManager;
    private Sensor accelerometer;
    long lastUpdate=0;
    private float last_x,last_y;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        last_x = extras.getFloat("LATITUDE");
        last_y = extras.getFloat("LONGITUDE");
        // 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);
        // set up acclerometer
        sensorManager= (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);
        accelerometer= sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

**the below line is where the error is getting pointed to**

sensorManager.registerListener((SensorEventListener) this,accelerometer,SensorManager.SENSOR_DELAY_NORMAL);

    }

    public void onSensorChanged(SensorEvent event){
        Sensor mySensor= event.sensor;

        if (mySensor.getType()==Sensor.TYPE_ACCELEROMETER)
        {
            float x= event.values[0];
            float y= event.values[1];

            long curTime= System.currentTimeMillis();

            if(Math.abs(curTime - lastUpdate)>2000){
                java.text.SimpleDateFormat date= new java.text.SimpleDateFormat("dd-MM-yyyy");
                String currentDateTime= date.format(new Date());

                lastUpdate=curTime;

                if(Math.abs(last_x - x)>10)
                {
                    mMap.addMarker(new MarkerOptions().position(new LatLng(last_x,last_y))
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
                            .title("Hey you moved the x-axis on "+currentDateTime));

                }

                if(Math.abs(last_y - y)>10)
                {
                    mMap.addMarker(new MarkerOptions().position(new LatLng(last_x,last_y))
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
                            .title("Hey you moved the y-axis on "+currentDateTime));

                }


                last_x=x;
                last_y=y;
            }
        }
    }

    public void onAccuracyChanged(Sensor sensor,int accuracy)
    {

    }




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

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(last_x,last_y);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Virginia Tech"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney,14.9f));
    }
}
MapsActivity.java文件:

package com.example.anurag.anurag_latest_morgenall;

import android.app.usage.UsageEvents;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {

    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;
    float x,  y;

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

        final EditText latitude = (EditText) findViewById(R.id.latitude1);
        final EditText longitude = (EditText) findViewById(R.id.longitude1);
        Button button = (Button) findViewById(R.id.button1);

        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                x= Float.parseFloat(latitude.getText().toString());
                y= Float.parseFloat(longitude.getText().toString());

                Intent intent=new Intent(getApplicationContext(),MapsActivity.class);
                Bundle extras= new Bundle();
                extras.putFloat("LATITUDE",x);
                extras.putFloat("LONGITUDE",y);
                intent.putExtras(extras);
                startActivity(intent);

            }

        });


    }


    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    public Action getIndexApiAction() {
        Thing object = new Thing.Builder()
                .setName("Main Page") // TODO: Define a title for the content shown.
                // TODO: Make sure this auto-generated URL is correct.
                .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
                .build();
        return new Action.Builder(Action.TYPE_VIEW)
                .setObject(object)
                .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                .build();
    }




}
package com.example.anurag.anurag_latest_morgenall;

import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.icu.text.SimpleDateFormat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.util.Date;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private SensorManager sensorManager;
    private Sensor accelerometer;
    long lastUpdate=0;
    private float last_x,last_y;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        Intent intent = getIntent();
        Bundle extras = intent.getExtras();
        last_x = extras.getFloat("LATITUDE");
        last_y = extras.getFloat("LONGITUDE");
        // 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);
        // set up acclerometer
        sensorManager= (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);
        accelerometer= sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

**the below line is where the error is getting pointed to**

sensorManager.registerListener((SensorEventListener) this,accelerometer,SensorManager.SENSOR_DELAY_NORMAL);

    }

    public void onSensorChanged(SensorEvent event){
        Sensor mySensor= event.sensor;

        if (mySensor.getType()==Sensor.TYPE_ACCELEROMETER)
        {
            float x= event.values[0];
            float y= event.values[1];

            long curTime= System.currentTimeMillis();

            if(Math.abs(curTime - lastUpdate)>2000){
                java.text.SimpleDateFormat date= new java.text.SimpleDateFormat("dd-MM-yyyy");
                String currentDateTime= date.format(new Date());

                lastUpdate=curTime;

                if(Math.abs(last_x - x)>10)
                {
                    mMap.addMarker(new MarkerOptions().position(new LatLng(last_x,last_y))
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
                            .title("Hey you moved the x-axis on "+currentDateTime));

                }

                if(Math.abs(last_y - y)>10)
                {
                    mMap.addMarker(new MarkerOptions().position(new LatLng(last_x,last_y))
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))
                            .title("Hey you moved the y-axis on "+currentDateTime));

                }


                last_x=x;
                last_y=y;
            }
        }
    }

    public void onAccuracyChanged(Sensor sensor,int accuracy)
    {

    }




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

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(last_x,last_y);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Virginia Tech"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney,14.9f));
    }
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.anurag.anurag_latest_morgenall.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/TextView1"
        android:text="@string/Text_Name"
        android:gravity="center_horizontal"
        android:textSize="20sp" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_below="@+id/latitude1"
        android:layout_alignEnd="@+id/latitude1"
        android:layout_marginTop="33dp"
        android:id="@+id/longitude1"
        android:hint="Enter the longitude"
        android:gravity="center_vertical|center" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_marginTop="34dp"
        android:id="@+id/latitude1"
        android:hint="Enter the Latitude"
        android:layout_below="@+id/TextView1"
        android:layout_centerHorizontal="true"
        android:gravity="center_vertical|center" />

    <Button
        android:text="Save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:layout_below="@+id/longitude1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="71dp"
        android:onClick="sendData"/>
</RelativeLayout>

activity_maps.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.anurag.anurag_latest_morgenall.MapsActivity" />

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.anurag.anurag_latest_morgenall">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality. 
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps"></activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
     App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>

</manifest>


我已经在所需的位置输入了所有必要的API密钥。

提示:这些方法不起任何作用

  • 传感器更改时的公共无效(传感器事件)

  • public void onAccuracyChanged(传感器、内部精度)

提示:添加
@Override
,让编译器警告您没有实现接口


class MapsActivity扩展了FragmentActivity在MapReadyCallback上的实现{

当它说
MapsActivity不能强制转换到android.hardware.SensorEventListener
时,你认为这意味着什么?你应该用你的MapsActivity实现SensorEventListener,然后它就变成了一个sensor listener活动,你将在它的重写方法(如onSensorChanged和OnAccuracyChangedHanks m)中获得传感器值A.请求援助