2016-08-15 104 views
0

我正在製作一個跟蹤基於GPS的用戶的應用程序。 當我按下按鈕移動到另一個意圖時,我得到這個錯誤。 我在使用Android v6測試三星Galaxy S5時沒有收到此錯誤。 錯誤已經出現在有Android v4.4.4單擊按鈕時發生java.lang.ExceptionInInitializerError

這裏HTC的錯誤:

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)  

這是按鈕的代碼:

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(); 
    } 
} 

和代碼拋出錯誤的活動:

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(); 
} 

}

我的依賴關係:

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' 
} 

嘗試更新proguard-rules.pro,但它沒有任何效果,我仍然得到錯誤。

+1

的[proguard的缺少類型參數]可能的複製( http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter) – Shaishav

+0

我已經構建了apk並在我的S5上安裝了一個,當我點擊按鈕時它也崩潰了,所以代碼只能在從android studio加載到手機上時起作用,在任何情況下它都不適用於HTC。所以它必須是刪除代碼的東西。我會看看proguard文件。 –

+0

我試圖將它添加到proguard規則親,但我仍然得到錯誤。 –

回答

0

由於您在gradle-config中啓用了minifyEnabled true,因此proguard會成爲問題。

嘗試增加這些線路在proguard-rules.pro

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

我會試試看。 MainActivity加載完全正常,只有當點擊該按鈕時,下一個Activity纔會崩潰。 –

+0

難道是因爲我使用multidex? –

+0

刪除proguard-rules.pro的entrie內容,然後將其粘貼到文件中已解決該問題。非常感謝。 –

0

您需要通過上下文正確 變化

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

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