Я только что опубликовал приложение, которое я тестировал вчера. Приложение отлично работает на эмуляторах из Android Studio (за исключением, конечно, медленного), но приложение падает, если вы делаете определенную часть приложения (одна из основных функций).Android - приложение падает на Android-телефон, но не на Android-эмулятор (Android Studio)
Я тестировал его сегодня утром на эмуляторах, но все работает на моем ПК.
Я проверил код, который происходит во время этой аварии (см ниже), но не могу найти что-нибудь:
CalculateActivity
public class CalculateActivity extends ActionBarActivity {
TextView txtBewareTurnoverTime;
EditText txtPoolSize;
EditText txtTurnoverTime;
EditText txtTurnoverRate;
Button btnCalculate;
ImageButton imgBtnTurnoverTime, imgBtnTurnoverRate;
Animation shakeAni;
RelativeLayout layoutPoolSize, layoutTurnoverTime, layoutTurnoverRate;
LinearLayout layoutInfoTurnoverRate;
LinearLayout layoutInfoTurnoverTime;
boolean infoTurnoverRate = false;
boolean infoTurnoverTime = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculate);
FindAllById();
SetListeners();
}
//Finds all views by their ID and applies them to the variables
private void FindAllById() {
txtPoolSize = (EditText) findViewById(R.id.txtPoolSizeEdit);
txtTurnoverTime = (EditText) findViewById(R.id.txtTurnoverTimeEdit);
txtTurnoverRate = (EditText) findViewById(R.id.txtTurnoverRateEdit);
txtBewareTurnoverTime = (TextView) findViewById(R.id.txtInfoTurnoverTime);
layoutPoolSize = (RelativeLayout) findViewById(R.id.layoutPoolSize);
layoutTurnoverTime = (RelativeLayout) findViewById(R.id.layoutTurnoverTime);
layoutTurnoverRate = (RelativeLayout) findViewById(R.id.layoutTurnoverRate);
imgBtnTurnoverRate = (ImageButton) findViewById(R.id.imgBtnTurnoverRate);
imgBtnTurnoverTime = (ImageButton) findViewById(R.id.imgBtnTurnoverTime);
layoutInfoTurnoverRate = (LinearLayout) findViewById(R.id.layoutInfoTurnoverRate);
layoutInfoTurnoverRate.setVisibility(View.GONE);
layoutInfoTurnoverTime = (LinearLayout) findViewById(R.id.layoutInfoTurnoverTime);
layoutInfoTurnoverTime.setVisibility(View.GONE);
}
//Set the listeners on the various components
private void SetListeners(){
btnCalculate = (Button) findViewById(R.id.calculateBtnCalcView);
btnCalculate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ShakeAnimation();
}
});
imgBtnTurnoverTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!infoTurnoverTime){layoutInfoTurnoverTime.setVisibility(View.VISIBLE); infoTurnoverTime = true;}
else{layoutInfoTurnoverTime.setVisibility(View.GONE); infoTurnoverTime = false;}
}
});
imgBtnTurnoverRate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!infoTurnoverRate){layoutInfoTurnoverRate.setVisibility(View.VISIBLE); infoTurnoverRate = true;}
else{layoutInfoTurnoverRate.setVisibility(View.GONE); infoTurnoverRate = false;}
}
});
}
//Plays the animation for the correct relative layouts, if any
private void ShakeAnimation(){
shakeAni = AnimationUtils.loadAnimation(CalculateActivity.this, R.anim.shake);
int switchInt = new AnimationHelper().CalculateAnimationInt(txtPoolSize.getText().toString(), txtTurnoverTime.getText().toString(), txtTurnoverRate.getText().toString());
switch(switchInt){
case 1: layoutPoolSize.startAnimation(shakeAni);
layoutTurnoverTime.startAnimation(shakeAni);
layoutTurnoverRate.startAnimation(shakeAni);
break;
case 2: layoutPoolSize.startAnimation(shakeAni);
layoutTurnoverTime.startAnimation(shakeAni);
break;
case 3: layoutPoolSize.startAnimation(shakeAni);
layoutTurnoverRate.startAnimation(shakeAni);
break;
case 4: layoutTurnoverTime.startAnimation(shakeAni);
layoutTurnoverRate.startAnimation(shakeAni);
break;
case 5: layoutPoolSize.startAnimation(shakeAni);
break;
case 6: layoutTurnoverTime.startAnimation(shakeAni);
break;
case 7: layoutTurnoverRate.startAnimation(shakeAni);
break;
case 8: StartResultActivity();
break;
}
}
//Start the ResultActivity with the given variables
private void StartResultActivity(){
Intent i = new Intent().setClass(CalculateActivity.this, ResultActivity.class);
i.putExtra("poolSize", txtPoolSize.getText().toString());
i.putExtra("turnoverTime", txtTurnoverTime.getText().toString());
i.putExtra("turnoverRate", txtTurnoverRate.getText().toString());
startActivity(i);
}
}
ResultActivity
public class ResultActivity extends ActionBarActivity {
TextView resultPumpRequirement;
TextView resultFilterAreaRequirement;
TextView resultMinimumDiameterFilter;
Button btnFilters;
Button btnPumps;
String poolSize;
String turnoverTime;
String turnoverRate;
int pumpRequirement;
double filterAreaRequiment;
int minimumDiameterFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
Intent intent = getIntent();
if(intent != null) {
poolSize = intent.getStringExtra("poolSize");
turnoverTime = intent.getStringExtra("turnoverTime");
turnoverRate = intent.getStringExtra("turnoverRate");
Calculate();
SetText();
SetListeners();
}
}
//Set the listeners on the various components
private void SetListeners() {
btnFilters = (Button) findViewById(R.id.btnFilters);
btnFilters.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(new URLHelper().CreateFilterURL(minimumDiameterFilter))));
}
});
btnPumps = (Button) findViewById(R.id.btnPumps);
btnPumps.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(new URLHelper().CreatePumpURL(pumpRequirement))));
}
});
}
//Calculates the variables using the custom Calculate helper class (CalculateResult)
private void Calculate(){
CalculateHelper calcHelper = new CalculateHelper(poolSize, turnoverTime, turnoverRate);
pumpRequirement = calcHelper.CalculatePumpRequirement();
filterAreaRequiment = calcHelper.CalculateFilterAreaRequirement();
minimumDiameterFilter = calcHelper.CalculateMinimumDiameterFilter();
}
//Applies everything to the view "activity_result" after being calculated
private void SetText(){
resultPumpRequirement = (TextView) findViewById(R.id.resultPumpRequirement);
resultPumpRequirement.setText(Html.fromHtml(pumpRequirement + " m<sup><small>3</small></sup> per time"));
resultFilterAreaRequirement = (TextView) findViewById(R.id.resultFilterAreaRequirement);
resultFilterAreaRequirement.setText(Html.fromHtml(filterAreaRequiment + " m<sup><small>2</small></sup>"));
resultMinimumDiameterFilter = (TextView) findViewById(R.id.resultMinimumDiameterFilter);
resultMinimumDiameterFilter.setText(minimumDiameterFilter + "mm");
}
}
Это два класса, которые на самом деле ничего не делают во время этой аварии. Я не могу найти ANY недостатки, и я надеялся, что некоторые из вас смогут что-то заметить.
Заранее благодарен!
сообщение The StackTrace. – Raghunandan
@Raghunandan Он падает на фактический телефон, который запретил это приложение из Google Play, а не на моем ПК. Могу ли я получить стек из телефона? – Detilium
, если у вас есть какой-либо механизм для такого же типа, как Google crash analytics или crashlytics form fabric – Raghunandan