我想要绕开微信自带浏览器对于Android系统分享的弱集成,一旦剪贴板里出现了一个链接,就自动添加到Pocket里,该怎么做呢?


Motivation

这两天偶然发现Pocket可以朗读文本,这样可以把平时通勤的时间也利用起来,挺棒的。但是,微信内嵌的浏览器对于Android系统分享集成的很烂,要分享到Pocket的话,需要复制链接,然后进入Pocket app, 再点击添加。最烦的就是切换app的这个过程了。

那么,自由度这么高的Android要怎么设置自动监听剪贴板的URL链接添加到Pocket呢?

实测显示,Pocket能够自己判断分享过去的内容是不是URL, 对于无法添加的普通文字,它会报错的,所以我只要能做到自动“分享给Pocket”这一步就可以了。

Tech Candidates

IFTTT

花了点时间把已经火过好一阵子的IFTTT仔细了解了下。概念确实挺棒的,我也发现了很多以前不了解的能够增加生产力的服务..

  • 我就此决定了弃用Feedly, 启用Inoreader. 主要诱因就是Feedly要支持IFTTT居然还得收费.. 换成Inoreader之后就能设置每天收到一封daily digest, 显示昨天在RSS里关注的所有journal papers的更新了。^_^ 话说,不同RSS reader之间的用户黏性真低啊,毕竟迁移起来特别方便,只要导出导入OPML就可以了。

  • 另外我也决定试试Todoist, 当前的Omnifocus于我并没有特别之处,还老贵.. 最常使用的桌面端快速录入快捷键发现Todoist也支持的。


言归正传。

但是,我并没有看到其Android Device channel中有提供clipboard相关的trigger. 难道为了这个小需求还需要自己创建一个channel不成?现有的东西毕竟还是太粗粒度了呀。所以我还是得另寻他法。

此外,我感觉IFTTT最大的槽点是:这么多年了,居然仍旧连个propositional logic都不是!!讲真,我挺失望的。多个条件同时满足也做不到,满足之后的多个action相互配合也做不到,你就只能做那些浮于表面的事情了吗?比如说我想要一个定时的设定,IFTTT里有Date & Time的channel, 但是里头指定的action channel是限死的,i.e. action channel里能访问到的变量只能来自于trigger channel, 在这里就是时间信息。我想要在这时候读Evernote的数据怎么办?做不到啊!(要是你知道怎样能完美设置的话,请一定要告诉我!拜谢 Orz)

其实我就是想看看要设置一个「每天晚上写下第二天要做的事情,然后第二天一早自动提醒」的流程用不同工具该怎么操作。

  • IFTTT下, 如上所述,IFTTT里没有提供这样延时的设定啊,怎么办呢?我看到了Email Digest channel, 会发每日总结邮件,这是IFTTT里唯一的延时类锦囊了吗?但是数据哪里来呢,我蛋疼地添加「一旦Evernote里某个文件夹下多了一个note, 就把它加到第二天的Email Digest里」,然后「一旦受到相关新邮件的话,就在手机上单独显示一个通知」(避免和其他邮件的通知并到一起去)。这样能行,第二天早上09:54我收到了daily digest邮件,里头是我昨晚写下的内容。

  • 稍微方便一点的设置是将定时机制交给外部工具去做,比如说用Boomerang定时发送邮件,然后一旦收到邮件就在手机上单独显示一个通知。实测可行。

  • 而最方便的设置其实是,完全不用IFTTT.. 毕竟术业有专攻,Google Keep做这个就是设置一个reminder的事情!_

平胸而论,IFTTT在特定的场合挺有用的,比方说喜欢的妹子发了条状态,我立马就能收到提醒第一时间去点赞。但是.. 我喜欢的妹子她好像基本不在这些SNS上发东西.. [抠鼻] // 嗯你说啥?闭嘴!我才不是被屏蔽/拉黑了呢!

Tasker

其实在仔细了解IFTTT之前我是先看了Android Tasker的,很早以前就用Google Opinion Rewards回答问卷攒的钱入了这个app. 但是这次才开始真正了解,这里有一套“教程”,我反正是看到一半就跑去了解IFTTT了.. 如果说IFTTT是漂亮的UI、不复杂的操作、简单的功能,那么Tasker就是反人类的UI、非程序员很难了解的操作、NB的功能!

在IFTTT碰壁之后,我再次回到了Tasker的怀抱里来,毕竟,功能肯定是能做到的,但是具体怎么做呢?直接说结论吧:

首先看Pocket的文档,里头介绍了直接发一个“ACTION_SEND”就可以分享至Pocket:

If your app already has sharing functionality using an Intent.ACTION_SEND action, with a text mimeType, then ‘Add to Pocket’ will automatically appear in the Share Via menu/chooser for any users that have Pocket installed.

所以我要做的是发一个Intent给Pocket app, 具体在Tasker中的设置步骤是:

  1. 添加一个PROFILE, Add → Event → Variables → Variable Set. 剪贴板的变化已经在系统变量中了,直接输入%CLIP或者直接在右边点开全部选项选取也可以。这里的%CLIP这样的全大写东西表示系统变量,值就是剪贴板的内容。这样设置就表示这个profile的触发条件为——当剪贴板内容变化时。

  2. 然后需要添加一个TASK, Add → System → Send Intent. 然后就是参照着这个帖子里的2楼所介绍的关于分享到一个特定app的设置写法了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Send Intent [
    Action:android.intent.action.SEND
    Cat:Default
    Mime Type:text/plain
    Data:
    Extra:android.intent.extra.TEXT: %CLIP
    Extra:
    Package:com.ideashower.readitlater.pro
    Class:
    Target:Activity
    ]

    注意extra的内容要写%CLIP, 是发送的内容。然后package要写上Pocket自己的包名,这个我是从其在play store上的url里确认的:https://play.google.com/store/apps/details?id=com.ideashower.readitlater.pro说明它的包名就是com.ideashower.readitlater.pro.

我甚至写了个知乎回答..

就是这样了!Tasker的UI真的真的是反人类,而且常驻通知栏导致的那个小图标要怎么去掉呢,强迫症表示不开心。别人家的app即使常驻通知栏也可以选择去掉这个头像的。

Clipboard Actions

在全部设定完毕之后,我才发现了这么一个app——Clipboard Actions. 好看!实用!几乎完美解决了我不离开当前app快速分享链接到Pocket的需求。

那么我折腾个什么劲儿呢..? 黑人问号.jpg