{"id":20958583,"url":"https://github.com/junixapp/androidktx","last_synced_at":"2025-03-31T04:03:52.398Z","repository":{"id":37549157,"uuid":"160308163","full_name":"junixapp/AndroidKTX","owner":"junixapp","description":"🔥Some very useful kotlin extensions for speed android development！好用到爆的Kotlin扩展，加速你的Android开发！","archived":false,"fork":false,"pushed_at":"2024-09-11T05:15:49.000Z","size":35824,"stargazers_count":781,"open_issues_count":2,"forks_count":69,"subscribers_count":14,"default_branch":"androidx","last_synced_at":"2025-03-24T00:24:58.001Z","etag":null,"topics":["android-kotlin","android-ktx","androidktx","kotlin"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/junixapp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-04T06:13:15.000Z","updated_at":"2025-03-11T13:11:22.000Z","dependencies_parsed_at":"2023-11-21T07:26:25.721Z","dependency_job_id":"0ee083d3-89fb-421f-8137-74909a7fc0ae","html_url":"https://github.com/junixapp/AndroidKTX","commit_stats":null,"previous_names":["junixapp/androidktx","li-xiaojun/androidktx"],"tags_count":285,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FAndroidKTX","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FAndroidKTX/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FAndroidKTX/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/junixapp%2FAndroidKTX/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/junixapp","download_url":"https://codeload.github.com/junixapp/AndroidKTX/tar.gz/refs/heads/androidx","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246413232,"owners_count":20773053,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-kotlin","android-ktx","androidktx","kotlin"],"created_at":"2024-11-19T01:48:28.267Z","updated_at":"2025-03-31T04:03:52.379Z","avatar_url":"https://github.com/junixapp.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"## AndroidKTX\n![](imgs/logo.png)\n\nSome very useful kotlin extensions for android development !\n\n一系列非常有用的Kotlin扩展和组件，专注于通用业务的封装，目标提高Android开发速度！注意这个不是官方的AndroidKTX ！\n\n## Gradle\nStep1. Add it in your root build.gradle at the end of repositories:\n```\nallprojects {\n    repositories {\n        ...\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\nStep2. Add the dependency\n[![](https://jitpack.io/v/li-xiaojun/AndroidKTX.svg)](https://jitpack.io/#li-xiaojun/AndroidKTX)\n```\ndependencies {\n    implementation 'com.github.junixapp.AndroidKTX:library:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:ext:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:widget:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:videoplayer:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:audioplayer:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:pay:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:share:最新版本'\n    implementation 'com.github.junixapp.AndroidKTX:audio-recorder:最新版本'\n}\n```\n\nOptional permission:\n```\n\u003cuses-permission android:name=\"android.permission.RECORD_AUDIO\" /\u003e\n\u003cuses-permission android:name=\"android.permission.CAMERA\" /\u003e\n\u003cuses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" /\u003e\n```\n\n## Usage\n\n### 初始化\n使用之前需要先初始化，初始化的作用是初始默认配置和注入Context。\n```kotlin\n// 简单注册，保持默认配置\nAndroidKTX.init(this)\n// 也可以详细注册，自定义配置\nAndroidKTX.init(context = this,\n        isDebug = BuildConfig.DEBUG,\n        defaultLogTag = \"logTag\",\n        sharedPrefName = \"spName\")\n```\n\n### Hash相关\n我们使用hash的时候，大都是对字符串操作，所以给String增加了扩展方法，用法如下：\n```kotlin\n\"123456\".md5()  // E10ADC3949BA59ABBE56E057F20F883E\n\"123456\".sha1()  // 7C4A8D09CA3762AF61E59520943DC26494F8941B\n\"123456\".sha256()  // 8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92\n\"123456\".sha512()  // BA3253876AED6BC22D4A6FF53D8406C6AD864195ED144AB5C87621B6C233B548BAEAE6956DF346EC8C17F5EA10F35EE3CBC514797ED7DDD3145464E2A0BAB413\n// 随机数增强哈希\n\"123456\".md5Hmac(salt)  // 4270C88B36C8D232DC2098FE0287A490\n\"123456\".sha1Hmac(salt)  // E3DDE36BBDF2CA05A96DBE11BDE696FEF00C4299\n\"123456\".sha256Hmac(salt)  // 12FC58997EA2FBD1861E1FBD4AFD5D69321A122BAB6FBD1695A2820B42D7F7B8\n\n// 对称加密解密\n//DES的key必须是8位\n\"123456\".encryptDES(\"aaaabbbb\")  //TQEoRuLPiHo=\n\"TQEoRuLPiHo=\".decryptDES(\"aaaabbbb\")  //123456\n//AES的key必须是16位\n\"123456\".encryptAES(\"aaaabbbbaaaabbbb\")  //3FiQmdsD3GCuAManeaW/yg==\n\"3FiQmdsD3GCuAManeaW/yg==\".decryptAES(\"aaaabbbbaaaabbbb\")  //123456\n```\n\n### Span相关\n封装了颜色，大小，背景色，删除线和点击等常用的文本装饰，使用对象是TextView和String。用法如下：\n```kotlin\nval str = \"我是测试文字\"\ntextView.sizeSpan(str, 0..2)\ntextView.sizeSpan(str, 0..2, scale = .7f) //改变scale可以控制放大或缩小，scale默认是1.5\n```\n![weather_humidity](imgs/size_span.png)\n\n```kotlin\ntextView.colorSpan(str,2..6)\n```\n![weather_humidity](imgs/color_span.png)\n\n```kotlin\ntextView.backgroundColorSpan(str,2..6)\n```\n![weather_humidity](imgs/bg_color_span.png)\n\n```kotlin\ntextView.strikeThrougthSpan(str,2..6)\n```\n![weather_humidity](imgs/strikethrough_span.png)\n```kotlin\ntextView.clickSpan(str = str, range = 2..6, color = Color.BLUE, clickAction = {\n    toast(\"哈哈我被点击了\".toColorSpan(0..2))\n})\n```\n![weather_humidity](imgs/click_span.png)\n```kotlin\ntextView.styleSpan(str, range) //加粗，斜体等效果\n```\n\n`appendXX`系列方法，其实在实际项目中append系列方法会用的更多，用法按如下：\n```kotlin\ntv.text = \"演示一下appendXX方法的用法\"\ntv.appendSizeSpan(\"变大变大\")\n        .appendColorSpan(\"我要变色\", color = Color.parseColor(\"#f0aafc\"))\n        .appendBackgroundColorSpan(\"我是有底色的\", color = Color.parseColor(\"#cacee0\"))\n        .appendStrikeThrougthSpan(\"添加删除线哦哦哦哦\")\n        .appendClickSpan(\"来点我一下试试啊\", isUnderlineText = true, clickAction = {\n            toast(\"哎呀，您点到我了呢，嘿嘿\")\n        } )\n        .appendStyleSpan(\"我是粗体的\")\n```\n![appendxx](imgs/append_span.png)\n\n\n### View相关\n```kotlin\nview.width(100)           // 设置View的宽度为100\nview.widthAndHeight(100)  // 改变View的宽度和高度为100\nview.animateWidthAndHeight(600,900) //带有动画\nview.animateWidth(600,900, action = { //监听动画进度，执行可选操作 }) //带有动画\nview.margin(leftMargin = 100)  // 设置View左边距为100\nview.click { toast(\"aa\") }    // 设置点击监听，已实现事件节流，350毫秒内只能点击一次\nview.longClick {             // 设置长按监听\n    toast(\"long click\")\n    true\n}\nview.gone()\nview.visible()\nview.invisible()\nview.isGone  // 属性\nview.isVisible // 属性\nview.isInvisible // 属性\nview.toggleVisibility() // 切换可见性\nview.toBitmap()           // 获取View的截图，支持RecyclerView长列表截图\n// 遍历子View\nlayout.children.forEachIndexed { index, view -\u003e\n\n}\n```\n\n### ImageView相关\n```kotlin\n// 底层是封装Glide来加载图片，内部已解决Glide的CenterCrop导致圆角失效的问题\nimageView.load(url)\nimageView.load(url, placeholder = R.mipmap.ic_launcher, isCircle = true)\nimageView.load(url, placeholder = R.mipmap.ic_launcher, roundRadius = 20)\n```\n\n### RecyclerView相关\n对RecyclerView的使用进行了极其简洁的封装，再也不用写Adapter。\n```kotlin\nrecyclerView.vertical() //设置垂直\n            //.vertical(spanCount = 2, isStaggered = true) //设置垂直2列瀑布流\n            .divider(color = Color.RED, size = 1) //设置分割线\n            // 绑定数据，只需传数据和布局，然后实现绑定的方法，再也不用写Adapter\n            .bindData(data, R.layout.adapter_rv) { holder, t, position -\u003e\n                holder.setText(R.id.text, \"模拟数据 - $t\")\n                        .setImageResource(R.id.image, R.mipmap.ic_launcher_round)\n            }\n            .addHeader(headerView) //必须在bindData之后调用\n            .addFooter(footerView) //必须在bindData之后调用\n            .itemClick\u003cString\u003e { data, holder, position -\u003e\n                toast(\"click ${data[position]}\")\n            }\n            //.itemLongClick\u003cString\u003e { data, holder, position -\u003e\n            //    toast(\"click ${data[position]}\")\n            //}\n\n//notify\n//recyclerView.adapter.notifyItemChanged()\n\n\n// 多条目类型\nrecyclerView.vertical()\n            .divider(color = Color.RED)\n            .multiTypes(data, listOf(OneItem(), TwoItem()))\n            .addHeader(headerView) //必须在multiTypes之后调用\n            .addFooter(footerView) //必须在multiTypes之后调用\n            .itemClick\u003cString\u003e { data, holder, position -\u003e\n                toast(\"click ${data[position]}\")\n            }\n// 实现多个Item类型\nclass OneItem : ItemViewDelegate\u003cString\u003e{\n        override fun bind(holder: ViewHolder, t: String, position: Int) {\n                    holder.setText(android.R.id.text1, t)\n        }\n        override fun isThisType(item: String, position: Int): Boolean {\n            return item != \"header\" \u0026\u0026 item != \"footer\"\n        }\n        override fun getLayoutId(): Int {\n            return android.R.layout.simple_list_item_1\n        }\n    }\n```\n\n\n### SharedPref相关\n使用范围：Context\n```kotlin\n// 便捷处理\nsp().getString(\"a\", \"default\")\nsp().getBoolean(\"b\", false)\nsp(name = \"xxx.cfg\").getBoolean(\"b\", false)\n//...\n\n// 批处理\nsp().edit {\n    putString(\"a\", \"1\")\n    putBoolean(\"b\", true)\n}\n// 清除\nsp().clear()\n```\n\n### Activity相关\n使用范围：Activity和Fragment，以及Context对象，会自动检测Context是否为Activity，并自动添加`FLAG_ACTIVITY_NEW_TASK`\n```kotlin\nstartActivity\u003cMainActivity\u003e()\n// 启动Activity并传参\nstartActivity\u003cMainActivity\u003e(flag = Intent.FLAG_ACTIVITY_CLEAR_TOP, bundle = arrayOf(\n        \"a\" to 1,\n        \"b\" to \"lala\"\n))\n// 在Fragment中启动Activity\nfragment.start\u003cMainActivity\u003e()\n// 使用非Activity的Context启动，内部会自动检测并添加FLAG_ACTIVITY_NEW_TASK，不会导致崩溃\napplicitionCtx.startActivity\u003cMainActivity\u003e(bundle = arrayOf(\n        \"a\" to 1,\n        \"b\" to \"lala\"\n))\n// 在View中启动\nview.startActivity\u003cMainActivity\u003e()\n```\n\n### Fragment相关\n使用范围：Activity和Fragment\n```kotlin\n//替换一个Fragment不传参\nreplace(R.id.frame1, TempFragment())\n//替换一个Fragment并传参数\nreplace(R.id.frame1, TempFragment(), arrayOf(\n                TempFragment.Key1 to \"我是第一个Fragment\",\n                TempFragment.Key2 to \"床前明月光\"\n        ))\n//添加Fragment\nadd(R.id.frame1, AFragment())\n//其他方法，show, hide, remove略过\n\n//fragment批处理，自动commit\nfragmentManager {\n    add(R.id.container, TempFragment())\n    hide(fragment)\n    replace(R.id.container, TempFragment())\n}\n```\n\n### 时间日期处理\n```kotlin\n// 默认格式：yyyy-MM-dd HH:mm:ss\n\"2018-12-07 17:28:39\".toDateMills()  // 字符串日期转毫秒\n(1544174919000L).toDateString()      // 毫秒转字符串日期\n\n// 自定义格式\n\"2018-12-07\".toDateMills(format = \"yyyy-MM-dd\")\n(1544174919000L).toDateString(format = \"yyyy-MM-dd\")\n```\n\n\n### OkHttp极简封装\n对`OkHttpUtils`和`OkGo`都不满意，于是造了一个。\n\n- 请求示例\n```kotlin\nGlobalScope/viewModelScope.launch {\n    //Get请求\n    val user = \"http://192.168.1.103:3000/json\".http().get\u003cUser\u003e().await()\n    //Post请求，传递header和params\n    val user = \"http://192.168.1.103:3000/json\".http()\n                    .headers(\"device\" to \"HuaWeiMate20\", ...)\n                    .params(\"token\" to \"188sas9cf99a9d\",\n                        \"file\" to file,  //上传文件，使用Array\u003cFile\u003e对象来传多个文件\n                         ...)\n                    .post\u003cUser\u003e()\n                    //.postJson(json) 直接传json字符串，目前post和put支持直传json\n                    //.putJson(json) 直接传json字符串，目前post和put支持直传json\n                    .await()\n}\n```\n`GlobalScope.launch`开启的协程并不会自动取消，如果想要自动取消协程，请看看我的文章：https://juejin.im/post/5ceb3d6ef265da1bb47d4180\n\n上面的示例需要在协程中使用；也是我最喜欢和最推荐的方式。如果你不用协程，则可以用`callback style`：\n```kotlin\n\"http://192.168.1.103:3000/json\".http().get(object : HttpCallback\u003cString\u003e {\n        override fun onSuccess(t: String) {\n        }\n        override fun onFail(e: IOException) {\n            super.onFail(e)\n        }\n    })\n```\n下载文件和进度：\n```kotlin\n\"https://github.com/li-xiaojun/XPopup/archive/master.zip\"\n            .http()\n            .savePath(Environment.getExternalStorageDirectory().toString() + \"/xxx.zip\")\n            .downloadListener(onProgress = {\n                LogUtils.d(\"download progress: ${it?.percent}\")\n            })\n            .get\u003cFile\u003e()\n            .await()\n```\n\n- Http日志\n\n内置了简洁实用的Http日志打印器，效果如下：\n![Http日志](imgs/http_log.jpg)\n\n- 其他\n```kotlin\n        // 设置自定义的Client\nOkExt.setClient(...)\n        // 设置全局header\n        .headers(\"header1\" to \"a\", \"header2\" to \"b\", ...)\n        // 设置拦截器\n        .interceptors(...)\n        .baseUrl(\"https://lixiaojun.xin/\")\n\n// 取消请求\n\"http://192.168.1.103:3000/json\".http(tag = \"abc\").get\u003cString\u003e() //需要先指定tag\nOkExt.cancel(\"abc\")\n```\n\n### LiveData和Lifecycle相关\n内置了一些实用类：\n1. OnceLiveData: 只执行一次的LiveData\n2. StateLiveData: 携带状态的LiveData\n```kotlin\n// observe data.\nvm.userData.observe(this, Observer { \n    // data change\n})\n// observe state\nvm.userData.state.observe(this, Observer { \n    when(it){\n        StateLiveData.State.Idle -\u003e toast(\"idle\")\n        StateLiveData.State.Loading -\u003e showProgress(\"idle\")\n        StateLiveData.State.Success -\u003e toast(\"success\")\n        StateLiveData.State.Error -\u003e toast(\"fail\")\n    }\n})\n```\n3. LifecycleHandler: 自动在UI销毁时移除msg和任务，天然不会内存泄露的Handler\n\n\n### 通用扩展\n\n- Json转换相关：\n```kotlin\nUser(\"李晓俊\", 25).toJson()   // {\"age\":25,\"name\":\"李晓俊\"}\n// 底层是Gson解析，但是不用传class或者TypeToken了，得益于Kotlin的reified功能\n\"{\\\"age\\\":25,\\\"name\\\":\\\"李晓俊\\\"}\".toBean\u003cUser\u003e()\n// 集合类型需要这样写\n\"[{\\\"age\\\":25,\\\"name\\\":\\\"李晓俊\\\"}]\".toBean\u003cList\u003cUser\u003e\u003e()\n```\n\n- toast相关\n```kotlin\nctx/fragment/view.toast(\"测试短吐司\")\nctx/fragment/view.longToast(\"测试长吐司\")\n```\n\n- dp和px转换：\n```kotlin\nctx/fragment/view/holder.dp2px(100)\nctx/fragment/view/holder.px2dp(100)\nctx/fragment/view/holder.sp2px(100)\nctx/fragment/view/holder.px2sp(100)\n//动态创建图片\nctx/fragment/view/holder.createDrawable(color = Color.GREEN,\n                                         strokeColor = Color.RED,\n                                         strokeWidth = dp2px(2f),\n                                         radius = dp2px(30f).toFloat(),\n                                         enableRipple = true)\n```\n\n- Resource获取相关\n```kotlin\ncontext/fragment/view/holder.string(R.string.app_name) // 获取字符串\ncontext/fragment/view/holder.stringArray(R.array.array) // 获取字符串数组\ncontext/fragment/view/holder.color(R.id.color)    //获取颜色\ncontext/fragment/view/holder.drawable(R.mipmap.ic_launcher) // 获取图片\ncontext/fragment/view/holder.dimenPx(R.dimen.abc) // 获取dp值\n```\n\n- TextView相关\n\n给TextView增加sizeDrawable方法，用于给TextView的drawable设置大小：\n```kotlin\ntv.sizeDrawable(dp2px(20), topDrawable = R.mipmap.ic_launcher)\n```\n\n- ViewPager相关\n\n让ViewPager变成卡片缩放效果：\n```kotlin\npager.asCard() //通过参数可以调节卡片的距离和大小\n```\n设置adapter绑定数据：\n```kotlin\nviewPager.bind(10, bindView = {container, position -\u003e\n    return@bind TextView(this)\n})\n```\n\n- Bitmap相关\n\n将Bitmap保存到相册：\n```kotlin\nbitmap.saveToAlbum()\n```\n\n\n## 通用控件\n- TitleBar\n通用的标题栏控件，具体使用看属性便知，右边最多支持3个按钮。\n![TitleBar](imgs/titlebar.png)\n\n使用示例：\n```xml\n\u003ccom.lxj.widget.TitleBar\n    android:layout_marginTop=\"15dp\"\n    app:title=\"嘻嘻\"\n    android:id=\"@+id/tt\"\n    app:titleAlignLeft=\"true\"\n    app:leftImageSrc=\"@mipmap/fh2\"\n    app:rightImageSrc=\"@mipmap/setting\"\n    app:rightImagePadding=\"15dp\"\n    app:rightImage2Src=\"@mipmap/zhifuwacheng\"\n    app:rightImage3Src=\"@mipmap/fx\"\n    app:titleColor=\"#fff\"\n    android:background=\"#2079E5\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" /\u003e\n```\n\n点击监听：\n```kotlin\n//titleBar点击事件\ntt.clickListener(object : TitleBar.ClickListener{\n    override fun leftTextClick() {\n        toast(\"left text\")\n    }\n    override fun leftImageClick() {\n        toast(\"left image\")\n    }\n    override fun rightTextClick() {\n        toast(\"right text\")\n    }\n    override fun rightImageClick() {\n        toast(\"right image\")\n    }\n    override fun rightImage2Click() {\n        toast(\"right image22\")\n    }\n    override fun rightImage3Click() {\n        toast(\"right image333\")\n    }\n})\n```\n\n- SuperLayout\n用来实现常见的横向图文布局，使用它配合几个属性，可以轻松实现以下效果：\n![SuperLayout](imgs/super1.png)\n![SuperLayout](imgs/super2.png)\n\n基本使用：\n```xml\n\u003ccom.lxj.widget.SuperLayout\n    android:layout_marginLeft=\"20dp\"\n    android:layout_marginRight=\"20dp\"\n    android:paddingLeft=\"14dp\"\n    android:paddingRight=\"15dp\"\n    android:paddingTop=\"10dp\"\n    android:paddingBottom=\"10dp\"\n    android:layout_marginTop=\"15dp\"\n    app:sl_leftImageSrc=\"@drawable/avatar\"\n    app:sl_leftText=\"头像\"\n    app:sl_leftTextColor=\"#222\"\n    app:sl_leftTextSize=\"18sp\"\n    app:sl_rightImageSrc=\"@mipmap/jt\"\n    app:sl_solid=\"#3EDCE9\"\n    app:sl_corner=\"15dp\"\n    app:sl_strokeWidth=\"2dp\"\n    app:sl_stroke=\"#f00\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"/\u003e\n```\n其他用法看属性名即可，无需多说。\n\n- ShapeFrameLayout，ShapeLinearLayout，ShapeRelativeLayout，ShapeTextView等可以设置背景，圆角，水波纹的布局\n\n\n## 分享相关\n对微信好友和朋友圈分享，QQ分享和微博分享和登录的封装。\n```kotlin\n//分享相关appKey和appId配置\n Share.init(this, BuildConfig.DEBUG, umengAppKey = BuildConfig.UmengAppKey,\n            wxAppId = BuildConfig.WeChatAppId, wxAppKey = BuildConfig.WeChatAppKey,\n            qqAppId = BuildConfig.qqAppId, qqAppKey = BuildConfig.qqAppKey,\n            weiboAppId = BuildConfig.weiboAppId, weiboAppKey = BuildConfig.weiboAppKey, weiboCallbackUrl = BuildConfig.weiboCallbackUrl)\n```\n三方分享:\n```kotlin\nShare.share(this, SHARE_MEDIA.WEIXIN_CIRCLE, text = \"\",\n            title = \"\" , url = \"https://iandroid.xyz\", bitmap = null)\n```\n\n三方登录：\n```kotlin\nShare.wechatLogin(this@AccountSettingActivity, object : Share.ShareLoginCallback {\n    override fun onComplete(platform: SHARE_MEDIA, loginData: LoginData) {\n\n    }\n})\n```\n\n## 图片和视频选择，拍照\n- 拍照\n```\nImagePicker.startCamera()\n```\n- 选择照片或视频\n```\nImagePicker.startPicker()\n```\n- 获取结果\n```\nImagePicker.fetchResult(intent) //在onActivityResult方法中使用\n```\n\n## 支付\n- 支付宝支付\n```\nPayVM.aliPay(...)\n```\n- 微信支付\n```\nPayVM.wxPay(...)\n```\n\n## 二维码扫描\n```\nQrCodeUtil.start(this, 1)\n```\n\n\n## 文档\n文档懒得写了，主要自用。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjunixapp%2Fandroidktx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjunixapp%2Fandroidktx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjunixapp%2Fandroidktx/lists"}