Вставьте изображения / стикер / GIF в EditText в Android с пользовательской клавиатуры / клавиатуры Google - PullRequest
0 голосов
/ 27 апреля 2018

Я пытался вставить эмодзи, используя клавиатуру, например клавиатуру Google Gboard, на мой edittext, но он показывает тост This text field does not support GIF insertion from the keyboard.

enter image description here

Есть несколько вопросов относительно одного и того же, но нет правильного ответа. Я прочитал справочную документацию , указанную , но не учитывая реализацию. Я попробовал это, но она не запускает onCommitContent -

EditText editText = new EditText(this) {
    @Override
    public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
        final InputConnection ic = super.onCreateInputConnection(editorInfo);

        final InputConnectionCompat.OnCommitContentListener callback =
            new InputConnectionCompat.OnCommitContentListener() {
                @Override
                public boolean onCommitContent(InputContentInfoCompat inputContentInfo,
                        int flags, Bundle opts) {
                    // read and display inputContentInfo asynchronously
                    if (BuildCompat.isAtLeastNMR1() && (flags &
                        InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {
                        try {
                            inputContentInfo.requestPermission();
                        }
                        catch (Exception e) {
                            return false; // return false if failed
                        }
                    }

                    // read and display inputContentInfo asynchronously.
                    // call inputContentInfo.releasePermission() as needed.

                    return true;  // return true if succeeded
                }
            };
        return InputConnectionCompat.createWrapper(ic, editorInfo, callback);
    }
};

но такие приложения, как Whatsapp, Telegram поддерживают эту функцию. Мне нужно создать собственный EditText или что-то?

1 Ответ

0 голосов
/ 27 апреля 2018

Как указано в вашем вопросе, похоже, у вас не установлен тип mime контента. Я создал EditText с обратным вызовом keyBoardInputCallbackListener, который определяет, вставлен ли какой-либо gif/png/jpg/webp через программную клавиатуру.

public class MyEditText extends android.support.v7.widget.AppCompatEditText {

  private String[] imgTypeString;
  private KeyBoardInputCallbackListener keyBoardInputCallbackListener;

  public MyEditText(Context context) {
      super(context);
      initView();
  }

  public MyEditText(Context context, AttributeSet attrs) {
      super(context, attrs);
      initView();
  }

  private void initView() {
      imgTypeString = new String[]{"image/png",
            "image/gif",
            "image/jpeg",
            "image/webp"};
  }

  @Override
  public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
      final InputConnection ic = super.onCreateInputConnection(outAttrs);
      EditorInfoCompat.setContentMimeTypes(outAttrs,
              imgTypeString);
      return InputConnectionCompat.createWrapper(ic, outAttrs, callback);
  }


  final InputConnectionCompat.OnCommitContentListener callback =
        new InputConnectionCompat.OnCommitContentListener() {
            @Override
            public boolean onCommitContent(InputContentInfoCompat inputContentInfo,
                                           int flags, Bundle opts) {

                // read and display inputContentInfo asynchronously
                if (BuildCompat.isAtLeastNMR1() && (flags &
                        InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {
                    try {
                        inputContentInfo.requestPermission();
                    } catch (Exception e) {
                        return false; // return false if failed
                    }
                }
                boolean supported = false;
                for (final String mimeType : imgTypeString) {
                    if (inputContentInfo.getDescription().hasMimeType(mimeType)) {
                        supported = true;
                        break;
                    }
                }
                if (!supported) {
                    return false;
                }

                if (keyBoardInputCallbackListener != null) {
                    keyBoardInputCallbackListener.onCommitContent(inputContentInfo, flags, opts);
                }
                return true;  // return true if succeeded
            }
        };

  public interface KeyBoardInputCallbackListener {
      void onCommitContent(InputContentInfoCompat inputContentInfo,
                         int flags, Bundle opts);
  }

  public void setKeyBoardInputCallbackListener(KeyBoardInputCallbackListener keyBoardInputCallbackListener) {
      this.keyBoardInputCallbackListener = keyBoardInputCallbackListener;
  }

  public String[] getImgTypeString() {
      return imgTypeString;
  }

  public void setImgTypeString(String[] imgTypeString) {
      this.imgTypeString = imgTypeString;
  }
}

Используйте это в своем классе деятельности -

MyEditText myEditText = (MyEditText)findViewbyId(R.id.myEditText);
myEditText.setKeyBoardInputCallbackListener(new KeyBoardInputCallbackListener() {
                        @Override
                        public void onCommitContent(InputContentInfoCompat inputContentInfo,
                             int flags, Bundle opts) {
                        //you will get your gif/png/jpg here in opts bundle
                        }
                    });
...