2016-08-15 4 views
0

Je crée une application qui suit l'utilisateur en fonction du GPS. Lorsque j'appuie sur le bouton pour passer à une autre intention, j'obtiens cette erreur. Je n'ai pas eu cette erreur lors des tests sur Samsung Galaxy S5 avec Android v6. erreur est apparu sur HTC qui a Android v4.4.4java.lang.ExceptionInInitializerError lorsque le bouton est cliqué

est ici l'erreur:

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)  

C'est le code du bouton:

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

et le code pour l'activité qui jette l'erreur:

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

}

Mes dépendances:

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

essayé de mettre à jour le proguard-rules.pro mais il n'a pas d'effet, je reçois toujours l'erreur.

+1

double possible de [proguard manquant paramètre de type] (http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter) – Shaishav

+0

J'ai construit apk et instaled celui-là sur mon S5, il se bloque aussi quand je clique sur le bouton, donc le code ne fonctionne que lorsqu'il est chargé de studio android sur le téléphone, il ne fonctionne pas sur le HTC en tout cas. Donc, ça doit être quelque chose avec la suppression du code. Je vais regarder dans le fichier proguard. –

+0

J'ai essayé de l'ajouter à proguard rules pro mais j'ai toujours l'erreur. –

Répondre

0

Puisque vous avez activé minifyEnabled true dans gradle-config, proguard peut poser problème.

Essayez d'ajouter ces lignes dans votre proguard-rules.pro

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

Je vais essayer. MainActivity est chargé complètement et c'est seulement quand le bouton est cliqué que l'activité suivante se bloque. –

+0

Serait-ce parce que j'utilise multidex? –

+0

La suppression du contenu entrie de proguard-rules.pro, puis le collage dans le fichier a résolu le problème. Merci beaucoup. –

0

Vous devez passer le contexte correctement changement

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

Pour

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