为AppInventor2开发自己的拓展(Extension) - 拓展开发入门篇

news2024/9/21 18:00:07

//为什么需要开发拓展?//

App Inventor 2 是积木式在线安卓开发环境,利用拖拽式的方式实现代码块堆叠,从而完成相应的逻辑。

上手很容易,但是由于代码块提供的功能有限,使用比较单一,在开发上有很大的局限性,但是它提供了拓展Extension特性,开放了源码,使得开发者可以根据自己的需要,自定义开发原生组件实现不了的、更加强大的功能

一般拓展采用java/kotlin语言进行开发,由于拓展开发相当于直接使用安卓原生开发语言开发安卓相关功能,因此理论上拓展可以实现任何的安卓功能。

注意:java/kotlin写出来的拓展只能运行于安卓设备上,对于iOS设备需要使用swift开发iOS版本的拓展。

//开发及编译环境配置//

  1. 安装好 Java开发环境 以及 Ant编译环境,这里以Windows为例,供参考:

    安装完JDK后配置环境变量 计算机(右键)→属性→高级系统设置→高级→环境变量

    图片

    新建JAVA_HOME:如果是默认安装路径那么就在这个路径下:C:\Program Files\Java\jdk1.8.0_171

    图片

    新建Classpath: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

    在Path后面新增:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 注意:如果之前的path末尾没有;要手动加上

    配置完成后点击确定;cmd打开命令行,java -version ,显示java jdk的版本,配置成功

    图片

  2. 配置ant:ant用来将你的写完的自定义的Extension打包成aix文件,打包完成以后可以直接导入到app inventor中使用

    ANT_HOME 存放你ant的目录

    图片

     path           ; %ANT_HOME%\bin;
     classpath      ; %ANT_HOME%\lib;
    

    验证:cmd 命令行输入ant命令

    图片

    出现以上结果证明配置成功。

//源码下载//

https://github.com/mit-cml/appinventor-sources

国内下载非常非常缓慢,这个项目比较大,也许2天都下载不完,不过没关系,我们早已提供已下载好的工程源码,关注公众号(搜索“fun123cn”关注),回复“源码”即可免费下载MIT最新源码包。

//代码编写//

采用自己较为熟悉的java开发环境就行,这里推荐使用VSCode,拓展目录在 appinventor-sources/appinventor/components ,测试代码参考如下:

图片

演示版的完整代码(可编译运行)如下:

package cn.fun123.Clipboard;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.net.Uri;

import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.PropertyCategory;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.annotations.SimpleProperty;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.runtime.*;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

@DesignerComponent(version = Clipboard.VERSION,
    description = "App Inventor 2 剪贴板管理拓展。Powered by 中文网(www.fun123.cn)",
    helpUrl = "https://www.fun123.cn/reference/extensions/",       //点“帮助”跳转的页面
    category = ComponentCategory.EXTENSION,
    nonVisible = true,                                             //非可视拓展
    iconName = "aiwebres/small-icon.png")                          //拓展的图标,可以使用相对路径
@SimpleObject(external = true)
@SuppressWarnings("deprecation")
@UsesPermissions(permissionNames = "android.permission.INTERNET")  //拓展需要请求的权限,这里仅展示用
@UsesPermissions({INTERNET})                                       //简洁写法,等同于上面一行
@UsesLibraries(libraries = "okhttp-3.12.13.jar, xxx.jar")          //依赖第三方jar库的,多个英文逗号分隔

public class Clipboard extends AndroidNonvisibleComponent implements Component {

  public static final int VERSION = 1;
  private ComponentContainer container;
  private Context context;
  private static final String LOG_TAG = "CB";
  private boolean suppressToast;


  public Clipboard(ComponentContainer container) {
    super(container.$form());
    this.container = container;
    context = (Context) container.$context();
    Log.d(LOG_TAG, "Clipboard Created");
  }


  @SimpleProperty(category = PropertyCategory.BEHAVIOR,
      description = "操作成功后不显示提示信息,默认 false。")
  public boolean SuppressToast() {
    return suppressToast;
  }


  @DesignerProperty(editorType = PropertyTypeConstants.PROPERTY_TYPE_BOOLEAN,
      defaultValue = "false")
  @SimpleProperty
  public void SuppressToast(boolean suppressToast) {
    this.suppressToast = suppressToast;
  }


  @SimpleFunction(description = "拷贝文本至剪贴板,如果 SuppressToast 是 true,则拷贝完成后不会显示'文本已拷贝'的提示信息。")
  public void Copy(String text) {
    try {
      //演示用,代码省略...
      Log.d(LOG_TAG, "文本已拷贝: " + text);
    } catch (Exception e) {
      Log.e(LOG_TAG, e.getMessage(), e);
    }
  }

  @SimpleFunction(description = "从剪贴板粘贴文本,如果 SuppressToast 是 true,则粘贴完成后不会显示'文本已粘贴'的提示信息。")
  public String Paste() {
    //演示用,代码省略...
    Log.d(LOG_TAG, "文本已粘贴!");
    return "";
  }
}

如果拓展中需要请求相关权限,可以在代码中进行申明,有两种方式:

@UsesPermissions(permissionNames = "android.permission.INTERNET")  //拓展需要请求的权限,这里仅展示用
@UsesPermissions({INTERNET})                                       //简洁写法,等同于上面一行

如果拓展用到了第三方库,也可以进行申明:

@UsesLibraries(libraries = "okhttp-3.12.13.jar, xxx.jar")          //依赖第三方jar库的,多个英文逗号分隔

//拓展编译//

进入目录:appinventor-sources/appinventor,执行如下命令:

ant extensions

编译成功后,.aix拓展在 appinventor-sources/appinventor/components/build/extensions/ 目录下:

图片

//拓展导入,测试验证//

图片

基本的流程大致就是这样的了,如果要开发更为复杂的高级拓展,可以参考源码中官方提供的样例,多研究、多测试一定能够搞得定的,加油~

如果在编译或开发过程中遇到任何问题,欢迎来社区发帖讨论。

原文:为AppInventor2开发拓展(Extension) · App Inventor 2 中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉的应用32-基于Swin Transformer模型的嵌入混合注意力机制的人脸表情识别的应用

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用32-基于Swin Transformer模型的嵌入混合注意力机制的人脸表情识别的应用。随着深度学习技术的不断演进,计算机视觉领域迎来了诸多变革,其中 Transformer 架构的引入&#xf…

脑电实验打mark【Eprim中打mark】

文章目录 脑电实验打mark一、端口号查询二、并口打mark 脑电实验打mark 一、端口号查询 右击我的电脑–>管理–>设备管理器–>端口 二、并口打mark 在整个流程最前面添加inline控件: 需要打mark的控件名.onsetsignalenabledTrue //去送信 需要打mark的…

助力汽车零部件产业发展,2025 第十二届广州国际汽车零部件加工技术及汽车模具展览会与您相约“羊城”广州

助力汽车零部件产业发展,2025 第十二届广州国际汽车零部件加工技术及汽车模具展览会与您相约“羊城”广州 汽车零部件是支撑汽车工业持续健康发展的必要因素,为汽车的正常运行和安全性能提供了保障。近年来,中国汽车零部件行业受到各级政府的…

基于SpringBoot+Vue的线上考试系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的线上考试…

【C语言】内存函数详细讲解

文章目录 前言strerror的声明和使用字符串分类函数字符转换函数内存拷贝函数(memcpy)memcpy的声明和使用memcpy函数的模拟实现 内存拷贝函数(memmove)memmove的声明和使用memmove模拟实现 内存比较函数(memcmp)memcmp的…

【数字ic自整资料】常见串行总线协议

参考链接 IIC总线的原理与Verilog实现_iic verilog-CSDN博客 I2C(IIC)的仲裁、时钟同步和时钟扩展_i2c,clock stretch波形-CSDN博客 精解IIC协议_iic写数据-CSDN博客 串行通信——UART总结-CSDN博客 SPI协议详解(图文并茂超详细&#xf…

java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor

更换JDK java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module 0x3302035b) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export …

【大模型推理】大模型前向推理过程详解

文章目录 前期准备环境安装下载模型Qwen2-7b模型架构vscode配置launch.json文件 前向推理debug深入分析预测第一个next_token预测第二个next_token 为了搞清楚,大模型前向推理的具体流程,本文以Qwen2-7B-Instruct为例,通过直接debug官方推理示…

战外网配置——光猫桥接+路由器PPPoE拨号+防火墙外网链路健康检查+外网流量负载均衡

一、适用场景: 1、企业规模较大时,1条公网带宽流量可能不足,需要用到多条公网出口时。 2、企业有业务需要静态ip映射,但是因静态ip专线价格较高,所以需要拨号光纤承载较多的下行流量。 3、当公网出口有多条链路&#…

最大矩阵和

题目描述 给定一个二维整数矩阵&#xff0c;要在这个矩阵中选出一个子矩阵. 使得这个子矩阵内所有的数字和尽量大&#xff0c;我们把这个子矩阵称为和最大子矩阵 子矩阵的选取原则是原矩阵中一块相互连续的矩形区域。 输入描述 输入的第一行包含2个整数n,m(1< n,m< 10…

C++设计模式——Interpreter解释器模式

一&#xff0c;解释器模式的定义 解释器模式是一种行为型设计模式&#xff0c;它用于定义一个语言的文法并解析语言中的表达式&#xff0c;使开发者可以实现自定义语言&#xff0c;并通过解释器对语言中的表达式进行解析和执行。 解释器模式主要用于解决对特定表达式的解析与…

python-游戏自动化(三)(实战-豆腐女孩)

前提准备 特别注意&#xff1a; 本节教程所演示的模拟器分辨率设置为 720x1080&#xff08;手机版&#xff09;&#xff0c;电脑分辨率设置大720x1080并且没有设置放大。 今天的课程开始之前我们来回顾一下昨天所学的知识内容&#xff0c;因为今天要学的内容和昨天内容…

CogView-3-Plus:深度解锁智谱AI的图像生成新力量

一、引言&#xff1a;AI助力创意与效率的全面提升 在如今这个瞬息万变的科技时代&#xff0c;AI大模型早就不是实验室里的“神秘武器”&#xff0c;它们已经实实在在地融入到我们的日常工作中了&#xff0c;尤其是在图像生成和内容创作这块儿&#xff0c;简直是效率神器。只要几…

Leetcode3270. 求出数字答案

Every day a Leetcode 题目来源&#xff1a;3270. 求出数字答案 解法1&#xff1a;模拟 按题意模拟。 代码&#xff1a; /** lc appleetcode.cn id3270 langcpp** [3270] 求出数字答案*/// lc codestart class Solution { public:int generateKey(int num1, int num2, int…

基于python+django+vue鲜花商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…

反射(java)

一、junit单元测试框架 1、单元测试 就是针对最小的功能单元&#xff08;方法&#xff09;&#xff0c;编写测试代码对其进行正确性测试。 之前的是如何进行单元测试的&#xff1f; 有啥问题&#xff1f; 1、只能在ma方法编写测试代码&#xff0c;去调用其他方法进行测试。…

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…

OPPO 全家桶:Find X8/Pro、Pad3 Pro与Enco X3即将10月登场

随着科技的不断发展&#xff0c;智能手机、平板电脑和耳机等电子产品已经成为我们日常生活中不可或缺的一部分。 作为全球知名的科技企业&#xff0c;OPPO一直致力于为消费者提供优质的产品和服务。 近日&#xff0c;有关OPPO全家桶将在10月份“凑齐”的消息引起了广泛关注。…

Elemnt-UI + 递归组件实现后台管理系统左侧菜单

Elemnt-UI 递归组件实现后台管理系统左侧菜单 在 Vue.js 中&#xff0c;允许你编写一个组件来表示一个节点&#xff0c;而这个节点可以包含多个子节点&#xff0c;每个子节点又可以是同样的组件。这种方式使得组件能够处理无限层级的嵌套结构。 应用场景 递归组件非常适合处…

2013年

B D B C D 分支结点是非叶结点 B 47 C A C C D D C A C