微信朋友圈被折叠?会自动化不存在的(下)

1. 前言

但使用一段时间后,发现这种方式并不灵活!

主要体现在:

  • 不灵活,偶尔会误处理

  • 在手机系统及 UI 元素层面,适配性不强

本篇将介绍另外一种实现方式,即:开发一款简易的输入法,适配性强且方便快捷!

PS:如果想直接下载体验,可以通过文末方式获取

2. 步骤

2-1  创建键盘服务

首先,使用 Android Studio 创建一个项目(这里以 JAVA 为例,Kotlin 类似)

然后,自定义一个系统键盘输入服务类

  • 继承于 InputMethodService

  • 实现 KeyboardView.OnKeyboardActionListener 接口,并重写方法

/***
 * 自定义系统键盘输入服务
 */

package com.xingag.inputx;

import android.inputmethodservice.InputMethodService;
import android.inputmethodservice.KeyboardView;

/***
 * 自定义系统键盘输入服务
 */

public class CustomService extends InputMethodService implements KeyboardView.OnKeyboardActionListener
{
    @Override
    public void onPress(int primaryCode)
    {

}

@Override
    public void onRelease(int primaryCode)
    {

}

@Override
    public void onKey(int primaryCode, int[] keyCodes)
    {

}

@Override
    public void onText(CharSequence text)
    {

}

@Override
    public void swipeLeft()
    {

}

@Override
    public void swipeRight()
    {

}

@Override
    public void swipeDown()
    {

}

@Override
    public void swipeUp()
    {

}
}

2-2  Manifest 配置键盘服务

在 AndroidManifest.xml 文件中,配置键盘服务,并在 service 的 meta-data 中引用元数据

<service
    android:name=".CustomService"
    android:permission="android.permission.BIND_INPUT_METHOD">
    <intent-filter>
        <action android:name="android.view.InputMethod" />
    </intent-filter>
    <meta-data
        android:name="android.view.im"
        android:resource="@xml/method" />
</service>

元数据定义在 res/xml 目录下,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
</input-method>

需要注意的是,元数据文件可以通过 subtype 标签指定语言类型、键盘模型;为了方便,这里使用默认配置即可

2-3  键盘布局文件

在 res/layout 创建一个键盘布局文件

指定键区的背景色、按键文字大小、按键点击前后颜色背景等属性

<?xml version="1.0" encoding="utf-8"?>
<!--系统键盘,键区样式都一致-->
<android.inputmethodservice.KeyboardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:keyBackground="@drawable/selector_key_background"
    android:keyPreviewOffset="0dp"
    android:keyTextColor="#000000"
    android:background="#b0b0b0"
    android:keyTextSize="20sp"
    android:shadowColor="@android:color/transparent"
    android:shadowRadius="0" />

接着,在 res/xml 中创建键盘按键展示的内容、布局、按键 Code 值

  • keyWidth:宽度;keyHeight:高度

  • horizontalGap/verticalGap:按键水平方向/垂直方向的间距

  • codes:按键的 Code 值,方便事件处理

  • keyLabel:按键上的文字展示内容

  • keyIcon:按键的图标展示

  • isRepeatable:代表按键是可重复的,如果为 True,则长按可以重复触发按键事件,默认值为 False

按键区定义了 4 个常见按键,分别对应:防折叠输入、回退、长按清空、切换输入法

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:horizontalGap="1px"
    android:keyWidth="25%p"
    android:keyHeight="60dp"
    android:verticalGap="1px">
    <Row>
        <Key
            android:codes="1"
            android:keyLabel="开始输入" />

<Key
            android:codes="2"
            android:keyIcon="@mipmap/ic_back" />
        <!--长按清空-->
        <Key
            android:codes="4"
            android:isRepeatable="true"
            android:keyEdgeFlags="right"
            android:keyIcon="@mipmap/ic_clear"
            android:popupCharacters="xag" />
        <Key
            android:codes="3"
            android:keyLabel="切换输入法" />
    </Row>
    <Row>
        <Key
            android:codes="0"
            android:keyWidth="100%p"
            android:keyHeight="60dp"
            android:keyEdgeFlags="right"
            android:keyLabel="防折叠输入法(公众号:AirPython)" />
    </Row>
</Keyboard>

2-4  创建键盘视图并设置监听

在键盘服务类中 onCreateInputView() 方法内,创建键盘视图并设置监听

@Override
public View onCreateInputView()
{
    @SuppressLint("InflateParams") KeyboardView keyboard_view = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
    Keyboard keyboard = new Keyboard(this, R.xml.keyboard);
    keyboard_view.setKeyboard(keyboard);
    keyboard_view.setOnKeyboardActionListener(this);

//设置按键没有时,点击放大镜显示的效果
    setCandidatesViewShown(false);
    keyboard_view.setPreviewEnabled(false);
    return keyboard_view;
}

默认创建的键盘,点击按键时的放大镜效果会影响美观,建议通过 setCandidatesViewShown(false) 关闭它

2-5  处理按键点击事件

重写 onKey(int key,int ints) 函数,其中 key 代表键盘 Code,通过它可以进行不同的事件处理

首先,我们拿到输入法的连接对象 InputConnection

使用它内置的 deleteSurroundingText() 方法即可以实现回退和长按清空的功能

InputConnection inputConnection = getCurrentInputConnection();

if (key == 1)
{
    //获取剪切板中的内容
    String clipContent = getClipContent();
    //模拟输入
    inputText(inputConnection, clipContent);
} else if (key == 2)
{
    //回退
    inputConnection.deleteSurroundingText(1, 0);
} else if (key == 3)
{
    //切换输入法
    Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
} else if (key == 4)
{
    //清空
    inputConnection.deleteSurroundingText(1, 0);
}

对于朋友圈防折叠功能,我们依旧是分 2 步实现

  • 首先,从系统剪切板中获取文本数据

/***
 * 获取系统剪贴板服务
 * @return
 */
public String getClipContent()
{
    ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
    String clipContent = "";
    if (null != clipboardManager)
    {
        // 获取剪贴板的剪贴数据集
        ClipData clipData = clipboardManager.getPrimaryClip();
        if (null != clipData && clipData.getItemCount() > 0)
        {
            // 从数据集中获取(粘贴)第一条文本数据
            ClipData.Item item = clipData.getItemAt(0);
            if (null != item)
            {
                clipContent = item.getText().toString();
            }
        }
    }
    return clipContent;
}
  • 接着,将文本内容进行切割,一个字符一个字符地模拟输入

    需要注意的是,可以通过指定睡眠时间,以控制输入的速度

public void inputText(InputConnection inputConnection, String clipContent)
{
    if (TextUtils.isEmpty(clipContent))
    {
        Toast.makeText(getApplicationContext(), "粘贴板为空!", Toast.LENGTH_SHORT).show();
        return;
    }
    Log.d("xag", "字符个数为:" + clipContent.length());
    for (int i = 0; i < clipContent.length(); i++)
    {
        String temp = clipContent.substring(i, i + 1);
        Log.e("xag", "输入一次,输入内容是:" + temp);

inputConnection.commitText(temp, 0);

//下面可以控制输入的速度,这里设置间隔为0.1s
        try
        {
            Thread.sleep(100);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

3. 运行

由于项目中只存在一个 Service,不存在 Activity,这里需要配置项目运行参数

然后运行项目,在手机设置中开启输入法

最后,发布朋友圈的时候,切换到自定义的输入法,点击开始输入即可

需要注意的是,手机系统不一样,切换输入法的方式不一致

比如:魅族就需要在设置中先打开,然后输入的时候下拉状态栏,最后选择对应的输入法

4. 最后

通过上面的步骤,即可以实现一个简易版本的朋友圈防折叠输入法!

当然,输入法的布局、按键功能都可以进行自定义,以实现更加复杂的功能;受限于篇幅,不展开说明!

(0)

相关推荐

  • 手机搜狗输入法怎么开启按键声音?

    搜狗输入法APP可以开启按键音,这样在打字的时候就会有滴答的声音传出,那么如何开启这个按键声音呢? 将手机输入法切换为搜狗输入法以后,我们就会在键盘左上角看到一个"S"图标,点击此 ...

  • 微软推Android版Hub Keyboard输入法,让你和歪果仁轻松交流

    微软最新在Google Play上架了Android平台上Hub Keyboard输入法,主要集成了剪贴板.文档.联系人和翻译四个功能,但目前仅有支持英文输入. 近来微软在硬件上无法与苹果和Andro ...

  • 微信朋友圈被折叠怎么办

    微信朋友圈在测试的版本中出现了折叠朋友圈内容的情况,这让很多用户都不习惯,并且有很多自己朋友发的长的朋友圈也被折叠了,让很多用户烦恼,那么微信朋友圈被折叠怎么办?下面就让小编给大家介绍一下微信朋友圈被 ...

  • 微信朋友圈能“折叠”了?网友体验新功能像开盲盒…

    最近,大家在浏览朋友圈好友动态时, 有没有发现朋友圈的 展示方式又有了新的变化-- 能"折叠"了 和以往的朋友圈展示不同,系统将一些内容统一折叠为一行,后续将不再重复显示,只显示& ...

  • 叶勇|收钱文案:微信朋友圈被折叠了,还怎么赚钱?

    昨天在代理群,看到有代理吐槽最近发的朋友圈被折叠了,也就是成了"折叠版"朋友圈. 朋友圈不管是对微商,还是想通过朋友圈变现来说,都是至关重要的. 一旦大面积被折叠,效果就一下子跌到 ...

  • 微信新机制,“朋友圈毁灭性折叠”如何解决?四招教你轻松应对

    微信8.0版本更新后,好多做社群.做微商的小伙伴都崩溃了,因为他们新发在朋友圈的广告信息通通都被折叠了! 和以往的被折叠为一行不一样,这次是叠中叠!意思就是说你在短时间内发了多条内容相似的朋友圈,系统 ...

  • 进阶Pro | 教你如何在微信朋友圈发文不被折叠!

    有些朋友可能已经注意到了: 你在微信朋友圈经常会看到别人发的一段文字,有的是正常显示的,有的是被折叠为一行隐藏了?特别是做微商.做代购.做文案.产品宣传等, 如下图所示▼ ▲图片来自朋友圈,侵删 这是 ...

  • 微信朋友圈折叠是怎么回事

    很多用户最近反应微信的朋友圈的内容全部被微信主动折叠了起来,变的只能看到朋友圈的一行字,非常影响用户使用朋友圈的体验,那么微信朋友圈折叠是怎么回事?下面就让小编给大家介绍一下微信朋友圈折叠原因. 微信 ...

  • 自动化篇 | 朋友圈被折叠?会自动化不存在的

    第一时间获取 Python 及自动化技术干货! 阅读文本大概需要 10 分钟. 1 目 标 场 景 如果你经常需要 发朋友圈,无论是哪里复制的文案,直接粘贴后到输入框发送出去,肯定会被官方 折叠 处理 ...

  • 微信朋友圈也要支持原创内容:复制、粘贴内容会被折叠

    前段时间腾讯发布的财报显示微信及Webchat的月活用户已经达到了11亿,微信早已经超过QQ成为国内第一大社交应用--应该说这不只是一个社交软件了,已经成为腾讯的关键平台.微信的影响力之大,已让可以让 ...

  • 怎样设置微信朋友圈封面

    现在国内几乎已经人手一个微信APP了,不过有部分朋友还是不了解关于微信朋友圈封面如何设置的问题,下面就让小编来做个简单的示范,感兴趣的朋友不妨来看看吧. 1.登陆手机微信的个人账户后,单击页面底部[发 ...