自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 资源 (3)
  • 论坛 (3)
  • 收藏
  • 关注

原创 添加 framework.jar,混淆失败(不混淆framework.jar)

开发一些系统相关的类时,常常需要引入 framework.jar 去调用一些 hide 的类或 api,一般的做法就是在 libs 中加入该 jar 包,如:如果你要调用,还需要在 project 的build.gradle 添加: gradle.projectsEvaluated { tasks.withType(JavaCompile) { //设置jar相对包路径或绝对路径 options.compilerArgs.add('

2021-01-28 17:36:03 11

原创 Mac 环境下 Android 使用Jenkins 构建自动化打包

最近在看使用 jenkins 进行自动化打包,现在记录一下,方便后面查询。这里的环境为 Mac ,所以window的,可以看后面构建的部分。一. 下载安装首先,直接去到官网 下载,选择左边稳定办版找到你的环境,我这里为 mac,官网推荐的方式是使用 brew如果你的电脑还未安装 brew ,可以通过这篇文章Mac必备神奇homebrew下载成功之后,执行 jenkins-lts 就可以启动 jenkins了,接着,在浏览器上输入 localhost:8080,就会出现jenkins 的页面,然

2020-12-28 10:54:17 37

原创 Android 快速获取热点名称密码

目前很多厂商都会使用 wlan1 来配置热点,这样使用Android原生的接口,是拿不到热点名称和密码的,但使用命令就可以快速拿到;首先,为避免权限问题,先adb rootadb remount然后 adb shell 进入设备,输入以下指令,找到热点配置信息busybox ps | grep hostapd然后使用 cat 看看 /data/misc/wifi/hostapd.conf可以看到,名称和密码都能看到了。你可以使用File file = new File(confP

2020-12-03 18:02:32 105

原创 Kotlin -正确退出forEach

最近在代码评审的时候,竟然看到同事使用 kotlin 的forEach,他以为使用 return@forEach 就可以退出了,相当于 break,但其实并不是,只是相当于 for 的 continue。一. 问题复现那么,如何正确退出 forEach呢?先看这段代码,打印出什么?listOf(1, 2, 3, 4, 5).forEach { if (it == 3) return@forEach print(it)}打印如下:1245嗯,看起来就相当于 for 的

2020-11-07 12:11:33 316 1

原创 Git 实用笔记(一) log实用笔记

一. git add当我们修改了某个文件,都需要 使用 git add log.txt 把这个文件添加到缓冲区中,使用 git add . 添加所有;需要注意的是, add 的原理是add 这个文件修改的内容,而不是文件名二. commit 相关当 git add 文件之后,可以直接使用 git commit -m “说明” 直接提交...

2020-10-25 12:08:36 45

原创 Android 蓝牙开发(三) -- 低功耗蓝牙开发

前面已经学习了经典蓝牙开发,学习了蓝牙的配对连接和通信,又通过 配置 A2DP 文件,实现手机和蓝牙音响的连接和播放语音。这篇,我们来学习蓝牙开发的最后一章,低功耗蓝牙 BLE,也就是我们常说的蓝牙 4.0 。今天要完成的效果如下: 中心设备 外围设备 一. 简介与传统蓝牙不同,低功耗蓝主要为了降低设备功耗,支持更低功耗(如心率检测仪,健身设备)等设备进行通信。Android 在 4.3(API 18) 后将低功耗蓝牙内置,并提供对应的

2020-09-04 15:10:57 495 9

原创 Linux 使用 vim命令行

一、介绍二、Vim 之 移动、缩进、跳转2.1 移动首先,先知道 vim 中,光标的移动;要知道 vim 与我们键盘的分布是不同的,

2020-08-20 16:27:59 50

原创 Android 蓝牙开发(二) --手机与蓝牙音箱配对,并播放音频

Android 蓝牙开发(一) – 传统蓝牙聊天室项目工程BluetoothDemo上一章中,我们已经学习了传统蓝牙的开发,这一章,我们来学习如何让手机与蓝牙耳机、音箱等连接配对,并实现音频传输。一、基础知识前面在 Android 蓝牙开发(一) – 传统蓝牙聊天室 的文章中,我们已经对蓝牙知识有个基本认识。而且从 Android 3.0 开始,Bluetooth API 支持蓝牙配置文件,蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范。举个例子:免提配置文件。如果手机要与无线耳机进行连接.

2020-08-06 22:12:37 725

原创 Android 蓝牙开发(一) -- 传统蓝牙聊天室

项目工程BluetoothDemo一、蓝牙概览以下是蓝牙的介绍,来自维基百科:蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换数据,以形成个人局域网(PAN)。其使用短波特高頻(UHF)无线电波,经由2.4至2.485 GHz的ISM频段来进行通信[1]。1994年由电信商爱立信(Ericsson)发展出这个技术[2]。它最初的设计,是希望创建一个RS-232数据线的无线通信替代版本。它能够链接多个设备,克服同步的问题。简单来讲,就是蓝牙功能支持设备以

2020-08-06 17:18:26 486 5

原创 Android 10 扫描蓝牙失败问题

最近在开发蓝牙,发现在 Android 10 的设备上,只能扫描到已配对的设备,没匹配的设备,扫描不到,就广播没回调到;BLE 低功耗也扫描不到。根据官网,已经添加了:ACCESS_FINE_LOCATION 精准定位了还是不行,google 了一波,发现在https://github.com/E。ddyVerbruggen/nativescript-bluetooth/issues/173 找到答案开启gps后,就扫描到其他设备了,强制开启 gps 有点不优雅,可以添加个提示,让用户自己去开启

2020-07-30 10:55:17 553

原创 Android 音视频编解码(二) -- MediaCodec 解码(同步和异步)

音视频 系列文章Android 音视频开发基础Android 音视频编解码(一) – MediaCodec 初探音视频工程上面的文章中,已经对 MediaCodec 有个感性的认知,这一章,来学习 MediaCodec 的解码功能一、同步解码一般本地视频,我们可以通过同步解码来实现,因为视频播放,除了解码,根据 PTS 去根据视频的帧率来播放视频,不然如果解出来就显示,就那就是快进了。1.1 分析视频从 Android 音视频开发(五) – 使用 MediaExtractor 分离音视频.

2020-07-27 22:54:45 1353 3

原创 Android 音视频编解码(一) -- MediaCodec 初探

音视频 系列文章Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音);AudioTrack播放音频Android 音视频开发(二) – Camera1 实现预览、拍照功能Android 音视频开发(三) – Camera2 实现预览、拍照功能Android 音视频开发(四) – CameraX 实现预览、拍照功能Android 音视频开发(五) – 使用 MediaExtractor 分离音视频,并使用 MediaMuxer合成新视频(音视频同步)前面几章,我.

2020-07-24 14:47:21 1586

原创 实现一个可定制化的流布局 FlowLayout

本文已授权玉刚说公众号FlowLayout 继承于 ViewGroup ,可以快速帮您实现 Tablayout 以及 Label 标签,内含多种效果,帮您快速实现 APP UI 功能,让您专注代码架构,告别繁琐UI。如果你也想自己写一个,可以参考以下几篇文章实现一个可定制化的TabFlowLayout(一) – 测量与布局实现一个可定制化的TabFlowLayout(二) – 实现滚动和平滑过渡实现一个可定制化的TabFlowLayout(三) – 动态数据添加与常用接口封装实现一个可.

2020-07-14 17:37:14 340

原创 Android 音视频开发(五) -- 使用 MediaExtractor 分离音视频,并使用 MediaMuxer合成新视频(音视频同步)

音视频学习demo,正在升级打怪,加油鸭~Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音);AudioTrack播放音频Android 音视频开发(二) – Camera1 实现预览、拍照功能Android 音视频开发(三) – Camera2 实现预览、拍照功能Android 音视频开发(四) – CameraX 实现预览、拍照功能工程:音视频demo前几章,我们已经为音视频学习打下了一定的基础。这一章,我们来学习如何使用 MediaExtractor.

2020-07-14 17:30:40 758

原创 Android 音视频开发(四) -- CameraX 实现预览、拍照功能

音视频学习demo,正在升级打怪,加油鸭~Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音);AudioTrack播放音频Android 音视频开发(二) – Camera1 实现预览、拍照功能Android 音视频开发(三) – Camera2 实现预览、拍照功能一. Camerax 简介在前面两章中,我们已经学习了 Camera1 Android 音视频开发(二) – Camera1 实现预览、拍照功能 和 Camera2 Android 音视频开发(三).

2020-07-13 20:11:19 1490 2

原创 Android 音视频开发(三) -- Camera2 实现预览、拍照功能

音视频系列文章:Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音);AudioTrack播放音频Android 音视频开发(二) – Camera1 实现预览、拍照功能工程:VideoDemo上一章,已经我们已经用 Camera1 实现了预览和拍照的功能,但也说到,在API21的时候,Camera1已经被标注为弃用,因为它的API功能和灵活性满足不了现在日益复杂的相机开发了,所以在 API21之后,引入了 Camera2 ,参考:https://devel.

2020-07-13 10:34:22 972 1

原创 Android 音视频开发(二) -- Camera1 实现预览、拍照功能

音视频系列文章Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音);AudioTrack播放音频工程: 音视频DemoCamera1 在 API 21 的时候已经被弃用了,虽然现在google 都推荐 使用 Camerax 来实现相机的一些功能,但这不妨碍我们学习 Camera1 和 Camera2,对此有基础了解,为后续学习 Camera2 和 Camerax 做铺垫在这篇文章中,你将了解到:实现相机的开启与预览相机预览方向的矫正实现拍照工鞥,并矫正.

2020-07-10 23:09:53 761

原创 Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频

前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉。今天要完成的功能如下;使用AudioRecord 进行录音生成 wav 格式的音频,并进行播放使用 AudioTrack 播放 pcm 格式音频 (Stream 和 static 模式)由于声音不好上动图,只能来一张静图了,具体代码看工程:音视频学习Demo一、基础知识首先,我们先要了解声音是怎么被保存的起来的。在我们的世界中,声音是连续不断的,是一种模.

2020-07-09 15:36:11 1069 1

原创 Activity 之 Window 创建过程

上一章 Android理解 Window 与 WindowManager,我们已经学习了 Window - ViewRootImpl - View 之间的关系,也知道 Window 实际是通过 WindowManagerService 去创建的。那么 Activity 的 window 是怎么创建的呢?一. Activity 的创建流程简述首先,从 Activity启动流程 (基于8.0源码) 一文中,我们已经知道,Activity 的创建,最后会通过 ActivityThread 的 handleL

2020-07-04 23:54:53 66

原创 Android理解 Window 与 WindowManager

这个东西比较复杂,笔者能力有限,只能把自己理解说一下,如果有不对的地方,望指正。一 、 Window 介绍在我们日常开发中,Window 看似接触的不错,实际上,Android 中所有的视图都是通过 Window 来呈现的,不管是 Activity,Dialog、Taost 还是 PupopWindow ,它们的视图其实都是附加在 Window 上的。Window 是一个抽象类,它的具体类是 PhoneWindow,它的具体实现类位于 WindowManagerService中;每个 window

2020-07-04 07:53:38 160

原创 Glide 缓存机制解析(为啥使用弱引用)

目前图片框架,基本就是 Glide 一统江山了,除了极其简单的链式调用,里面丰富的 API 也让人爱不释手。那么,这样一个好用的框架,里面的缓存机制是怎么样的呢?我们知道,一般图片框架,加载图片,都是通过内存缓存 LruCache ,DiskLruCache 硬盘缓存中去拿,那 Glide 又是怎么样的呢?这里,我们一起来探讨一下;这里的 Glide 版本为 4.9.0Glide 的缓存可以分为两种,一种内存缓存,一种是硬盘缓存;其中内存缓存又包含 弱引用 和 LruCache ;而硬盘缓存

2020-06-30 10:16:34 1014

原创 Android 进程间通信(四) - Messenger 以及源码分析

在上几篇文章中,我们已经学习了Binder 这种通信模式,这章中,我们来学习 Messenger;Messenger可以翻译为信使,它可以在不同进程间传递 Message 对象。Messenger 是一种轻量的 IPC 防范,它的底层实现是 AIDL,后面我们会分析它的源码;一. 实现Messenger通信从上面可以知道,可以传递 Message,一些简单的数据,我们就可以通过这种方式去实现了。下面我们一起来实现它。今天的效果是,客户端发送两个数字,服务端返回两数之和:1.1. 服务端在服务端

2020-06-28 14:26:15 64

原创 Android 进程间通信(三) --通过 AIDL 理解Binder,并手写Binder服务

上一章,已经学习了 Binder 的通信原理,这里再通过 AIDL 了,再来捋一遍,并自己写个 Binder。如果你对 AIDL 不熟悉,可以参考这篇文章 AIDL使用详解及进程回调这里也是用上面的代码,首先是任务类 TaskInfo,需要继承 Parcelable 接口,让as 帮你实现方法即可,如下:public class TaskInfo implements Parcelable { public int id; public String url; public

2020-06-22 11:03:27 548

原创 Android 进程间通信(二) -- 理解 Binder 的机制

参考 写给 Android 应用工程师的 Binder 原理剖析 一些文字和图片均参考该文上一章中,已经理解了进程之间通信的一些基本知识,这一章来好好学习 Binder。一、为啥使用Binder我们知道,Android 底层使用了大量的 Binder 来进行进程之间的通信。那为啥要新设计个 Binder ,而不是用传统的IPC 通信方式呢?主要是考虑到以下几个方面:性能方面:Socket 作为通过接口,但传输效率低,开销大,且阻塞 IO,一般用于跨网络的进程间通信;而消息队列和管道,则采用.

2020-06-21 20:58:21 87

原创 Android 进程间通信(一) -- Android 多进程模式

参考Android艺术开发探索第二章一、IPC 简介IPC 为 Inter-Process Communication 的缩写,意思为 进程间通信或跨进程通信,是指两个进程之间的数据交换的过程。说起进程间的通信,首先要先认识进程和线程;按照操作系统中的描述,线程是 CPU 调度的最小单元,同时线程是一种悠闲的系统资源;而进程一般指一个执行单元,在Android 中指一个应用。一个进程可以只有一个线程,也可以包含多个线程;在Android中,主线程也叫UI线程,一些界面元素,都在该线程中操作,所.

2020-06-21 09:57:19 158

原创 Android studio4.0 Build Output 中文乱码问题

最近更新Android studio 4.0 ,发现了中文乱码的问题,具体如下:解决方法如下:双击shift ,输入 Edit Custom VM Options ,如下:点击第一个,如果没有回提示创建;然后输入:#不要有空格-Dfile.encoding=UTF-8注意!!!前面不要有空格,一定要记住,不然你的 studio 就打不开了。保存,重启即可...

2020-06-20 19:57:56 1296

原创 Android 换肤原理分析

当了解了一些知识,应该用文字记录它,再抽个时间再看它,永远记住它Android 换肤的理论知识和文章已经很多了,这里记录一下自己对这块的理解。本文效果如下:工程:一键换肤的快乐一、换肤的由来首先,为什么要换肤呢?那肯定是一套UI不满足需求,无法面对多变的需求,从而需要有可以自由去更换UI 的手段,而这也是换肤想要达到的目的。比如,一个imageview , 现在设置了一张图片,但是 618 来了, 我先更换成新的图片,怎么办?总不能让用户再更新一遍吧,虽然可以增量更新,但总不能每次都直接更新.

2020-06-20 08:54:14 463 1

原创 Android 线程池解析与复用原理

作为面试的常住嘉宾之一,线程池的拷问,估计每个面试官都想问一遍。下面,我们一起来学习一下。一、线程池首先,提到线程池就得说说它的好处,总得来说,可以分为以下三点:复用线程池的线程,避免线程创建和销毁带来的性能开销。控制线程池的最大并发数,避免大量线程之间抢占系统资源而导致的阻塞现象能够对线程进行简单的管理,并提供定时执行以及制定间隔循环执行等任务但需要注意的一点,如果只有一个线程,且不需要复用,则不需要用到线程池,没必要。我们都知道,Java的线程池共有4中,newFixedThread

2020-06-18 17:22:22 195

原创 Android 的消息机制(UI线程的Looper 为啥不会阻塞?答案在后面)

说道 Android 的消息机制,其实说的就是 Handler 的运行机制以及 Handler 所附带的 MessageQueue 和 Looper 的工程过程。一、 Handler 的运行机制当 Handler 创建的时候,会采用当前线程的 Looper 来构建消息循环系统,如果当前线程没有 Looper 则会报错,当然,开始是 UI 线程,所以不用担心。当然,当Looper 被创建的时候, MessageQueue 也被创建好了,这样 Looper 和 MessageQueue 就可以跟 Hand

2020-06-17 18:35:07 341

原创 初探Jetpack(四) -- ROOM 数据库

Android 虽然自身携带SQLite,但是操作比较麻烦,而且如果再大型项目,会变得比较混乱且难以维护,除非你设计了一套非常好的架构和封装。当然,如果要操作简单的话,郭老师的 Litepal 算不错的,不过我们今天学习 google 在 Jetpack 中带的组件 — ROOM ,今天一起来学习。一 、ROOM 的基本使用首先,ROOM 由 Entity ,Dao 和 Database 三个部分组成:Entity:用于定义iFeng准给实际数据的实体类,每个实体类都会在数据库中对应一张表,并且表

2020-06-16 11:14:54 144

原创 初探Jetpack(三) -- LiveData

初探Jetpack(一) – ViewModel初探Jetpack(二) – LifecyclesLiveData 是 Jetpack 提供的一种响应式变成组件,它可以包含任何类型的数据,并在数据发现变化的时候,通知观察者。LiveData 具有生命周期的感知能力,指它能感觉 activity,fragment ,service 的生命周期,且只有这些组件处于活跃生命周期状态时,LiveData 感觉到数据变化,才会发出通知。什么意思呢?即如果 activity ,fragment 等观察者处于.

2020-06-12 17:16:30 130

原创 初探Jetpack(二) -- Lifecycles

初探Jetpack(一) – ViewModel上一章,我们简单了解了 Jetpack 和 学习了 ViewModel 的基本使用,这章一起来学习一个 Lifecyclers.在我们的开发中,我们经常需要知道 activity 的生命周期,从而做一些资源释放或控制逻辑,一般的做法,也是大家常用的做法,就是给activity添加一个 隐形的 fragment,从而感知 activity 的生命周期变化,像 glide 就是这么做的。但Lifecycles 组件可以让任何一个类都能轻松感觉到 acti.

2020-06-12 15:57:02 83

原创 初探Jetpack(一) -- ViewModel

一、JetPack 简介以前在没有 Jetpack 的时候,大家项目中最常使用的就是 MVP 或者 MVVM 等设计模式来解耦逻辑和UI,当然这非常考验个人的设计能力和经验。Google 貌似也意识到了这个问题,在 2018推出了一个全新的架构组件库 – Jetpack。Jetpack 适合一个开发组件工具库,它的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发开发特点;Jetpack 它不依赖任何 Android 系统版本,它定义在 androidx 中,并拥有非常好的向下兼容。首先,看一

2020-06-11 21:37:36 337 1

原创 Android 探索增量升级

一、介绍Android 的增量升级,不同热修复和热更新,它只是通过和老的 apk 对比,识别出与新 apk 之间的二进制差异,从而生成的补丁包(差量包);这样的好处在于,不用全部下载所有的文件,比如一个游戏 1个多G,如果每次更新,都下载1个多G,相信这个游戏基本没人下,但是使用差量包,则需要几十或者几百兆,这样对用户来说,相对能接受些。通过这篇文章,你将看到:差量包的生成cmake 实现 bsdiff 升级接口的过程生成 so 工其他工程使用工程连接:https://github.com

2020-06-10 13:56:48 828 1

原创 cmake 逗号引发的错误

问题描述:The target name "vvw" is reserved or not valid for certain CMake features,逗号引发的问题,cmake 用空格区分的原代码:#导入第三方so包,并声明为 IMPORTED 属性,指明只是想把 so 导入到项目中add_library( vvw, SHARED, IMPORTED)去掉逗号:#导入第三方so包,并声明为 IMPORTED 属性,指明只是想把 so

2020-06-10 09:37:31 250

原创 Android studio Profiler 查看程序耗时逻辑

最近在做白板软件,用到比较多的自定义知识;先上一张简单的图:但是随着画笔的增多,在重绘的时候,耗时越来越久,最夸张达到800多ms,这肯定是不行,这种耗时的肯定就是程序写的不规范的问题了。这个时候就可以使用 Android studio 自带的 Profiler 去查看 cpu 使用率了。关于 Profiler 的具体介绍,可以查看中文官网:https://developer.android.google.cn/studio/profile/cpu-profiler点击 Profiler 的cp

2020-05-15 19:40:15 1211 1

原创 Android Studio3.5.1 创建kotlin工程慢和超时问题的一些坑

在 as 创建kotlin工程时,发现特别慢且超时,原因也理解,就是一些插件和配置需要翻墙。网上也有配置,但有几个点需要注意。当你新建工程,发现 gradle 实在慢,注意这个时候,不要改 gradle 配置后,立即重启,这样虽然能关掉后台进程,但第二次进来后,该了 gradle 也不会出现 try again 等选项了,却 run 这里,也是没有设备可选的。注意!不要restart,不要...

2020-04-29 07:03:50 354

原创 ViewPager2 入门学习

ViewPager2 从出来到现在已经有一段时间了,它修复了 ViewPager 常见的一些 bug,以及支持竖直方法和 RTL , 现在很多小伙伴已经开始使用上了。那么,学不懂也要学。一、使用首先,你的工程必须支持 androidx,我觉得新开的工程都可以使用 androidx了,一些主流的第三方库也都支持,而且 google 也说28以后,不再支持 support 库,当然这个看个人。...

2020-04-28 07:56:03 572 3

原创 Java 反射理解以及Android实战

学会使用 Java 的反射机制,能够让你在实际工作中,如虎添翼。一 什么是反射反射指支持程序在运行状态时,都能够获取该类的内部信息,包裹其中的方法,变量等信息,并可于运行时改变方法或者其内部变量。简单来说,如果某个系统源码中某个类,比如 Recyclerview 的 mFirst 变量,我想动态改变这个值,就可以使用 反射获取到这个值,并改变它。java 反射的几个主要的类如下:...

2020-04-06 21:16:42 99

原创 ScaleGestureDetector 在两指距离较短时,不能缩放

今天测试反馈缩放时,卡顿,没有缩放。一、问题分析调试了发现,当手指距离很短的时候scale = detector.getScaleFactor();scale 等于 1,基本不动,那肯定不会缩放了。去到 ScaleGestureDetector 的源码,如果要回到 public boolean onScale(ScaleGestureDetector detector) ,则它的条件如...

2020-04-03 17:22:16 452 6

android 静默安装与卸载,(包含正常安装与卸载)

android 静默安装与卸载,(包含正常安装与卸载) 博客地址:http://blog.csdn.net/u011418943/article/details/69568657

2017-04-07

mvp 升级库

详细看这篇文章 :http://blog.csdn.net/u011418943/article/details/70562580

2018-03-17

线程下载图片,并用lurcache缓存

线程下载图片,并用lurcache缓存

2016-11-02

自己发布到 jitpack 的Android 库没有注释

发表于 2018-05-26 最后回复 2019-02-16

HttpURLConnection的disconnect 耗时严重

发表于 2017-04-23 最后回复 2018-05-26

Android 中 AIDL 的实时通信

发表于 2017-03-18 最后回复 2017-04-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除