摘要
构建关于页、最终用户许可页(EULA)页和隐私协议页;Compose页面中嵌入xml布局;Compose页面中添加markdown文本.
关键信息
- Android Studio:Iguana | 2023.2.1
- Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zip
- jvmTarget = '1.8'
- minSdk 21
- targetSdk 34
- compileSdk 34
- 开发语言:Kotlin,Java
- ndkVersion = '21.1.6352462'
- kotlin版本:1.9.20
- kotlinCompilerExtensionVersion '1.5.4'
- com.android.library:8.3
原理简介
EULA(最终用户许可协议)
[https://blog.csdn.net/LingLing1301/article/details/124561891]
最终用户许可协议(End User Licence Agreement,EULA),指的是一家公司的软件与软件的使用者所达成的协议,此协议一般在软件安装时出现。如果使用者拒绝接受这家公司的EULA,那么便不能安装此软件。最终用户许可协议是软件应用程序作者或者发布者与应用程序使用者之间的合法合同。最终用户许可协议(EULA),通常是指“软件许可”,它与租赁协议类似;用户同意支付软件的使用费用,并且向软件作者或者发行者承诺遵守EULA中规定的所有约束条件。用户被告知,当他们打开软件包的包装、打开CD盒的封条、将卡片寄回给软件发行者、安装应用程序、执行下载文件或者简单的使用应用程序的时候就意味着他们已经“接受”了EULA中的条款。用户可以寄回软件产品或者在安装过程中当EULA提示接受按钮的时候点击“我不接受”来拒绝这个协议。
Markwon简介
[https://github.com/noties/Markwon]
[https://noties.io/Markwon/]
Markwon is a markdown library for Android. It parses markdown following commonmark-spec with the help of amazing commonmark-java library and renders result as Android-native Spannables. No HTML is involved as an intermediate step. No WebView is required. It's extremely fast, feature-rich and extensible.
It gives ability to display markdown in all TextView widgets (TextView, Button, Switch, CheckBox, etc), Toasts and all other places that accept Spanned content. Library provides reasonable defaults to display style of a markdown content but also gives all the means to tweak the appearance if desired. All markdown features listed in commonmark-spec are supported (including support for inlined/block HTML code, markdown tables, images and syntax highlight).
Markwon comes with a sample application. It is a collection of library usages that comes with search and source code for each code sample.
Since version 4.2.0 Markwon comes with an editor to highlight markdown input as user types (for example in EditText).
Markwon 是一个用于 Android 的 Markdown 库。它使用令人惊叹的 commonmark-java 库解析遵循 CommonMark 规范的 Markdown,并将结果渲染为 Android 本地的 Spannables。在此过程中不涉及 HTML 作为中间步骤,也不需要 WebView。它非常快速、功能丰富且可扩展。
Markwon 能够使所有 TextView 小部件(TextView、Button、Switch、CheckBox 等)显示 Markdown,以及 Toasts 和所有接受 Spanned 内容的其他地方。库提供了合理的默认样式来显示 Markdown 内容,但如果需要,也提供了所有方法来调整外观。Markwon 支持 CommonMark 规范中列出的所有 markdown 特性(包括对内联/块级 HTML 代码、Markdown 表格、图片和语法高亮的支持)。
Markwon 附带一个示例应用程序。这是一个包含库用法的集合,每个代码示例都带有搜索和源代码。
自版本 4.2.0 起,Markwon 附带了一个编辑器,用于在用户输入时高亮显示 Markdown(例如在 EditText 中)。
「关于」页面
[https://juejin.cn/post/7139019841284866055]
关于页Compose模板
APP的「关于」页面通常包含一些基础的信息,如APP的名称、版本号、开发者信息、更新日志、隐私政策、用户协议等内容。这个页面主要是为了向用户提供一些关于APP的基本信息和说明。
具体来说,「关于」页面可能包含以下几个部分:
- APP名称:显示APP的全称,有时也会配合APP的Logo一起展示。
- 版本信息:显示当前的APP版本号,有时候还会显示此版本的更新日期。
- 开发者信息:显示开发者的名称、地址、联系方式等信息,有时候也会提供开发者的官方网站链接。
- 更新日志:列出最近几次版本更新的内容,帮助用户了解APP的新功能和改进。
- 隐私政策:解释APP如何处理用户的个人信息,以及如何保护用户的隐私。
- 用户协议:列出用户在使用APP时需要遵守的条款和条件。
以上这些信息可以帮助用户更好地理解和使用APP,同时也能让用户感到更加安全和信任。
app的隐私政策
[http://app.gjzwfw.gov.cn/jmopen/webapp/html5/yhysxy/index.html]
[https://zhuanlan.zhihu.com/p/670072425]
APP隐私合规现状与防范措施
[https://www.goupsec.com/news/5460.html]
2021年11月1《个人信息保护法》正式施行,标志信息保护进入强监管时代,同时,APP监管也被提升到前所未有的高度,数据安全、用户隐私、甚至功能体验等各个方面都出台了相应的规则规范,监管的初衷是:从各个层面保障用户的权益,避免用户的隐私、体验、数据被滥用,甚至威胁国家安全,一旦违规被查处面临的惩罚是非常严厉的,因此产品运营方必须高度重视。一方面,在产品设计、开发阶段就要充分考虑并满足各种监管要求;另一方面,一旦查出隐患问题,要积极响应,及时整改,否则可能面临工信部通报,甚至全面下架风险,首当其冲的一块是:APP隐私合规。
APP隐私合规指简单说就是:用户隐私的收集、存储、使用、加工、传输、提供、公开、删除等都要合乎法规个人信息保护法,遵守原则。从APP端来看,它关系到用户的切身体验,用户自身也能直观感受到自己的隐私是否被过分索取。比如,申请与自身功能毫不相关的权限,不给还拒绝提供服务等场景。
正常的开发是在APP启动之初就要初始化很多环境、参数,而这些初始化很可能涉及一些隐私API的调用,在隐私合规的框架下,这些调用只能被人为延后,或者取消。
示例文本:
本软件尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本软件会按照本隐私权政策的规定使用和披露您的个人信息。但本软件将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本软件不会将这些信息对外披露或向第三方提供。本软件会不时更新本隐私权政策。您在同意本软件服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本软件服务使用协议不可分割的一部分。
1.适用范围
a)在您使用本软件网络服务,本软件自动接收并记录的您的手机上的信息,包括但不限于您的健康数据、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据;
2.信息的使用
a)在获得您的数据之后,本软件会将其上传至服务器,以生成您的排行榜数据,以便您能够更好地使用服务。
3.信息披露
a)本软件不会将您的信息披露给不受信任的第三方。
b)根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露;
c)如您出现违反中国有关法律、法规或者相关规则的情况,需要向第三方披露;
4.信息存储和交换
本软件收集的有关您的信息和资料将保存在本软件及(或)其关联公司的服务器上,这些信息和资料可能传送至您所在国家、地区或本软件收集信息和资料所在地的境外并在境外被访问、存储和展示。
5.信息安全
a)在使用本软件网络服务进行网上交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄密,请您立即联络本软件客服,以便本软件采取相应措施。
Compose中嵌入xml布局
[https://blog.csdn.net/u010436867/article/details/120759187]
class ComposeAndXmlActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ComposeContent()
}
}
@SuppressLint("SetTextI18n")
@Composable
fun ComposeContent() {
LazyColumn(modifier = Modifier.fillMaxWidth(), content = {
item {
Text(
modifier = Modifier
.fillMaxWidth()
.height(100.dp)
.background(color = Color.Green),
textAlign = TextAlign.Center,
text = "Compose 部分-头部",
)
/* start XML布局部分 */
AndroidView(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp),
factory = { ctx ->
val view =
LayoutInflater.from(ctx).inflate(R.layout.activity_compose_xml, null)
view.findViewById<TextView>(R.id.fromXML).text = "Xml布局部分"
view
},
)
/* end XML布局部分 */
}
item {
Text(
modifier = Modifier
.fillMaxWidth()
.height(100.dp)
.padding(8.dp)
.background(color = Color.Yellow),
textAlign = TextAlign.Center,
text = "Compose 部分-尾部",
)
}
})
}
}
xml布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/fromXML"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@color/black"
android:gravity="center"
android:text="..."
android:textColor="@color/white"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
实现
- 配置gradle
build.gradle
/* start markdown相关 */
implementation "io.noties.markwon:core:4.6.2"
implementation 'io.noties.markwon:image:4.6.2'
implementation 'io.noties.markwon:image-glide:4.6.2'
/* end markdown相关 */
- 核心代码
AboutActivity.kt
package cn.qsbye.alittlesmile_android
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.TextView
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Star
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat.startActivity
import androidx.navigation.NavHostController
import cn.qsbye.alittlesmile_android.AboutPageClass.AboutScreen
import cn.qsbye.alittlesmile_android.AboutPageClass.BaseTextItem
import cn.qsbye.alittlesmile_android.AboutPageClass.LinkText
import cn.qsbye.alittlesmile_android.AboutPageClass.ModuleItem
import cn.qsbye.alittlesmile_android.AboutPageClass.MyViewModel
import cn.qsbye.alittlesmile_android.AboutPageClass.NormalSubItemWithStartIconData
import cn.qsbye.alittlesmile_android.AboutPageClass.NormalWithStartIconSubItemModule
import cn.qsbye.alittlesmile_android.AboutPageClass.RightsTextItem
import cn.qsbye.alittlesmile_android.AboutPageClass.boxSampleIcon
import cn.qsbye.alittlesmile_android.ui.theme.Alittlesmile_androidTheme
import io.noties.markwon.Markwon
class AboutActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Alittlesmile_androidTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
// 显示关于页内容
MyAboutPage(MyViewModel(),this@AboutActivity) // 这里假设你有一个 MyViewModel 实例
}
}
}
}
}
/* start 继承于关于页模板AboutPageClass */
// 添加context作为上下文参数传入
@Composable
fun MyAboutPage(myViewModel: MyViewModel, context_input: AboutActivity) {
val list = remember {
listOf(
NormalSubItemWithStartIconData("给我好评
标签:10,modifier,compose,androidx,笔记,param,import,Android,Modifier
From: https://www.cnblogs.com/qsbye/p/18078232