简体   繁体   English

单击按钮时java.lang.ExceptionInInitializerError

[英]java.lang.ExceptionInInitializerError when button is clicked

I am making an app that tracks the user based on GPS. 我正在制作一个基于GPS跟踪用户的应用程序。 When I press the button to move to another intent I get this error. 当我按下按钮移动到另一个意图时,我收到此错误。 I didn't get this error when testing on Samsung Galaxy S5 with Android v6. 在装有Android v6的Samsung Galaxy S5上进行测试时,我没有收到此错误。 Error has appeared on HTC that has Android v4.4.4 具有Android v4.4.4的HTC出现错误

Here's the error: 这是错误:

java.lang.ExceptionInInitializerError
                                                                                  at com.example.matej.locato.TrackingActivity.l(Unknown Source)
                                                                                  at com.example.matej.locato.TrackingActivity.b(Unknown Source)
                                                                                  at com.example.matej.locato.TrackingActivity.onCreate(Unknown Source)
                                                                                  at android.app.Activity.performCreate(Activity.java:5312)
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2395)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2495)
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:153)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:157)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5633)
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:712)
                                                                                  at dalvik.system.NativeStart.main(Native Method)
                                                                               Caused by: java.lang.RuntimeException: Missing type parameter.
                                                                                  at com.google.a.c.a.a(Unknown Source)
                                                                                  at com.google.a.c.a.<init>(Unknown Source)
                                                                                  at com.google.a.k.<init>(Unknown Source)
                                                                                  at com.google.a.j.<clinit>(Unknown Source)
                                                                                  at com.example.matej.locato.TrackingActivity.l(Unknown Source) 
                                                                                  at com.example.matej.locato.TrackingActivity.b(Unknown Source) 
                                                                                  at com.example.matej.locato.TrackingActivity.onCreate(Unknown Source) 
                                                                                  at android.app.Activity.performCreate(Activity.java:5312) 
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2395) 
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2495) 
                                                                                  at android.app.ActivityThread.access$800(ActivityThread.java:153) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                  at android.os.Looper.loop(Looper.java:157) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5633) 
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:896) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:712) 
                                                                                  at dalvik.system.NativeStart.main(Native Method) 

This is the button code : 这是按钮代码:

public void button_click_clicked(View view) {

    // check if user has location
    if (user.updated) {
        // create new intent with TrackingActivity
        Intent intent = new Intent(this, TrackingActivity.class);

        // start activity
        startActivity(intent);

        //start tracking and create target
        //TrackingActivity.startTracking(user.updated);
    } else {
        // user has not received location yet
        Toast.makeText(MainActivity.this, "Please wait for GPS signal", Toast.LENGTH_SHORT).show();
    }
}

And code for the Activity that throws the error: 并为引发错误的Activity编写代码:

package com.example.matej.locato;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.text.Layout;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.gson.Gson;

import java.util.ArrayList;

/**
 * @author Matej Ocovsky -- 9/7/2016
 */

public class TrackingActivity extends AppCompatActivity implements SensorEventListener, OnMapReadyCallback {
public static boolean trackStart = false;

private static ImageView image;

private float currentDegree = 0f;

private SensorManager mSensorManager;

public static ArrayList<Target> targetList = new ArrayList<>();

public static GoogleMap mMap;

private static Target targetDislplayed;

public static SharedPreferences  mPrefs;




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



    ////////////////////////////////////////////////////////////
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_frag);
    //MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map_frag);
    mapFragment.getMapAsync(this);


    // make textView that will be displaying current user location
    MainActivity.textView = new TextView(this);
    MainActivity.textView.setTextSize(30);
    MainActivity.textView.setTextColor(Color.parseColor("#FFF4FE53"));

    RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    rlp.setMargins(150, 150, 0, 0);
    MainActivity.textView.setLayoutParams(rlp);



    // check whether user coordinates have been modified
    if(MainActivity.user.uLatitude == 0 && MainActivity.user.uLongitude == 0) {
        // by default it is gonna show this message
        MainActivity.textView.setText("Please wait for coordinates");
    }



    // find layout that we can display the text on
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.contentTrackingActivity);

    // add textView to the corresponding layout
    layout.addView(MainActivity.textView);


    image = (ImageView) findViewById(R.id.arrow_iv);

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);

    mPrefs  = getPreferences(MODE_PRIVATE);

    startTracking(MainActivity.user.updated);


}


public  void startTracking(boolean userUpdated) {

    if (userUpdated) {
        Target tryTarget = retrieveTarget();
        //Target tryTarget = null;
        TextView textview = (TextView) findViewById(R.id.textView_notes);

        if (tryTarget == null) {

            // initialize target that is going to be tracked

            Target target = new Target(MainActivity.user.uLongitude, MainActivity.user.uLatitude);
            target.tLocation = MainActivity.currentLocation;
            saveTarget(target);

            resetParking(target);

        }
        else{
            saveTarget(tryTarget);

            resetParking(tryTarget);

            if(tryTarget.note == null || tryTarget.note == ""){
                textview.setText("Click to add notes");
            }
            else
            {
                textview.setText(tryTarget.note);
            }

        }
    }
        else {
            trackStart = false;
        }


}

public static Target getTarget(String targetName){
    if(targetList.isEmpty())
    {
        return null;
    }
    else{
        for(Target target : targetList){
            if(target.name.equals(targetName)) {
                return target;
            }
        }
    }
    return null;
}

public void openMap(View view){
    Intent intent = new Intent(this, TrackMap.class);
    startActivity(intent);
}


@Override
public void onSensorChanged(SensorEvent event) {
    //degree between phone y axis and magnetic north
    Float azimuth = (float) Math.round(event.values[0]);

    //we need target location object
    Target target = getTarget("Car");

    // get bearing between phone and target
    Float bearing = MainActivity.currentLocation.bearingTo(target.tLocation);

    //calculate the direction to which the arrow will be poinitng
    Float direction = azimuth - bearing;

    //arrow that will be rotating
    RotateAnimation ra = new RotateAnimation(currentDegree, -direction, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

    //one second
    ra.setDuration(1000);
    ra.setFillAfter(true);
    image.startAnimation(ra);
    currentDegree = -direction;
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    //not needed
}


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

    targetDislplayed = TrackingActivity.getTarget("Car");

    // Add a marker at user location and move the camera
    LatLng userLocation = new LatLng(targetDislplayed.tLatitude, targetDislplayed.tLongitude);
    mMap.addMarker(new MarkerOptions().position(new LatLng(targetDislplayed.tLatitude, targetDislplayed.tLongitude))
            .title("Target"));

    mMap.moveCamera(CameraUpdateFactory.newLatLng(userLocation));

    // doesnt need permission check because the code in previous itents would allow user to open this map without the permission, might add it just for fun :D
    mMap.setMyLocationEnabled(true);



}


public static void saveTarget(Target tempTarget){

    //mPrefs  = getPreferences(MODE_PRIVATE);

    SharedPreferences.Editor prefsEditor = mPrefs.edit();


    Gson gson = new Gson();
    String json = gson.toJson(tempTarget);
    prefsEditor.putString("SavedTarget", json);
    prefsEditor.apply();
    //mPrefs.edit().putString("SavedTarget",json).apply();

}

public static Target retrieveTarget(){
    Gson gson = new Gson();
    String json = mPrefs.getString("SavedTarget","");

    Target returnedTarget = null;

    returnedTarget = gson.fromJson(json, Target.class);

    return returnedTarget;
}

@Override
protected void onStart() {
    super.onStart();
    //startTracking(MainActivity.user.updated);
}

public void resetParking(Target target){
    TextView textView = (TextView) findViewById(R.id.textView_notes);
    textView.setText("Click to add notes");

    if (targetList.isEmpty()) {
        targetList.add(target);
        MainActivity.targetTracked = target;

        trackStart = true;
    } else {
        Target tempTarget = getTarget("Car");
        targetList.remove(tempTarget);

        targetList.add(target);
        MainActivity.targetTracked = target;
        trackStart = true;
    }
}

public void resetParkingButtonClicked(View view){



    //Toast.makeText(TrackingActivity.this, "Canceled reset action", Toast.LENGTH_SHORT).show();

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Are you sure you want to reset the parking location?");
    builder.setTitle("Reset parking location");
    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //clicked ok button
            Target target = new Target(MainActivity.user.uLongitude, MainActivity.user.uLatitude);
            target.tLocation = MainActivity.currentLocation;
            saveTarget(target);
            resetParking(target);
            mMap.clear();
            TrackingActivity.mMap.addMarker(new MarkerOptions().position(new LatLng(target.tLatitude, target.tLongitude))
                    .title("Target"));
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(TrackingActivity.this, "Canceled reset action", Toast.LENGTH_SHORT).show();
            dialog.cancel();
        }
    });

    AlertDialog dialog = builder.create();
    dialog.show();


}
public void textViewAddNote(View view){
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Add note");
    final EditText input = new EditText(this);
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    builder.setView(input);
    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Target target = getTarget("Car");
            target.note = input.getText().toString();
            TextView textview = (TextView) findViewById(R.id.textView_notes);
            textview.setText(target.note);
            saveTarget(target);
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(TrackingActivity.this, "Canceled note action", Toast.LENGTH_SHORT).show();
            dialog.cancel();
        }
    });

    AlertDialog dialog = builder.create();
    dialog.show();
}

} }

My dependencies: 我的依赖:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
defaultConfig {
    applicationId "com.example.matej.locato"
    minSdkVersion 14
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"

    // Enabling multidex support.
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
    }
}
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.google.android.gms:play-services:9.2.0'
    compile 'com.google.code.gson:gson:2.7'
    compile 'com.android.support:multidex:1.0.0'
}

tried to update the proguard-rules.pro but it has no effect, I am still getting the error. 尝试更新proguard-rules.pro,但没有效果,我仍然收到错误消息。

Since you have enabled minifyEnabled true in gradle-config, proguard can be the issue. 由于您已在gradle-config中启用minifyEnabled true ,因此可能会出现proguard。

Try adding these lines in your proguard-rules.pro 尝试将这些行添加到您的proguard-rules.pro

-renamesourcefileattribute SourceFile
-keepattributes  Signature,SourceFile,LineNumberTable
-keep public class * extends android.app.Application

You need to pass context properly Change 您需要正确传递上下文

Intent intent = new Intent(this, TrackingActivity.class);

To

Intent intent = new Intent(Activity.this, TrackingActivity.class);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM