Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
b9d2f00
update plan
MiaoZhangLotusflare Jan 1, 2023
30ac393
Merge branch 'ZhangMiao147:master' into master
MiaoZhangLotusflare Jan 3, 2023
663436f
update readme
MiaoZhangLotusflare Jan 3, 2023
6867a3f
2023计划1月实施情况更新
MiaoZhangLotusflare Feb 14, 2023
6f94e0b
修改错别字
MiaoZhangLotusflare Feb 28, 2023
bb722c3
修改样式
MiaoZhangLotusflare Feb 28, 2023
1900d43
navigation之deeplink
MiaoZhangLotusflare Mar 23, 2023
ea1b92c
update readme
MiaoZhangLotusflare Mar 23, 2023
15c870b
Merge branch 'ZhangMiao147:master' into master
MiaoZhangLotusflare Mar 23, 2023
f5c21a6
update 2023 plan
MiaoZhangLotusflare Apr 7, 2023
6a4c3bc
knowledge collection
MiaoZhangLotusflare Apr 7, 2023
250e4d1
add “TextField 设置光标位置” 位置
MiaoZhangLotusflare Apr 14, 2023
7a3871d
add webview遇到的exception
MiaoZhangLotusflare Apr 26, 2023
cd823b7
add kotlin's string
MiaoZhangLotusflare Apr 27, 2023
98b51a3
update 2023 plan
MiaoZhangLotusflare May 6, 2023
8141cba
add EditText 的 imeOptions 与多行输入的问题
MiaoZhangLotusflare May 9, 2023
a4b7a6f
update 2023 plan
MiaoZhangLotusflare Jun 8, 2023
a024d14
update 2023-06 plan
MiaoZhangLotusflare Jul 3, 2023
781e808
update plan
MiaoZhangLotusflare Aug 1, 2023
13a5710
update kotlin 协程
MiaoZhangLotusflare Aug 4, 2023
b5859c2
update proto datastore
MiaoZhangLotusflare Aug 14, 2023
671b6e5
update jetpack 架构组件从入门到精通
MiaoZhangLotusflare Aug 24, 2023
01076a4
update readme
MiaoZhangLotusflare Aug 24, 2023
482be42
update 利用kotiln特点
MiaoZhangLotusflare Aug 24, 2023
5a0eb80
add Android jetpack 应用指南
MiaoZhangLotusflare Aug 25, 2023
e1357a3
update plan 202308
MiaoZhangLotusflare Sep 1, 2023
b33910c
update jetpack book note
MiaoZhangLotusflare Sep 22, 2023
f6bbc1c
update livedata
MiaoZhangLotusflare Sep 25, 2023
0a23687
update room
MiaoZhangLotusflare Oct 8, 2023
bcaf7e7
update 2023 plan
MiaoZhangLotusflare Oct 8, 2023
18e665e
update WorkManager
MiaoZhangLotusflare Oct 11, 2023
702ed5b
update compose加载图片异常
MiaoZhangLotusflare Oct 12, 2023
706cfea
update 2023 plan
MiaoZhangLotusflare Nov 3, 2023
35fb7a6
add databinding
MiaoZhangLotusflare Nov 3, 2023
ee96dba
update databinding
MiaoZhangLotusflare Nov 8, 2023
c306460
update paging
MiaoZhangLotusflare Nov 10, 2023
f2b35f7
update 2023 plan
MiaoZhangLotusflare Dec 13, 2023
a7388b6
update 2023 总结与 2024 计划
MiaoZhangLotusflare Jan 2, 2024
64e54da
update paging
MiaoZhangLotusflare Jan 3, 2024
470257e
update mvvm
MiaoZhangLotusflare Jan 5, 2024
61689c7
add kotlin let with run apply also
MiaoZhangLotusflare Jan 10, 2024
4e3f272
update 202401 plan
MiaoZhangLotusflare Feb 5, 2024
4e00deb
update compose 基础知识
MiaoZhangLotusflare Feb 21, 2024
556b554
add getDimensionxxx方法区别
MiaoZhangLotusflare Feb 22, 2024
4961a3d
add kotlin 将 base64 字符串转换成 bitmap
MiaoZhangLotusflare Jun 12, 2024
31923f5
add 散列算法比较
MiaoZhangLotusflare Jun 12, 2024
dc8c7ac
add compose 点击拖动滑动事件
MiaoZhangLotusflare Aug 13, 2024
22d2b4e
update plan
MiaoZhangLotusflare Aug 13, 2024
9d3c30c
add kotlin flow 的collect 与 collectLatest 有什么区别
MiaoZhangLotusflare Aug 14, 2024
61d9d4d
update
MiaoZhangLotusflare Feb 14, 2025
35eb908
change
MiaoZhangLotusflare Dec 19, 2025
7f66340
Setup and configuration 完成
MiaoZhangLotusflare Jan 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Android/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,11 @@
* js 通信
* 优化
* View
* [WebView 遇到的 Exception]
* [EditText 的 imeOptions 与多行输入的问题]
* [getDimensionxxx方法区别]
* Snackbars
* [Snackbars 常见问题]

* Materal Design
* Toolbar
* 沉浸式状态栏
Expand Down
2 changes: 0 additions & 2 deletions Android/adaptation/屏幕适配.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

  屏幕适配



## 参考文章

[Android 屏幕适配全攻略](https://blog.csdn.net/zhaokaiqiang1992/article/details/45419023)
Expand Down
12 changes: 12 additions & 0 deletions Android/fragment/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,15 @@
* [Fragment 的使用](https://github.com/ZhangMiao147/android_learning_notes/blob/master/Android/fragment/Fragment的使用.md)

(添加 add 与 replace 的区别知识 20220408)

* BottomSheetDialogFragment
* https://www.apiref.com/android-zh/android/support/design/widget/BottomSheetDialogFragment.html BootSheetDialogFragment API 参考文档
* https://blog.csdn.net/zhaoyanjun6/article/details/127967304 Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等
* https://juejin.cn/post/7111350570140565512 Android基础-BottomSheetDialog使用
* https://www.jianshu.com/p/89c86880c4b6 Android DialogFragment、BottomSheetDialogFragment的基本使用
* https://www.jianshu.com/p/27c768c6272e android BottomSheetDialogFragment 详解
* https://www.freesion.com/article/2790419664/ ANDROID BOTTOMSHEETDIALOGFRAGMENT 可随手势滑动关闭的底部弹窗
* https://www.jianshu.com/p/267f4bb0a3e4 【Android】BottomSheetDialogFragment使用笔记
* DialogFragment
* https://www.jianshu.com/p/89c86880c4b6 Android DialogFragment、BottomSheetDialogFragment的基本使用
* https://blog.csdn.net/u011272795/article/details/102822028 Android 弹窗 DialogFragment
97 changes: 97 additions & 0 deletions Android/other/散列算法比较.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# 散列算法比较:MD5、SHA1、SHA256 有哪些区别

## 算法比较

MD5、SHA1、SHA256 算法都属于散列算法,或者叫做哈希算法。它们具有输入任意长度,输出长度固定,以及单向性(无法根据散列值还原出消息)的特点。

**关于 MD5**

MD5 是一个安全散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程是不可逆的。所以要解密 MD5 没有现成的算法,只能穷举法,把可能出现的明文,用 MD5 算法散列之后,得到的散列值和原始的数据形成一个一对一的映射表,通过匹配从映射表中找到破解密码所对应的原始明文。

**关于 SHA1**

SHA1 是一个密码散列函数,可以生成一个被称为消息摘要的 160 位(20 字节)散列值,散列值通常的呈现形式为 40 个十六进制数。该算法输入报文的长度不限,产出的输出是一个 160 位的报文摘要。输入要按 512 位的分组进行处理的。SHA1 是不可逆的、防冲突,并具有良好的雪崩效应。

**关于 SHA256**

SHA256 是一个密码散列函数,也可以说是哈希函数。对于任意长度的消息,SHA256 都会产生一个 256bit 长度的散列值,成为消息摘要,可以用一个长度为 64 的十六进制字符串表示。SHA256 是 SHA-2 下细分出的一个钟算法。SHA-2 下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256.

**MD5、SHA1、SHA256 有哪些区别**

相同点:

都是密码散列函数,加密不可逆;

都可以实现对任何长度对象加密,都不能防止碰撞;

不同点:

1. 校验值的长度不同,MD5 校验位的长度是 16 个字节(128 位);SHA1 是 20 个字节(160 位);SHA256 是 32 个字节(256 位)

2. 运行速度不同,SHA256 的运行速度最慢,然后是 SHA1,最后是 MD5。

MD5、SHA1、SHA256 安全性如何?

在安全性方面,SHA256 的安全性最高,然后是 SHA1,最后是 MD5。虽然 SHA256 的安全性比较高,但是耗时要比其他两种多很多。

**MD5、SHA1、SHA256 不能解密吗**

SHA256 是目前比较流行的计算机算法之一,相对 MD5 和 SHA1 而言,SHA256 很安全。

SHA256 是牢不可破的函数,它的 256 位迷药从未泄漏过。而 MD5 就不一样了,单纯使用比较容易遭到撞库攻击。通过预先计算知道 MD5 的对应关系,存在数据库中,然后使用的时候反查,MD5 就可能被解密。

在网络安全实训中,也会用到这种相应的数据库进行查询。目前网上有很多 MD5 解密网站(md5.cn),可以通过秘闻查询到相应的口令,从而达到 “ 解密 ” 的目的,有一定的成功率。

在计算机安全领域,这些算法得到广泛应用。以上就是 MD5、SHA1、SHA256 的区别,可以灵活地选用这些算法达到实际目的。

## kotlin 使用算法加密

```kotlin
// 消息摘要,不可逆
object MessageDigetUtil {
// 用户登录用的比较广泛
fun md5(input: String):String {
val digest = MessageDigest.getInstance("MD5")
val result = digest.digest(input.toByteArray())
return toHex(result)
}

fun sha1(input: String):String {
val digest = MessageDigest.getInstance("SHA-1")
val result = digest.digest(input.toByteArray())
return toHex(result)
}

fun sha256(input: String):String {
val digest = MessageDigest.getInstance("SHA-256")
val result = digest.digest(input.toByteArray())
return toHex(result)
}

// 转成 16 进制
fun toHex(byteArray: ByteArray): String {
// 转成 16 进制
val result = with(StringBuilder()) {
byteArray.forEach {
val value = it
val hex = value.toInt() and (0xFF)
val hexStr = Integer.toHexString(hex)
if(hexStr.length == 1){
append("0").append(hexStr)
} else {
append(hexStr)
}
}
this.toString
}
return result
}
}
```



## 参考文章

1. [散列算法比较:MD5、SHA1、SHA256有哪些区别 - 简书](https://www.jianshu.com/p/72d4f03aa3cb)
2. [kotlin 不可逆加密_kotlin sha256加密-CSDN博客](https://blog.csdn.net/qq_35698774/article/details/79002391)
11 changes: 11 additions & 0 deletions Android/sdk/Android SDK开发.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Android SDK 开发艺术探索







## 参考文章

1. [Android SDK开发艺术探索(一)开篇与设计Android SDK开发艺术探索系列基于实际生产中的业务型SDK开发 - 掘金](https://juejin.cn/post/6864723217831952392?from=search-suggest)
3 changes: 3 additions & 0 deletions Android/view/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@

## View

* [WebView 遇到的 Exception]
* [EditText 的 imeOptions 与多行输入的问题]
* BottomNavigationView http://www.45fan.com/article.php?aid=1COkLHKOUF2TiLJM
* [getDimensionxxx方法区别]

### Snackbars

Expand Down
65 changes: 65 additions & 0 deletions Android/view/view/EditText的imeOptions与多行输入的问题.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# EditText 的 imeOptions 与多行输入的问题

在 xml 为 EditText 中设置 imeOptions 可以控制键盘确认键的具体功能,如下列举了一些:

```xml
android:imeOptions="flagNoExtractUi" //使软键盘不全屏显示,只占用一部分屏幕 同时,
这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键
android:imeOptions="actionNone" //输入框右侧不带任何提示
android:imeOptions="actionGo" //右下角按键内容为'开始'
android:imeOptions="actionSearch" //右下角按键为放大镜图片,搜索
android:imeOptions="actionSend" //右下角按键内容为'发送'
android:imeOptions="actionNext" //右下角按键内容为'下一步' 或者下一项
android:imeOptions="actionDone" //右下角按键内容为'完成'
```

**问题描述:**因为 EditText 一旦设置了多行显示,键盘总是显示 Enter 键。有时候不仅需要文本输入多行显示,而且 Enter 键需要支持 imeOptions 设置,比如显示完成键而不是回撤换行。

当 EditText 弹出输入法时,会调用方法 public InputConnection onCreateInputConnection(EditorInfo outAttrs) 来创建和输入法的连接,设置输入法的状态,包括显示什么样的键盘布局。需要注意的地方时这部分的代码:

```java
if (isMultilineInputType(outAttrs.inputType)) {
// Multi-line text editors should always show an enter key.
outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}


private static boolean isMultilineInputType(int type) {
return (type & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE)) ==
(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE);
}
```

发现,当 EditText 的 inputType 包含 textMultiLine 标志位,会强迫 imeOptions 加上 IME_FLAG_NO_ENTER_ACTION 位,这导致了只显示 Enter 键。

在网上找的解决方案是:可以继承 EditText 类,覆写 onCreateInputConnection 方法,如下:

```java
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
InputConnection connection = super.onCreateInputConnection(outAttrs);
int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
// clear the existing action
outAttrs.imeOptions ^= imeActions;
// set the DONE action
outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
}
if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
}
return connection;
}
```

然后还有一个坑,在基础 EditText 后,要重写完所有的构造函数,要不在 inflate 时会出错,直接调用父类的相关的构造方法就好。



**网上的解决方案试了是没有效果的,所以多行输入与控制键的设置问题解决不了。**



## 参考文章

[EditText android:imeOptions与inputType="textMultiLine" 的坑](https://blog.csdn.net/a641324093/article/details/62238385)
14 changes: 13 additions & 1 deletion Android/view/view/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# View

* [WebView 遇到的 Exception]
* [EditText 的 imeOptions 与多行输入的问题]
* [getDimensionxxx方法区别]

## Snackbars

* [Snackbars 常见问题]
* [Snackbars 常见问题]





## 知识收集

* https://www.jianshu.com/p/9a7e518bfbea 关于TextView autolink的点击拦截和字体样式更改问题
97 changes: 97 additions & 0 deletions Android/view/view/WebView遇到的Exception .md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Web 遇到的 Exception

## MissingWebViewPackageException

遇到的 exception 为 :

```
android.webkit.WebViewFactory$MissingWebViewPackageException

Failed to load WebView provider: No WebView installed
```

详细信息如下:

```
Caused by android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed
at android.webkit.WebViewFactory.getWebViewContextAndSetProvider(WebViewFactory.java:428)
at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:493)
at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:348)
at android.webkit.WebView.getFactory(WebView.java:2596)
at android.webkit.WebView.ensureProviderCreated(WebView.java:2590)
at android.webkit.WebView.setOverScrollMode(WebView.java:2677)
at android.view.View.<init>(View.java:5567)
at android.view.View.<init>(View.java:5742)
at android.view.ViewGroup.<init>(ViewGroup.java:720)
at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:58)
at android.webkit.WebView.<init>(WebView.java:423)
at android.webkit.WebView.<init>(WebView.java:365)
at android.webkit.WebView.<init>(WebView.java:347)
at android.webkit.WebView.<init>(WebView.java:334)
at android.webkit.WebView.<init>(WebView.java:324)
at packagename.EnterFragmentKt$EnterScreen$5$1$1$3$1.invoke(:7)
at packagename.EnterFragmentKt$EnterScreen$5$1$1$3$1.invoke(:2)
at androidx.compose.ui.viewinterop.ViewFactoryHolder.setFactory(ViewFactoryHolder.java:13)
at androidx.compose.ui.viewinterop.AndroidView_androidKt$AndroidView$1.invoke(:13)
at androidx.compose.ui.viewinterop.AndroidView_androidKt$AndroidView$1.invoke()
at androidx.compose.ui.viewinterop.AndroidView_androidKt$AndroidView$$inlined$ComposeNode$1.invoke(:2)
at androidx.compose.runtime.ComposerImpl$createNode$2.invoke(ComposerImpl.java:2)
at androidx.compose.runtime.ComposerImpl$createNode$2.invoke(ComposerImpl.java:6)
at androidx.compose.runtime.ComposerImpl$recordInsert$2.invoke(ComposerImpl.java:2)
at androidx.compose.runtime.ComposerImpl$recordInsert$2.invoke(ComposerImpl.java:6)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(CompositionImpl.java:60)
at androidx.compose.runtime.CompositionImpl.applyChanges(CompositionImpl.java:5)
at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(:86)
at androidx.compose.runtime.CompositionImpl.setContent(CompositionImpl.java:15)
at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(:89)
at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(:2)
at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.java:11)
at androidx.compose.ui.platform.WrappedComposition.setContent(:12)
at androidx.compose.ui.platform.WrappedComposition.onStateChanged(:29)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(:14)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:69)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:72)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:2)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:9)
at androidx.fragment.app.FragmentViewLifecycleOwner.handleLifecycleEvent(FragmentViewLifecycleOwner.java:2)
at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:43)
at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:35)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:18)
at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:2)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:2)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:230)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:91)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:21)
at androidx.fragment.app.FragmentManager$4.run(:3)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8751)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
```

解决方法是:

```java
public class MyWebView extends WebView {

@Override
public void setOverScrollMode(int mode) {
try {
super.setOverScrollMode(mode);
} catch (Exception e) {
if (e.getMessage() != null && e.getMessage().contains("Failed to load WebView provider: No WebView installed")) {
e.printStackTrace();
} else {
throw e;
}
}
}
}
```



22 changes: 22 additions & 0 deletions Android/view/view/getDimensionxxx方法区别.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# getDimension()、getDimensionPixelOffset() 和 getDimensionPixelSize() 区别

在自定义控件中使用自定义属性时,经常需要使用 java 代码获取在 xml 中定义的尺寸,相关有以下三个函数:

* getDimension()
* getDimensionPixelOffset()
* getDimensionPixelSize()

在类 TypedArray 和类 Resources 中都有这三个函数,功能类似,TypeArray 中的函数是获取自定义属性的,Resources 中的函数是获取 android 预置属性的。

API reference 里的解释:

* getDimension() 是基于当前 DisplayMetrics 进行转换,获取指定资源 id 对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是 float,像素肯定是 int。
* getDimensionPixelSize() 与 getDimension() 功能类似,不同的是将结果转换为 int,并且小数部分四舍五入。
* getDimensionPixelOffset() 与 getDimension() 功能类似,不同的是将结果转换为 int,并且偏移转换(offset conversion,函数命名中的 offset 是这个意思)是直接截断小数位,即取整(其实就是把 float 强制转换为 int,注意不是四舍五入哦)。

由此可见,这三个函数返回的都是绝对尺寸,而不是相对尺寸(dp/sp等)。如果 getDimension() 返回结果是 20.5f,那么 getDimensionPixelSize() 返回结果就是 21,getDimensionPixelOffset() 返回结果就是 20。

# 参考文章

1. [【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解](https://www.cnblogs.com/ldq2016/p/6834959.html)

1 change: 0 additions & 1 deletion Android/view/view的实践/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# View 实践

* [Android实现卡片翻转的动画(翻牌动画)](https://github.com/ZhangMiao147/android_learning_notes/blob/master/Android/view/view%E7%9A%84%E5%AE%9E%E8%B7%B5/Android%E5%AE%9E%E7%8E%B0%E5%8D%A1%E7%89%87%E7%BF%BB%E8%BD%AC%E7%9A%84%E5%8A%A8%E7%94%BB%EF%BC%88%E7%BF%BB%E7%89%8C%E5%8A%A8%E7%94%BB%EF%BC%89.md)

* [系统控件的常用使用](https://github.com/ZhangMiao147/android_learning_notes/blob/master/Android/view/view%E7%9A%84%E5%AE%9E%E8%B7%B5/%E7%B3%BB%E7%BB%9F%E6%8E%A7%E4%BB%B6%E7%9A%84%E5%B8%B8%E7%94%A8%E4%BD%BF%E7%94%A8.md)
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions Android/音视频/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# 音视频

1.1.mac 账号:1006299425 密码:181501,播放器下载地址:http://www.drmsoft.net/playernet/down.asp

1.2.链接:https://pan.baidu.com/s/1eN2BdtnwW17VTu4e7EXT0A?pwd=d0sx 提取码:d0sx

## C 语言基础

### C 语言初探
Expand Down
Loading