Android

分类下相关文章

Android 从相册选择照片,或者拍照

之前实现了 Android 拍照获取图片,现在需要再加上从相册选择照片。 交互 其实有多种交互方式: 界面上直接放两个按钮:一个是拍照,一个是从相册选取。简单直接。 点击拍照按钮,弹出一个选择框,提供两个选项,一拍照,二从相册选择 对于界面空间富裕的场景,我觉得第一种方式就非常方便了。当然,我也懒得搞那么复杂。。。 可是微信里面那个相机为啥那么方便呢?是否是自定义实现的相机,而不是调用的默认的相机应用。 kotlin registerForActivityResult 实现,目前推荐 registerForActivityResult 并没有 startActivityForResult ...

阅读全文...

Android 线性布局 LinerLayout 实现两端对齐

例如接口返回的数据都是 key value 格式,诸如: 姓名:xxx 年龄:xxx 这种。我想用 Android 的 LinearLayout,即线性布局,实现两端对齐的效果。 最终效果 代码 其实原理很简单,就是在两个 TextView 之间插入一个空的 TextView, 然后这个 view 的 layout_weight 设置为 1。这样,这个空的 TextView 就能占据剩余的空间。 简单直接,比如那些引入 Space 的方案好太多了。 <LinearLayout android:layout_width="match_parent" ...

阅读全文...

Android Kotlin JSONObject 解析接口返回的 JSON 数据

我想试试不依赖三方库,例如 GSON,的情况下,用 Android 内置的 JSONObject 来解析后台接口返回的 JSON 字符串。 后台返回的 JSON 格式为: { "err_code": 0, "count": 4, "img": "static/public_images/20220405_093125_cb6e46b6301542ada1ee8e4a7a182e1f.jpg", "shape": [ 232, 174 ...

阅读全文...

Android Kotlin 使用 OkHttp3 上传拍照获取的 Bitmap 图片

断断续续耗费了快一天时间,终于把 Android 拍照并使用 OkHttp3 上传图片的功能实现。 整体感受: Kotlin 相关的资料还是少,即便是英文的资料也不足,特别是三方库。大部分都是 Java 的代码 Android 这些类库相关接口废弃得过于频繁,就算找到了示例代码,经常是已经废弃的接口。对新手很不友好 无聊的概念太多,必须沉住气,要不很容易掀桌子 家里有孩子需要看,不可能一直坐在电脑边,身边有本纸质参考书翻翻,即便是过时的实现方法,还是有启发的,也可以了解基础知识 OkHttp 官方文档 https://square.github.io/okhttp/ 只不过文档是基于 Ja ...

阅读全文...

Android 拍照并获取图片缩略图的实现

逻辑上是点击自己 Anroid APP 的拍照按钮,然后调用系统内置的相机应用,拍照后,将照片返回给我的 APP。 实际上就是启动一个 activity,并接收其返回的结果数据,然后再处理。 Android 官方推荐使用 AndroidX Activity 和 Fragment 中引入的 Activity Result API,以替代 startActivityForResult() 和 onActivityResult() API。 记录一下实现。 注意,这个方式获取到是图片的缩略图,并不是原始图片的尺寸,而且小非常多,几乎看不清的尺寸,如果要获取原始尺寸,需要参考Android 通过 AC ...

阅读全文...

Android 布局底部大按钮的实现,LinearLayout 对比 RelativeLayout

布局需求 一个植物种子图像识别的 Android APP,在功能页包含: 底部一个大按钮,用于拍照 顶部剩余区域展示选择的图片,及识别结果,例如自动识别出的种子个数 布局选型 网上搜了一下,发现可选的方案非常多。几乎各种 Layout 布局都有人采用,例如: LinearLayout RelativeLayout FrameLayout ConstraintLayout 从实现的角度,选择一个顺手的、方便自己理解的去用就行了。 但是作为 Android 萌新,我觉得还是有必要把各种 Layout 的实现方式都用一下, 相互对比,可以直观地理解不同 Layout 的特点,及其不同的使用场 ...

阅读全文...

新建 Android 项目是否需要勾选 Use legacy android.support libraries

有半年没有新建 Android 项目了,今天在 Android Studio Bumblebee 创建 Empty Activity 项目时,有个选项拦住了我。 Use legacy android.support libraries 什么是 legacy android.support libraries? 对于我这种业余型 Android 选手,一头雾水。 下面的解释: Using legacy android.support libraries will prevent you from using the latest Play Services and Jetpack librar ...

阅读全文...

Android dp sp 的区别

概述 px : 其实就是像素单位,比如我们通常说的手机分辨列表800*400都是px的单位 sp : 同dp相似,还会根据用户的字体大小偏好来缩放 dp : 虚拟像素,在不同的像素密度的设备上会自动适配 dip: 同dp 由此可以看出使用sp作为字体大小单位,会随着系统的字体大小改变,而dp作为单位则不会。所以建议在字体大小的数值要使用sp作为单位 dp 而 dp 也叫 dip,是 device independent pixels 使用场景 TODO 参考 https://blog.csdn.net/donkor_/article/details/77680042 ...

阅读全文...

Jetpack Compose 的使用场景

去年投入了极大的热情学习了 Jetpack Compose,本以为可以永远地踢开 XML layout。写了个列表加详情页的简单 Android App,也没有遇到太多的问题,即便遇到了,也找到了解决方案。有的洋洋自得。但是在第二版想添加 Admob 广告时遇到了大坑,没有解决掉。于是,我觉得必须反思一下 Jetpack Compose 的使用场景,或者说使用方式。 jetpack compose 是否可以用在生产环境中 首先,compose 到底能否用在生产环境中,答案肯定是可以的。核心是怎么用的问题。 我在 reddit 上找到了一个非常高质量的讨论: https://www.reddit ...

阅读全文...

Jetpack Compose Admob 广告不显示问题排查

尝试在 Jetpack Compose 中添加 Admob 广告,参考的是下面链接里的第一种方案 https://stackoverflow.com/questions/68855709/how-to-show-a-banner-ad-in-jetpack-compose 但是,无论是在 Android 模拟器里,还是在真机上调试,都无法显示广告。 日志 2022-01-04 22:37:55.551 6242-6353/com.sunzhongwei.shelflife E/chromium: [ERROR:cookie_manager.cc(137)] Strict Secure Cook ...

阅读全文...

Android 模拟器:xxx requires the Google Play Store, but it is missing

在排查 Jetpack Compose 中 Admob 广告不显示问题时,发现一个运行时错误: xxx requires the Google Play Store, but it is missing 我其实很诧异,Android 模拟器里不都运行的是 Google 的原生系统么?为何会找不到 Google Play? 我打开 AVD 虚拟设备列表,发现确实如此。我当前正在使用的虚拟机确实没有 Play Store。 解决办法 其实就是一句话,新建一个带 Google Play Store 的设备。。。 在选择硬件的时候,会清楚的看到,部分手机型号带 Play Store,而其他的则不 ...

阅读全文...

参加 Google Play 学院 21 天进阶计划喜得订制版音箱

上个月参加了 Google Play 学院 21 天进阶计划的活动,坚持打卡,并学完了所有的在线课程。功夫不负有心人,抽到了活动大奖: 一个 Google Play 定制版音箱 一件 Google 卫衣 旅行大礼包。。。实际上是一堆贴纸和标签,圆珠笔,开箱就被我闺女抢走 这个复古音箱非常有爱,居然有收音机功能,很适合听新闻。让我想起了小时候家里的第一台巨大的收音机,边写作业边听广播,伴我走过了九年义务教育。同时这个音箱也支持蓝牙,数据卡,音频线,功能强大了很多。 Google Play 学院 回归主题,Google Play 学院里的课程给我启发很大,有很多实战经验分享,对于我这种想尝试 ...

阅读全文...

在易版权上第一次提交软件著作权申请失败

由于我想将 Android App 上架国内的小米应用商店,按照要求上架必须先注册软件著作权。小米官方推荐使用易版权,于是我就图省事,直接在这个网站上申请了。相对官方的版权保护中心,易版权有一个优势,就是不需要你脱裤子放屁再邮寄一份纸质资料,只需要额外打印并扫描上传一份授权书。 易版权在填写软著的过程中,提示非常详细,比官方网站详细太多。虽然界面比较丑,且体验差劲。但是忍了,为了上架,根本没得选择。 提交后,我天天刷新看进度,无论等几天,永远是 剩余天数:36天 大概是故意来恶心人的。一个做软件著作权的网站,软件做成这样,本身就是一种讽刺。 大概过了一个周,还是两个周,短信提示我申请失败: ...

阅读全文...

Google Play 应用名称长度变更

今天在提交 Google Play 应用市场时,发现商品详情页好多国家的翻译出现了警告图标。 打开一看,都是提示应用名过长,超出了规范。可是之前都是正常的啊。 原来,Google 调整应用名长度,从 50 个字符,缩减为 30 个字符。 您的“应用名称”可能不符合即将实施的应用元数据政策变更:不得超过 30 个字符 详情参考: https://android-developers.googleblog.com/2021/04/updated-guidance-to-improve-your-app.html 其他的调整限制 不得暗示自己的 app 排名,例如 top 这样的关键词,以及图 ...

阅读全文...

Kotlin Enum 的 Android i18n 翻译问题

我定义了一个 enum 类: enum class ShelfLifeUnit { DAY, WEEK, MONTH, YEAR; 但是在真实项目中使用时,会发现如果要实现多语言版本,enum 不太好处理啊。。。 例如,在 Jetpack Compose 中,下拉列表的每一条对应一个 enum 项,需要使用不同翻译时: ShelfLifeUnit.values().forEach { label -> DropdownMenuItem(onClick = { itemViewModel.setCurrentItem(item.copy(shelfLifeUnit = la ...

阅读全文...