0

我正在创建一个音频刷卡读卡器,但我遇到了 windows 错误。我无法追踪导致代码错误的原因。谁能帮我指出导致我的代码错误的原因?任何想法将不胜感激。

这是我的代码:

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

这是日志猫:

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)
4

2 回答 2

0

问题似乎出在onAttachedToWindow(). 更改如下功能并尝试一下。

public void onAttachedToWindow() {
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
        super.onAttachedToWindow();
}
于 2013-05-20T08:31:22.347 回答
0

targetSdk必须小于 14。

尝试将其设置为 13

检查这个答案。它对我有用。

于 2015-09-15T13:21:33.123 回答