I'm developing one app on CIPHERLAB device that has two lateral physical buttons that activate the laser and can scar some barcodes.
My main issue is all what i would make it do works properly but if i get back to another activity by pressing back button and return to the same activity where i can scan the barcode the app crash if i scan another code and when i return to that activity it gives following errors and crash if i scan a code:
06-11 12:11:47.211 25170-25170/com.example.igardini.visualposmobile E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.igardini.visualposmobile, PID: 25170 android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@89ed74e is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:796) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:351) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) at android.app.Dialog.show(Dialog.java:322) at com.example.igardini.visualposmobile.cassa.CustomAllert(cassa.java:217) at com.example.igardini.visualposmobile.cassa$2.run(cassa.java:123) at android.os.Handler.handleCallback(Handler.java:836) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:203) at android.app.ActivityThread.main(ActivityThread.java:6251) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Here is my cassa.java activity code where i've implemented method which i use to scan the barcode with the laser and print it as a String.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cassa);
editText = findViewById(R.id.editTextBar);
myDB = new DataBaseHandler(this);
itemCassas = new ArrayList<>();
buildTopRecyclerView();
loadData();
buildRecyclerView();
price = findViewById(R.id.priceText);
m_RM = ReaderManager.InitInstance(getApplicationContext());
mReaderCallback = cassa.this;
IntentFilter filter = new IntentFilter();
filter.addAction(GeneralString.Intent_READERSERVICE_CONNECTED);
registerReceiver(myDataReceiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myDataReceiver);
}
private final BroadcastReceiver myDataReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(GeneralString.Intent_READERSERVICE_CONNECTED)) {
if(mReaderCallback != null){
m_RM.SetReaderCallback(mReaderCallback);
}
}
}
};
// getting a string of barcode after scanning it
@Override
public void onDecodeComplete(final String arg0) throws RemoteException {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
editText.setText(arg0);
// using the string got from the scanning for searching some data from the DB
if(!TextUtils.isEmpty(editText.getText().toString())) {
searchKeyword = editText.getText().toString();
result = myDB.dbRawSearch(searchKeyword);
if(result != null) {
String[] split = result.split("\n");
if (!split[0].equals("")) {
resultArt = myDB.dbRawArticoli(split[0]);
String[] splitArt = resultArt.split("\n");
itemCassas.add(new ItemCassa(splitArt[0], splitArt[1], Double.parseDouble(splitArt[2].replace(",", "."))));
exampleAdapter.notifyItemInserted(itemCassas.size());
} else {
CustomAllert();
}
}
}
}
});
}
@Override
public IBinder asBinder() {
return null;
}
// Funzione per il controllo del pulsante Back
@Override
public void onBackPressed() {
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
super.onBackPressed();
}
public void CustomAllert(){
AlertDialog.Builder mBuilder = new AlertDialog.Builder(this);
@SuppressLint("InflateParams") View mView = getLayoutInflater().inflate(R.layout.alert_dialog, null);
Button button = mView.findViewById(R.id.btnOK);
mBuilder.setView(mView);
final AlertDialog dialog = mBuilder.create();
dialog.show();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
}