57、Android开发:内购、主题设计与动态颜色应用全解析

Android开发:内购、主题设计与动态颜色应用全解析

1. Android内购教程

1.1 购买处理逻辑

当传递给监听器的购买列表不为空时,列表中的第一个购买项会被分配给 purchase 变量,并且“消费购买”按钮会被启用。在更完善的实现中,应添加代码通过比较产品ID来检查这是否是正确的产品,并处理多个购买项的返回情况。若未找到购买项,“消费购买”按钮将被禁用,直到进行下一次购买。在计费设置过程中,需要调用 reloadPurchase() 方法,示例代码如下:

private void billingSetup() {
    // ...
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
        Log.i(TAG, "OnBillingSetupFinish connected");
        queryProduct();
        reloadPurchase();
    } else {
        Log.i(TAG, "OnBillingSetupFinish failed");
    }
    // ...
}

1.2 应用测试步骤

在测试应用之前,需要将最新版本上传到Play Console。具体操作步骤如下:
1. 由于已经上传了版本1,需要在 build.gradle.kts (Module: app) 文件中增加版本号:

defaultConfig {
    applicationId "com.ebookfrenzy.inapppurchase"
    minSdk 26
    targetSdk 32
    versionCode 2
    versionName "2.0"
    // ...
}
  1. 同步构建配置,然后按照“创建、测试和上传Android应用捆绑包”的步骤生成新的应用捆绑包,将其上传到内部测试轨道,并推送给测试人员。
  2. 使用内部测试链接,在已登录测试账户的设备或模拟器上安装应用。查找测试链接的方法为:在Google Play Console中选择应用,从导航面板中选择“内部测试”选项,然后点击“测试人员”标签,滚动到屏幕的“How testers join your test”部分,点击“复制链接”。
  3. 在测试设备或模拟器上打开Chrome浏览器,输入测试链接,按照说明从Play商店安装应用。应用启动后,稍作延迟,产品名称应显示在 TextView 上。点击“购买”按钮将开始购买流程,使用测试卡完成购买,等待“消费购买”按钮启用。在点击此按钮之前,尝试再次购买该产品,验证由于已拥有该产品而无法购买。
  4. 点击“消费购买”按钮,等待“Purchase consumed”消息出现在 TextView 上。产品消费后,应该可以再次购买。进行另一次购买,然后终止并重启应用,应用应找到之前未消费的购买项并启用“消费购买”按钮。

1.3 故障排除

如果购买过程中遇到问题,可以按照以下步骤进行排查:
1. 确保设备通过USB电缆或WiFi连接到Android Studio,并在Logcat面板中选择该设备。在Logcat搜索栏中输入 InAppPurchaseTag ,检查诊断输出,必要时在代码中添加额外的 Log 调用。
2. 对于购买失败的额外信息,可以从 BillingResult 实例中获取调试消息,示例代码如下:

} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
    Log.i(TAG, "onPurchasesUpdated: Purchase Canceled");
} else {
    Log.i(TAG, billingResult.getDebugMessage());
}
  1. 只要在模块级 build.gradle.kts 文件中不更改应用版本号,就可以直接在设备或模拟器上运行修改后的应用版本,而无需重新打包并上传到控制台。
  2. 如果测试支付卡未列出,确保设备用户账户已添加到许可证测试人员列表中。
  3. 如果应用在物理设备上运行有问题,可以尝试在模拟器上运行。
  4. 如果所有方法都失败,可以输入有效的支付方式进行测试购买,然后使用Play Console主页上的“订单管理”屏幕进行退款。

2. Material Design 3主题设计

2.1 Material Design概述

Android应用的外观旨在遵循Material Design定义的一组准则。Google开发Material Design是为了在不同应用之间提供一定程度的设计一致性,同时允许应用开发者通过颜色、排版和形状选择来融入自己的品牌元素,这一概念被称为Material主题。除了设计准则,Material Design还包括一组用于设计用户界面布局的UI组件。

2.2 Material Design 2与Material Design 3对比

Google正在从Material Design 2过渡到Material Design 3,Android Studio Giraffe项目默认使用Material Design 3。Material Design 3为Material You提供了基础,这是Android 12中引入的一项功能,允许应用自动调整主题元素以符合用户在设备上配置的偏好。例如,Material Design 3提供的动态颜色支持允许应用中的颜色自动适应以匹配用户的壁纸选择。

2.3 Material Design主题原理

Android应用的用户界面由布局、文本字段和按钮等组件组装而成。除非在XML布局资源文件中显式覆盖颜色属性或通过代码进行更改,否则这些组件将使用默认颜色。项目的主题定义了这些默认颜色,主题由一组颜色插槽(在 themes.xml 文件中声明)组成,这些插槽被分配颜色值(在 colors.xml 文件中声明)。每个UI组件在内部被编程为使用主题颜色插槽作为特定属性的默认颜色。因此,通过更改分配给特定主题插槽的颜色,可以更改应用的全局主题。应用运行时,新的默认颜色将在渲染用户界面时应用于所有小部件。

2.4 Material Design 3主题使用

应用项目使用的主题在 AndroidManifest.xml 文件中的 application 元素属性中声明,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application
        android:supportsRtl="true"
        android:theme="@style/Theme.MyDemoApp"
        tools:targetApi="31">
        <!-- ... -->
    </application>
</manifest>

所有与项目主题相关的文件都包含在 res -> values 文件夹中的 colors.xml themes.xml 文件中。主题本身在 themes 文件夹中的两个 themes.xml 文件中声明,这些资源文件声明了不同的调色板,包含在设备处于浅色或深色(夜间)模式时使用的Material主题颜色插槽。每个文件中的样式名称属性必须与 AndroidManifest.xml 文件中引用的名称匹配,示例如下:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Base.Theme.MyDemoApp" parent="Theme.Material3.DayNight.NoActionBar">
        <!-- Customize your light theme here. -->
        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
    </style>
    <style name="Theme.MyDemoApp" parent="Base.Theme.MyDemoApp" />
</resources>

MD3中的颜色插槽分为主要(Primary)、次要(Secondary)、第三(Tertiary)、错误(Error)、背景(Background)和表面(Surface)等组,这些插槽进一步分为基色和“在”基色对,通常对应于Material组件的背景和前景颜色。不同的小部件使用不同的颜色组,例如,Material Button小部件使用 colorPrimary 基色作为背景颜色,使用 colorOnPrimary 作为内容颜色;而FloatingActionButton组件使用 colorPrimaryContainer 作为背景颜色,使用 colorOnPrimaryContainer 作为前景颜色。可以通过更改主题文件中的颜色设置并在布局编辑器中查看渲染效果来快速确定特定小部件类型使用的正确颜色组。

2.5 创建自定义主题

创建自定义主题时,可以使用Google开发的Material Theme Builder工具,该工具可在 https://m3.material.io/theme-builder#/custom 访问。具体操作步骤如下:
1. 在自定义屏幕上,点击主颜色键的颜色圆圈以显示颜色选择对话框,选择一种颜色作为主题的基础。
2. 选择颜色后,预览区域将显示所有MD3颜色插槽的推荐颜色,以及示例应用界面和小部件。可以通过点击相应的颜色圆圈来覆盖生成的次要、第三和中性插槽的颜色。
3. 预览区域显示示例应用界面、浅色和深色配色方案图表以及小部件,由于面板较长,可能需要滚动查看所有信息。
4. 点击“导出”按钮,选择“Android View (XML)”选项。下载后, colors.xml themes.xml 文件可用于替换项目中的现有文件。注意,导出的两个 themes.xml 文件中的主题名称必须更改为与项目匹配。

以下是一个简单的mermaid流程图,展示创建自定义主题的流程:

graph LR
    A[打开Material Theme Builder] --> B[选择主颜色]
    B --> C[调整其他颜色]
    C --> D[点击导出按钮]
    D --> E[选择Android View (XML)选项]
    E --> F[下载文件并替换项目文件]

3. Material Design 3主题与动态颜色教程

3.1 创建主题项目

  1. 从欢迎屏幕中选择“新建项目”选项,在新的项目对话框中选择“Empty Views Activity”模板,然后点击“下一步”。
  2. 在“名称”字段中输入 ThemeDemo ,指定 com.ebookfrenzy.themedemo 作为包名。
  3. 在点击“完成”按钮之前,将“Minimum API level”设置为 API 26: Android 8.0 (Oreo) ,将“语言”菜单选择为Java。

3.2 设计用户界面

主活动将包含一个简单的布局,其中包含一些用户界面组件,以便观察后续主题设计工作的效果。设计布局的步骤如下:
1. 在 activity_main.xml 文件中进行布局设计,该文件目前包含一个单一的 Text 视图。打开该文件的布局编辑器,删除 Text 视图,关闭自动连接模式,点击按钮清除布局中的所有约束。
2. 从“Palette”的“Buttons”部分,将 Chip CheckBox Switch Button 视图拖到布局画布上。
3. 将 FloatingActionButton 拖到布局画布上,使其位于 Button 组件下方。当提示选择显示在 FloatingActionButton 上的图标时,从资源工具窗口中选择 ic_lock_power_off 图标。
4. 将 Chip 小部件的文本属性更改为“This is my chip”,并将 chipIcon 属性设置为 @android:drawable/ic_btn_speak_now
5. 设置约束:选择所有组件,右键点击 Chip 视图,从菜单中选择“Chains -> Create Vertical Chain”,再次重复此步骤,选择“Center -> Horizontally in Parent”菜单选项。
6. 编译并运行应用,验证用户界面是否与预期一致。

3.3 构建新主题

  1. 打开浏览器,导航到 https://m3.material.io/theme-builder#/custom 访问构建工具。
  2. 加载构建工具后,选择一张壁纸,然后点击屏幕顶部的“Custom”按钮,接着点击“Core Colors”部分的主颜色圆圈以显示颜色选择器,从颜色选择器中选择任何颜色作为主题的基础。
  3. 在“Your Theme”面板中查看配色方案,使用“Core colors”设置进行必要的颜色调整,直到对颜色插槽满意为止。
  4. 主题准备好后,点击右上角的“Export”按钮,选择“Android Views (XML)”选项。当提示时,将文件保存到计算机文件系统的合适位置,主题将保存为名为 material-theme.zip 的压缩文件。
  5. 使用适合操作系统的工具解压缩主题文件,文件应包含以下文件夹和文件:
    • values/colors.xml - 颜色定义文件。
    • values/themes.xml - 浅色模式的主题文件。
    • values-night/themes.xml - 深色模式的主题文件。

3.4 添加主题到项目

  1. 在添加新主题之前,需要删除旧的主题文件。将项目工具窗口切换到“Project Files”模式,导航到 app -> src -> main -> res -> values 文件夹,选择并删除 colors.xml themes.xml 文件,同时删除 values-night 文件夹中的 themes.xml 文件。
  2. 打开操作系统的文件系统导航工具,找到新主题 values 文件夹中的 colors.xml themes.xml 文件,将它们复制并粘贴到项目工具窗口的 values 文件夹中。重复此步骤,将 values-night 文件夹中的 themes.xml 文件复制并粘贴到项目的 values-night 文件夹中。
  3. 将项目工具窗口切换回“Android”模式,此时值资源文件部分应与预期一致。
  4. 修改浅色 themes.xml 文件以匹配当前项目,示例如下:
<resources>
    <style name="Base.Theme.ThemeDemo" parent="Theme.Material3.Light.NoActionBar">
        <item name="colorPrimary">@color/md_theme_light_primary</item>
        <item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
        <!-- ... -->
    </style>
    <style name="Theme.ThemeDemo" parent="Base.Theme.ThemeDemo" />
</resources>
  1. 对深色 themes.xml 文件重复上述修改步骤。
  2. 返回 activity_main.xml 文件或重新运行应用,确认用户界面使用自定义主题颜色进行渲染。

3.5 启用动态颜色支持

要测试动态颜色,应用需要在运行Android 12或更高版本的设备或模拟器上运行,并且需要正确设置壁纸。具体操作步骤如下:
1. 在设备或模拟器上启动“设置”应用,选择“壁纸与样式”选项。
2. 在壁纸设置屏幕上,点击更改壁纸的选项,选择一张壁纸,其颜色应与主题颜色有显著差异,选择后将壁纸分配给主屏幕。
3. 返回“壁纸与样式”屏幕,确保选择了“壁纸颜色”选项,然后从颜色方案按钮中选择一个选项,每次点击选项时,壁纸示例将相应更改。
4. 要启用动态颜色,需要调用 DynamicColors 类的 applyToActivitiesIfAvailable() 方法。为了为整个应用启用动态颜色支持,需要在自定义 Application 实例的 onCreate() 方法中调用该方法。具体步骤如下:
- 在项目的 app -> java -> com.ebookfrenzy.themedemo 目录下添加一个新的Java类文件 ThemeDemoApplication.java
- 修改该文件内容如下:

package com.ebookfrenzy.themedemo;

// 后续可添加具体实现代码

以下是一个表格,总结了各个步骤的关键信息:
|步骤|操作内容|
| ---- | ---- |
|创建项目|选择模板、设置包名和API级别等|
|设计界面|删除视图、添加组件、设置约束|
|构建主题|选择颜色、调整配色、导出文件|
|添加主题|删除旧文件、复制新文件、修改主题文件|
|启用动态颜色|设置壁纸、调用方法|

4. 总结与回顾

4.1 内购功能要点回顾

在Android应用内购功能的实现过程中,我们完成了一系列关键步骤。首先是购买处理逻辑,当购买列表不为空时,要将首个购买项分配给 purchase 变量并启用消费按钮,同时要对购买项进行检查和处理。在计费设置时,通过 billingSetup() 方法连接到计费客户端,若连接成功则进行产品查询和购买项重新加载。

测试应用时,需要上传新版本到Play Console,包括在 build.gradle.kts 文件中增加版本号、同步配置、生成应用捆绑包等操作。安装应用后,可进行购买和消费操作的测试,验证购买流程和消费功能的正确性。

当遇到购买问题时,可通过Logcat检查诊断信息,获取 BillingResult 的调试消息进行排查。若测试支付卡未列出,要确保设备用户账户已添加到许可证测试人员列表,还可尝试在不同环境下运行应用或使用有效支付方式进行测试购买并退款。

4.2 Material Design 3主题设计要点回顾

Material Design 3为Android应用带来了更丰富的主题设计能力。它基于Material You的特性,能让应用自动适配用户的设备偏好,如动态颜色支持可使应用颜色与壁纸相匹配。

在理解主题原理时,我们知道主题由 themes.xml 文件中的颜色插槽和 colors.xml 文件中的颜色值组成,每个UI组件会使用主题颜色插槽作为默认颜色。MD3的颜色插槽分为多个组,不同组件使用不同的颜色组。

创建自定义主题可借助Material Theme Builder工具,通过选择主颜色、调整其他颜色、导出文件并替换项目中的主题文件,就能实现应用主题的个性化定制。

4.3 主题与动态颜色教程要点回顾

在主题与动态颜色教程中,我们创建了 ThemeDemo 项目,设计了包含多种UI组件的用户界面。通过构建新主题并添加到项目中,实现了应用主题的自定义。

启用动态颜色支持时,要在运行Android 12或更高版本的设备上设置合适的壁纸,并在自定义 Application 实例的 onCreate() 方法中调用 DynamicColors 类的 applyToActivitiesIfAvailable() 方法。

以下是一个mermaid流程图,展示整个开发流程的关键步骤:

graph LR
    A[开始开发] --> B[实现内购功能]
    B --> C[设计Material Design 3主题]
    C --> D[创建主题项目并设计界面]
    D --> E[构建并添加新主题]
    E --> F[启用动态颜色支持]
    F --> G[测试与调试]
    G --> H[完成开发]

5. 常见问题解答

5.1 内购问题

问题 解决方案
购买失败 检查设备连接状态,在Logcat中查看诊断信息,获取 BillingResult 的调试消息。确保设备用户账户在许可证测试人员列表中,尝试在不同环境下运行应用或使用有效支付方式测试购买并退款。
测试支付卡未列出 将设备用户账户添加到许可证测试人员列表中。
无法重复购买 确保购买项已被消费,点击“消费购买”按钮,等待“Purchase consumed”消息出现后再进行购买。

5.2 主题设计问题

问题 解决方案
主题颜色未生效 检查 themes.xml colors.xml 文件是否正确替换,主题名称是否与 AndroidManifest.xml 文件中引用的名称匹配。
组件颜色不符合预期 通过更改主题文件中的颜色设置并在布局编辑器中查看渲染效果,确定组件使用的正确颜色组。
动态颜色未生效 确保应用在运行Android 12或更高版本的设备上运行,正确设置壁纸并选择“壁纸颜色”选项,在自定义 Application 实例的 onCreate() 方法中调用 DynamicColors 类的 applyToActivitiesIfAvailable() 方法。

5.3 开发流程问题

问题 解决方案
项目创建失败 检查创建项目时的配置选项,如包名、最低API级别、语言等是否正确设置。
界面设计布局混乱 在布局编辑器中清除约束,重新设置组件的约束关系,确保布局的正确性。
主题文件添加失败 检查文件路径和文件名是否正确,确保在“Project Files”模式下进行文件的删除和复制操作。

6. 总结

通过本文的学习,我们掌握了Android应用内购功能的实现、Material Design 3主题设计以及动态颜色支持的添加。内购功能为应用提供了盈利的途径,主题设计使应用更具个性化和一致性,动态颜色支持则增强了应用与设备的交互性和适配性。

在实际开发中,我们要按照正确的步骤进行操作,遇到问题时可参考常见问题解答进行排查和解决。希望这些知识能帮助你开发出更优秀的Android应用。

以下是一个简单的列表,总结开发过程中的关键要点:
1. 内购功能:处理购买逻辑、设置计费、测试购买流程、排查购买问题。
2. 主题设计:理解主题原理、使用Material Theme Builder创建自定义主题。
3. 动态颜色支持:在合适的设备上设置壁纸、调用方法启用动态颜色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值