自定义 ImageSpan 之行居中显示
1 | class CenteredImageSpan(context: Context, drawableRes: Int) : ImageSpan(context, drawableRes) { |
1 | val spanStr = SpannableStringBuilder() |
1 | class CenteredImageSpan(context: Context, drawableRes: Int) : ImageSpan(context, drawableRes) { |
1 | val spanStr = SpannableStringBuilder() |
Dev Doc
https://developer.android.google.cn/reference/androidx/core/content/FileProvider
在 androidx 包提供的 FileProvider 提供了 生成文件Uri 的功能。
在 manifest 文件中,声明一个 provider
1 | <manifest> |
在 res/xml/file_paths.xml 下配置可用的文件路径,FileProvider 只能生成配置了的文件Uri。每个你想要生成Uri的文件路径都需要在 paths 下面定义。
1 | <paths xmlns:android="http://schemas.android.com/apk/res/android"> |
和其他 app 共享一个文件,你需要生成一个Uri。
1 | File imagePath = new File(Context.getFilesDir(), "my_images"); |
getUriForFile() 返回一个 content URI content://com.mydomain.fileprovider/my_images/default_image.jpg.
1 | shareContentIntent.setClipData(ClipData.newRawUri("", contentUri)); |
Intent by calling setData().Intent.setFlags() with either Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or both.Intent to another app. Most often, you do this by calling setResult().1 | // 使用uri |
1 | java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/DCIM/Camera/**.jpeg |
问题分析
解决方案
下面介绍一下kotlin 线程安全的几种单例写法。
1 | // Kotlin实现 |
1 | // 反编译Kotlin实现的Java代码 |
双重校验锁式(Double Check)
1 | // Kotlin实现 |
1 | // 反编译Kotlin实现的Java代码 |
1 | //Java实现 |
1 | // Kotlin实现 |
1 | // 反编译Kotlin实现的Java代码 |
官网下载: http://adbshell.com/downloads
命令参考: http://adbshell.com/commands
Android官网adb介绍: https://developer.android.google.cn/studio/command-line/adb?hl=zh_cn
Mumu adb常用指令指引: https://mumu.163.com/help/20210513/35047_947512.html
1 | ## 连接/断开连接网络电视(同一个网段,默认端口号5555可以不填) |
在某些情况下,您可能需要终止 adb 服务器进程,然后重启才能解决问题。例如,如果 adb 不响应命令,就可能会发生这种情况。
1 | ## 停止adb服务 |
命令格式:adb -s <serialNumber> command,如:adb -s 127.0.0.1:7555 shell pm list package
可以通过 adb devices 获取目标设备的serialNumber
1 | $ adb devices |
1 | ## 安装apk |
所有应用包名列表
adb shell pm list packages
第三方应用包名列表
adb shell pm list packages -3
系统应用包名列表
adb shell pm list packages -s
根据某个关键字查找包
adb shell pm list packages |grep tencent
查看包安装位置
adb shell pm list packages -f |grep tencent
1 | ## 正在运行应用包名和Activity |
adb shell am start -n 应用包名/应用Activity类名
若想查看启动应用耗时,则可使用adb shell am start -W 应用包名/应用Activity类名
adb shell am force-stop 应用包名
adb shell dumpsys package 应用包名 | findstr version
adb shell pm clear 应用包名
按键输入
adb shell input keyevent 键值
如:adb shell input keyevent 3表示按下HOME键,其他键值对应键位可网上搜索
字符输入
adb shell input text 字符
如:adb shell input text test则表示输入了test字符串
ps:字符不支持中文
鼠标点击
adb shell input tap X Y
X Y分别为当前屏幕下的x和y轴坐标值
鼠标滑动
adb shell input swipe X1 Y1 X2 Y2
X1 Y1 和X2 Y2分别为滑动起始点的坐标
adb push myfile.txt /sdcard/myfile.txt
adb pull /data/test.apk D:\
将模拟器当前显示截图
adb shell screencap /data/screen.png
将截图文件下载至电脑
adb pull /data/screen.png C:\
开始录制
adb shell screenrecord /data/test.mp4
结束录制
可按CTRL+C结束录制
导出视频文件
adb pull /data/test.mp4 C:\
1 | ## 设备型号 |
| 命令 | 功能 |
|---|---|
| adb get-state | 判断设备状态 |
| adb devices | 显示连接到计算机的设备 |
| adb get-serialno | 获取设备的序列号 |
| adb reboot | 重启设备 |
| adb reboot bootloader | 重启设备进入fastboot模式 |
| adb reboot recovery | 重启设备进入recovery模式 |
进入 JDK/bin,输入命令:
1 | keytool -genkey -alias 密钥别名 -keyalg RSA -keysize 1024 -validity 36500 -keystore D:\test.jks -storetype pkcs12 |
参数说明:
-genkeypair 生成一条密钥对(由私钥和公钥组成)
-keystore 密钥库名字及存储位置(默认当前目录)
-alias 密钥对的别名(密钥库可以存在多个密钥对,用于区分不同密钥对)
-validity 密钥对的有效期(单位:天)
-keyalg 生成密钥对的算法(常用 RSA/DSA ,DSA 只用于签名,默认采用DSA )
提示:可重复使用此命令,在同一密钥库中创建多条密钥对
进入 JDK/bin,输入命令:
1 | keytool -v -list -keystore D:\test.jks |

部分应用商店需要签名文件的md5,在 AndroidStudio 中执行gradlew命令
1 | gradlew signingReport |

Update your browser to view this website correctly.&npsb;Update my browser now