Как я могу прочитать NF C в фоновом режиме и заполнить ввод веб-сайта в браузере? - PullRequest
0 голосов
/ 10 января 2020

Я хочу вставить NF C результат для ввода веб-сайта в браузере?

Я нашел это:

Nf c чтение только при работе с активностью. { ссылка } Я должен использовать InputMethodService для ввода текста. https://developer.android.com/guide/topics/text/creating-input-method.html Итак, я написал код. Я использовал NfcAdapter, чтобы поймать значение NF C. После того, как я скопировал значение Nf c с ClipboardManager, и я закрываю NfcActivity. Я использую для rkkr / simple-клавиатура. Моя пользовательская клавиатура имеет прослушиватель буфера обмена, так что я могу поймать значение и вставить значение. Сейчас они работают.

Но у меня проблема. Мое приложение работает везде, но не работает на ввод веб-сайта в браузере. Потому что моя пользовательская клавиатура закрывается в браузере, когда NF C успешно читает. Я не могу снова открыть клавиатуру, поэтому не могу вставить значение.

Вы можете мне помочь?

NF C Активность

public void handleIntent(Intent intent) {
        if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
            Log.i("SENDNFC", "Tag");
        }
        if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
            Log.i("SENDNFC", "Tag Extra");
            // Gets the tag
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            if (tag != null) {
                byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
                Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
                NdefMessage[] msgs = null;
                if (rawMsgs != null) {
                    msgs = new NdefMessage[rawMsgs.length];
                    for (int i = 0; i < rawMsgs.length; i++) {
                        msgs[i] = (NdefMessage) rawMsgs[i];
                    }
                }


                if (msgs == null || msgs.length == 0) return;

                String text = "";
//        String tagId = new String(msgs[0].getRecords()[0].getType());
                byte[] payload = msgs[0].getRecords()[0].getPayload();
                String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; // Get the Text Encoding
                int languageCodeLength = payload[0] & 0063; // Get the Language Code, e.g. "en"
                // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");

                try {
                    // Get the Text
                    text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
                } catch (UnsupportedEncodingException e) {
                    Log.e("UnsupportedEncoding", e.toString());
                }



                ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
                    ClipData clip = ClipData.newPlainText("simple text", "Nfc:" + text);
                    clipboardManager.setPrimaryClip(clip);
                    finish();
                } else {
                    Intent i = new Intent(this, NfcActivity.class);
                    startActivity(i);
                    finish();
                }



        }

LatinIME. java> Метод onCreate


//... Keyboard Default Code

ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        clipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
            @Override
            public void onPrimaryClipChanged() {

                handlePaste();
            }
});

LatinIME. java> метод handlePaste


private void handlePaste() {
        Log.i("SENFC", "handle paste runned");
        ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

        ClipData clipData = clipboardManager.getPrimaryClip();
        if (clipData != null) {

            ClipData.Item item = clipData.getItemAt(0);
            if (item != null) {

                if (item.getText().toString().startsWith("Nfc:")) {

                    if (isShowInputRequested()) {
                        Log.i("SENFC", "This is nfc");

                        if (getCurrentInputConnection() != null) {
                            if (getCurrentInputConnection().getExtractedText(new ExtractedTextRequest(), 0) != null) {
                                if (!getCurrentInputConnection().getExtractedText(new ExtractedTextRequest(), 0).text.toString().equals(item.getText().toString().substring(4))) {
                                    getCurrentInputConnection().commitText(item.getText().toString().substring(4), 1);

                                    ClipData clip = ClipData.newPlainText("simple text", "");
                                    clipboardManager.setPrimaryClip(clip);
                                } else {
                                    ClipData clip = ClipData.newPlainText("simple text", "");
                                    clipboardManager.setPrimaryClip(clip);
                                }
                            }
                        } else {

                        }

                    } else {

                        //below codes is for try
                        updateSoftInputWindowLayoutParameters();
                        mInputLogic.startInput();
                        mInputLogic.mConnection.beginBatchEdit();
                        Log.i("SENFC",item.getText().toString() );

                        // this code running when I use a debugger
                        mInputLogic.mConnection.commitText("try paste", 1);



                        Log.i("SENFC", "input can not add");
                    }
                } else {
                    Log.i("SENFC", "Startswith nfc : not found");
                }
            } else {
                Log.i("SENFC", "Clipdata item null");
            }
        } else {
            Log.i("SENFC", "Clip data Null");
        }


    }


...