I am creating an audio card reader, but I am getting an error message with windows. I can not track what causes the error in my codes. Can someone help me point out what causes the error in my codes? any thought would be highly appreciated.
Here are my codes:
public class SReaderActivity extends Activity { public final String TAG = "SReaderActivity"; Button swipe, get;// detect, stop TextView result_text, mTitle; private TimeCount time = null; private AudioManager am = null; int maxVol; private ProgressDialog progressDialog; private boolean mHeadsetPlugged = false; private BroadcastReceiver mHeadsetReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_HEADSET_PLUG)) { boolean hasHeadset = (intent.getIntExtra("state", 0) == 1); boolean hasMicroPhone = (intent.getIntExtra("microphone", 0) == 1); if (hasHeadset && hasMicroPhone) { mHeadsetPlugged = true; } else { mHeadsetPlugged = false; if (sreader != null) sreader.Stop(); handler.post(disable_button); } handler.post(mHeadsetPluginHandler); } } }; private Handler handler = new Handler(); SReaderApi sreader = null; private String version = null; private String ksn = null; private String random = null; private String workingkey = null; private String encryption_data = null; private String decryption_data = null; private String T1PAN_data = null; private String T1Name_Exd = null; private String T2PAN_data = null; private String T2Exd_data = null; private Runnable mHeadsetPluginHandler = new Runnable() { public void run() { String plug_str = mHeadsetPlugged ? "plugin" : "unplugin"; Toast.makeText(SReaderActivity.this, "Headset " + plug_str, Toast.LENGTH_SHORT).show(); if (sreader != null && mHeadsetPlugged == false) { // Device unplug APP close CloseSinWave(); finish(); } else { onDetect(); } } }; private Runnable disable_button = new Runnable() { public void run() { swipe.setEnabled(false); get.setEnabled(false); } }; private Runnable enable_button = new Runnable() { public void run() { get.setText(R.string.get); swipe.setClickable(true); swipe.setEnabled(true); swipe.setText(R.string.swipe); } }; private Runnable enable_get = new Runnable() { public void run() { get.setEnabled(true); get.setClickable(true); } }; private Runnable timeout_ack = new Runnable() { public void run() { Toast.makeText(SReaderActivity.this, "Timeout!!!", Toast.LENGTH_SHORT).show(); } }; private Runnable unknown_err = new Runnable() { public void run() { result_text.setText(R.string.unknown_error); } }; private Runnable detcet = new Runnable() { public void run() { String txt = "Detect OK\n"; result_text.setText(txt); } }; private Runnable display_encryptiondata = new Runnable() { public void run() { String txt = "Encryption data\n"; txt += encryption_data + "\n\n\n"; result_text.setText(txt); } }; private Runnable display_decryptiondata = new Runnable() { public void run() { String txt = "Encryption data\n"; txt += encryption_data + "\n\n\nDecryption data\n"; txt += decryption_data + "\n"; result_text.setText(txt); } }; private Runnable display_get_data = new Runnable() { public void run() { String txt = "Decryption data\n"; txt += decryption_data + "\n\n\n\n"; txt += "T1PAN:" + T1PAN_data + "\n"; txt += "T1Name_Exd:" + T1Name_Exd + "\n"; txt += "T2PAN:" + T2PAN_data + "\n"; txt += "T2Exd:" + T2Exd_data + "\n"; result_text.setText(txt); } }; private Runnable clear_all = new Runnable() { public void run() { encryption_data = ""; decryption_data = ""; T1PAN_data = ""; T1Name_Exd = ""; T2PAN_data = ""; T2Exd_data = ""; result_text.setText(""); } }; private Runnable clear_encryption = new Runnable() { public void run() { encryption_data = ""; decryption_data = ""; T1PAN_data = ""; T1Name_Exd = ""; T2PAN_data = ""; T2Exd_data = ""; result_text.setText(""); } }; private Runnable clear_carddata = new Runnable() { public void run() { encryption_data = ""; T1PAN_data = ""; T1Name_Exd = ""; T2PAN_data = ""; T2Exd_data = ""; result_text.setText(""); } }; private Runnable settext_swpie = new Runnable() { public void run() { swipe.setClickable(true); swipe.setText(R.string.swipe); } }; private Runnable begin_get = new Runnable() { public void run() { myToast = new MyToast(SReaderActivity.this, "get T1&T2 Data..."); myToast.show(); } }; private Runnable settext_get = new Runnable() { public void run() { get.setClickable(true); get.setText(R.string.get); } }; public class MyToast { private Context mContext = null; private Toast mToast = null; private Handler mHandler = null; private Runnable mToastThread = new Runnable() { public void run() { mToast.show(); mHandler.postDelayed(mToastThread, 3000); } }; public MyToast(Context context, String txt) { mContext = context; mHandler = new Handler(mContext.getMainLooper()); mToast = Toast.makeText(mContext, txt, Toast.LENGTH_LONG); } public void setText(String text) { mToast.setText(text); } public void show() { mHandler.post(mToastThread); } public void cancel() { mHandler.removeCallbacks(mToastThread); mToast.cancel(); } } private MyToast myToast = null; class TimeCount extends CountDownTimer { int id; public TimeCount(int id, long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval);// ²ÎÊýÒÀ´ÎΪ×Üʱ³¤,ºÍ¼ÆÊ±µÄʱ¼ä¼ä¸ô this.id = id; } @Override public void onFinish() {// ¼ÆÊ±Íê±Ïʱ´¥·¢ if (id == R.id.swipe) { swipe.setText(R.string.reswipe); swipe.setClickable(true); } else if (id == R.id.get) { get.setText(R.string.get); get.setClickable(true); } } @Override public void onTick(long millisUntilFinished) {// ¼ÆÊ±¹ý³ÌÏÔʾ CharSequence str = getString(R.string.second); if (id == R.id.swipe) { swipe.setClickable(false); } else if (id == R.id.get) { get.setClickable(false); } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.swipe); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title); mTitle = (TextView) findViewById(R.id.title_left_text); mTitle.setText(R.string.version_name); am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); IntentFilter iFilter = new IntentFilter(); iFilter.addAction(Intent.ACTION_HEADSET_PLUG); iFilter.addCategory(Intent.CATEGORY_DEFAULT); registerReceiver(mHeadsetReceiver, iFilter); swipe = (Button) this.findViewById(R.id.swipe); swipe.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { onSwipe(); } }); get = (Button) this.findViewById(R.id.get); get.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { onGet(); } }); result_text = (TextView) this.findViewById(R.id.result); swipe.setEnabled(false); get.setEnabled(false); setVolumeControlStream(AudioManager.STREAM_MUSIC); maxVol = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); am.setStreamVolume(AudioManager.STREAM_MUSIC, maxVol, 0); } public void onDestroy() { unregisterReceiver(mHeadsetReceiver); super.onDestroy(); } public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_MENU: { openOptionsDialog(); return true; } case KeyEvent.KEYCODE_BACK: { // Log.WritetoFile(); if (sreader != null) { sreader.Stop(); sreader = null; if (myToast != null) myToast.cancel(); finish(); System.exit(0); return true; } } } return super.onKeyDown(keyCode, event); } public void onUserLeaveHint() { // this only executes when Home is selected. // do stuff super.onUserLeaveHint(); if (sreader != null) { sreader.Stop(); sreader = null; if (myToast != null) myToast.cancel(); finish(); System.exit(0); } } public void onAttachedToWindow() { super.onAttachedToWindow(); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } private void openOptionsDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(SReaderActivity.this); dialog.setTitle("SS505 sReader"); dialog.setMessage("Magnetic Card Reader APP"); dialog.setNegativeButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.show(); } private void onSwipe() { if (sreader == null) return; progressDialog = ProgressDialog.show(this, "Loadding Key", "Please wait swipe card ...", true, false); time = new TimeCount(R.id.swipe, 15000, 1000); time.start();// ¿ªÊ¼¼ÆÊ± swipe.setEnabled(false); get.setEnabled(false); new Thread() { public void run() { String data = null; decryption_data = null; encryption_data = null; handler.post(clear_encryption); try { random = sreader.GetRandom(10000); if (random == null) { progressDialog.dismiss(); String err = sreader.GetErrorString(); if (err.equalsIgnoreCase("cancel all")) return; } workingkey = sreader.GenerateWorkingKey(random, ksn); progressDialog.dismiss(); data = sreader.ReadCard(15000); } catch (Exception ex) { progressDialog.dismiss(); if (ex instanceof TimeoutException) { time.cancel(); sreader.Cancel(); handler.post(enable_button); handler.post(timeout_ack); return; } else handler.post(unknown_err); CloseSinWave(); } time.cancel(); if (data == null) { encryption_data = sreader.GetErrorString(); if (encryption_data.equalsIgnoreCase("cancel all")) return; handler.post(display_encryptiondata); } else { encryption_data = "\n" + data; handler.post(display_encryptiondata); String d_str = sreader.TriDesDecryption(workingkey, data); if (d_str != null) { if (false == d_str.startsWith("A1")) { return; } int index2 = FindSplitCharIndex(d_str, "A2", 2); int index3 = FindSplitCharIndex(d_str, "A3", index2 + 2); if (index2 < 0 || index3 < 0) { return; } String t1 = d_str.substring(2, index2); String t2 = d_str.substring(index2 + 2, index3); String t3 = d_str.substring(index3 + 2); String ex_msg = ""; if (t1.equals("")) decryption_data = "\nT1=" + "T1 Empty"; else decryption_data = "\nT1=" + changeHexString2CharString(t1); if (t2.equals("")) decryption_data += "\nT2=" + "T2 Empty"; else { String e2 = changeHexString2CharString(t2); if (e2.length() < 24 || e2.length() > 40) ex_msg = "\nTrack2 " + getResources().getText(R.string.de_len) + e2.length() + "byte"; decryption_data += "\nT2=" + e2; } if (t3.equals("")) decryption_data += "\nT3=" + "T3 Empty"; else decryption_data += "\nT3=" + changeHexString2CharString(t3) + ex_msg; handler.post(display_decryptiondata); } } handler.post(enable_button); handler.post(settext_swpie); handler.post(enable_get); } }.start(); } private int FindSplitCharIndex(String str, String split, int start) { int i = start; while (i < str.length() && i + 1 < str.length()) { String e = str.substring(i, i + 2); if (e.equals(split)) { return i; } i += 2; } return -1; } private String changeHexString2CharString(String e) { String char_txt = ""; for (int i = 0; i < e.length(); i = i + 2) { String c = e.substring(i, i + 2); char j = (char) Integer.parseInt(c, 16); char_txt += j; } return char_txt; } private boolean Detect_sReader() { mHeadsetPlugged = HeadSetUtils.checkHeadset(); if (!mHeadsetPlugged) { result_text.setText(R.string.nodevice); } return mHeadsetPlugged; } private boolean GenerateSinWave() { sreader = SReaderApi.getSreaderInstance(); if (sreader.Init() == true) { sreader.Start(); am.setMode(AudioManager.MODE_NORMAL); return true; } return false; } private void CloseSinWave() { if (sreader != null) sreader.Stop(); } private void Initialization() { swipe.setEnabled(false); progressDialog = ProgressDialog.show(this, "", "Card Reader Detecting...", true, false); new Thread() { public void run() { int i = 0; try { int j = 1; boolean s_init = false; while (j < 5) { try { s_init = sreader.Initial(2500); if (s_init) break; } catch (Exception ex) { if (ex instanceof TimeoutException) { if (j == 4) { handler.post(timeout_ack); } else sleep(1000); } else { handler.post(unknown_err); break; } } j++; } if (!s_init) { CloseSinWave(); progressDialog.dismiss(); return; } i++; ksn = sreader.GetKSN(5000); if (ksn == null) { String err = sreader.GetErrorString(); if (err.equalsIgnoreCase("cancel all")) return; throw new Exception("ksn is null"); } handler.post(enable_button); handler.post(detcet); progressDialog.dismiss(); } catch (Exception ex) { progressDialog.dismiss(); if (ex instanceof TimeoutException) { handler.post(timeout_ack); } else handler.post(unknown_err); CloseSinWave(); } } }.start(); } private void onGet() { if (sreader == null) return; time = new TimeCount(R.id.get, 10000, 1000); time.start();// ¿ªÊ¼¼ÆÊ± get.setEnabled(false); swipe.setEnabled(false); handler.post(begin_get); new Thread() { public void run() { String Empty = "Empty"; int i = 0; handler.post(clear_carddata); try { T1PAN_data = sreader.GetT1PAN(5000); if (T1PAN_data == null) { T1PAN_data = Empty; } else { T1PAN_data = changeHexString2CharString(T1PAN_data); } i++; T1Name_Exd = sreader.GetT1HolderName_Exd(5000); if (T1Name_Exd == null) { T1Name_Exd = Empty; } else { T1Name_Exd = changeHexString2CharString(T1Name_Exd); } i++; T2PAN_data = sreader.GetT2PAN(5000); if (T2PAN_data == null) { T2PAN_data = Empty; } else { T2PAN_data = changeHexString2CharString(T2PAN_data); } i++; T2Exd_data = sreader.GetT2Exd(5000); if (T2Exd_data == null) { T2Exd_data = Empty; } else { T2Exd_data = changeHexString2CharString(T2Exd_data); } handler.post(display_get_data); } catch (Exception ex) { if (ex instanceof TimeoutException) { time.cancel(); myToast.cancel(); sreader.Cancel(); handler.post(enable_button); handler.post(timeout_ack); return; } else handler.post(unknown_err); CloseSinWave(); } myToast.cancel(); time.cancel(); handler.post(settext_get); handler.post(enable_button); } }.start(); } private void onDetect() { am.setStreamVolume(AudioManager.STREAM_MUSIC, maxVol, 0); if (Detect_sReader() == true) { handler.post(clear_all); if (GenerateSinWave() == true) { Initialization(); } } } }
Here is the cat log:
05-20 16:26:30.638: E/AndroidRuntime(1497): FATAL EXCEPTION: main 05-20 16:26:30.638: E/AndroidRuntime(1497): java.lang.IllegalArgumentException: Window type can not be changed after the window is added. 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.os.Parcel.readException(Parcel.java:1429) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.os.Parcel.readException(Parcel.java:1379) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:634) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:3835) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1384) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 05-20 16:26:30.638: E/AndroidRuntime(1497): at android.view.Choreographer.doFrame(Choreographer.java:525)