Android Emacs 下使用 org-protocol 的一些问题

Android 的 Emacs 好像没法在 termux 环境下调用 emacsclient,但是可以使用 adb 打开文件:

am start -a android.intent.action.VIEW -n org.gnu.emacs/.EmacsOpenActivity -d file:///storeage/emulated/0/1.txt org.gnu.emacs

因此也可以调用 org-protocol:

am start -a android.intent.action.VIEW -n org.gnu.emacs/.EmacsOpenActivity -d org-protocol://test?a=a org.gnu.emacs

但是要先 advice 以下函数,因为传给 emacs 的参数前面会加上 emacs 的家目录导致 org-protocol 识别不了

(with-eval-after-load 'org-protocol
  (define-advice org-protocol-check-filename-for-protocol
      (:filter-args (args) compat-android)
    "Remove prefix when called by intent."
    (let ((h (getenv "HOME"))
          (f (car args)))
      (when (string-prefix-p (format "%s/%s:/" h org-protocol-the-protocol) f)
        (setcar args (substring f (1+ (length h)))))
      args)))

也就可以使用 Tasker 或者 Fooview 这种自动化或手势软件方便地执行命令: image

但有个问题就是每次运行,Emacs 都会弹到前台来,假如我想后台执行命令大伙有什么想法吗,另外我没搞懂怎么使用 termux 普通的权限执行 am 命令,理论上应该是可以的

(用这个开 http 服务器能实现后台执行还能方便地返回数据,但还是想用自带的功能GitHub - skeeto/emacs-web-server: Extensible Emacs HTTP 1.1 server

可能原因和adb类似,如果要后台调用不显示界面,需要用adb shell service call这种形式,但是就要求应用本身提供了对应功能的service才行,直接用am是会打开对应的activity

另外用termux执行打开应用是不需要什么特殊权限吧,还是我没有明白你的意思

你没理解错,是我描述错了,termux 里没有问题,我是拿 Fooview 里的 shell 运行的 am 报这个错导致我以为 termux 里的 am 也有这个权限问题 :smiling_face_with_tear:

你要是想在其它应用的命令行接口调用am,我知道的办法就是像emacs一样,androidmanifest.xml声明里面加上这个

android:sharedUserId="com.termux"

再重新编译,可能还要注意签名一致的问题,如果没记错的话

然后就可以正常使用了

这个应用是闭源的,可能没法改 androidmanifest.xml ,但其实主要想后台执行 emacs 的命令,听你上一条回复好像目前是没法的,大概只能通过 http 了 :smiling_face_with_tear: