【问题标题】:How can I create Android Application plugins/extensions that can be installed as an APK or from market?如何创建可以作为 APK 安装或从市场安装的 Android 应用程序插件/扩展?
【发布时间】:2012-11-18 15:12:37
【问题描述】:

我实际上正在研究是否有可能拥有满足以下要求的应用程序:

  • 主应用程序可能有 5 个停用的功能
  • 如果您尝试使用已停用的功能,应用程序会邀请您下载可作为 APK 或从市场安装的扩展程序。
  • 一旦安装了该功能,它就会被激活,然后就可以使用了。

所以我们可以有一些免费/非免费的功能。我已经在某些应用程序中看到过这样的行为,但我不记得名字了。

Android SDK 中有什么可以使用的吗?如何实现?

感谢您的帮助。

【问题讨论】:

  • 我相信在产品应用程序中是您正在寻找的东西。
  • 我不明白你的意思......
  • 如果我们帮助了您,最好标记正确答案 ;-)
  • 当然!一旦我的问题得到解决。我会标记正确答案的,别担心。
  • Anas EL HAJJAJI 你是怎么解决你的问题的?我想创建一个应用程序,它有 5 个部分在用户购买时激活。但我希望这些部分与主应用程序分开,当用户购买它们然后添加到主应用程序中。

标签: android


【解决方案1】:

首先 - 您所说的“附加功能”究竟是什么意思。问题相当复杂。

  1. 检查应用程序是否存在 - 只需使用 PackageManager 并尝试找到所需的软件包,如果找到,如果不要求用户安装,请使用它。
  2. 资源访问(图像、布局等) - 也可以使用PackageManager
  3. 使用部分代码 - 许多不同的方法来获得效果。 Intents (startActivityForResult()),内容提供者。

引入免费/付费功能的更好方法可能是使用应用内支付。

【讨论】:

    【解决方案2】:

    您必须构建 6 个不同的应用程序/apk 并将它们提交到 Play 商店。至少有 2 个选项可以将应用程序集成在一起:

    1. 如果您的功能是全屏显示,那么您可以从插件应用中启动适当的活动。
    2. 如果主屏幕(来自主应用程序的屏幕)应该包含代码(功能)、来自插件应用程序的资源(布局、图像等),而不是查看http://developer.android.com/guide/topics/manifest/manifest-element.html#uid。使用该配置,您可以通过类名反射从插件应用程序访问代码。

    您还可以使用 Resources res = mPackageManager.getResourcesForApplication("org.example.foo"); 从另一个 apk 访问资源 详情请参阅Is it possible to access resources in another APK without using content providers?

    【讨论】:

    • 谢谢。可以安装主应用,但不能安装扩展?
    • 什么意思?所有应用都应发布到 Play 商店。如果未安装所需的插件 - 只需通过适当的链接将用户转发到 Play 商店。您可以检测应用程序是否已安装。
    • 虽然接受的答案会起作用,但它并不能满足所要求的问题。这个答案更接近于回答问题,但如果您添加如何从其他应用程序访问代码的示例,就像您对资源所做的那样,这将有所帮助。
    【解决方案3】:

    不确定这是否是您要寻找的,但让我建议您入门(可能

    举个例子,比如说,在您的应用程序中,您有 2 个按钮(而不是 5 个)

    按钮 1 和按钮 2。

    当您启动您的应用程序时,使用PackageManager检查是否安装了必要的应用程序(您自己的应用程序的第三方)

    这是一个伪代码,我在我的应用中使用它来检查用户设备上是否安装了 Google 地图:

    boolean installedMaps = false;
    
    // CHECK IF AN APPLICATION IS INSTALLED
    PackageManager pkManager = getPackageManager();
    try {
        PackageInfo pkInfo = pkManager.getPackageInfo("com.google.android.apps.maps", 0); // REPLACE THIS "com.google.android.apps.maps" WITH THE ACTUAL PACAKAGE NAME
        // Log.e("pkInfo", pkInfo.toString());
        installedMaps = true;
    } catch (NameNotFoundException e) {
        e.printStackTrace();
        installedMaps = false;
    }
    

    如果boolean installedMaps 返回true,则启用该按钮。否则,使用对话框提示用户从 Google Play 下载应用程序。

    并为您需要激活或停用的每个功能执行此操作。

    注意:您需要知道其他应用程序的包名称。如果您不知道,可以通过在您的设备上运行应用程序并检查 logcat 来找到它。

    如果您还需要在所有相关应用程序之间共享内容,您也可以考虑使用Content Providers

    同样,我不完全确定这是否是您正在寻找的。如果我的假设有误,请纠正。

    【讨论】:

    • 我认为这就是解决方案。谢谢!不同安装的APK如何共享资源,避免资源重复?
    • @AnasELHAJJAJI:将它们全部放入“核心”,然后使用 Content Provider 在所有相关应用程序之间公开该内容。
    【解决方案4】:

    您可以使用 Service 创建 apk 并使用 http://developer.android.com/guide/components/aidl.html 连接到此服务。而且这项服务可以做你想做的事,所以只有你的想象力是你的极限;-)

    我建议阅读以下内容:http://developer.android.com/guide/topics/manifest/manifest-element.html#uid 可以在 2 个或更多应用程序之间共享更多数据。但是他们应该用相同的键来唱。

    【讨论】:

    • 感谢您的回复 :) 服务可以调用活动吗?那么安装 APK 后是否有用户界面?
    • 是的,这是可能的。阅读有关 Intents、BroadcastReceivers 和 Service(本地和使用 AIDL 的)的信息,这应该会对您有所帮助。自定义权限也可能有用。
    • 你可能也会感兴趣:stackoverflow.com/questions/3062946/…
    猜你喜欢
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多