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.
double possible de [proguard manquant paramètre de type] (http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter) – Shaishav
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. –
J'ai essayé de l'ajouter à proguard rules pro mais j'ai toujours l'erreur. –