当前位置:   article > 正文

Android实现自动点击 - 无障碍服务_android 自动点击

android 自动点击

ps: 不想看代码的滑到最下面有apk包百度网盘下载地址

1. 先看效果图 不然都是耍流氓

2.项目目录

 

3.一些配置

build.gradle

  1. plugins {
  2. id 'com.android.application'
  3. id 'kotlin-android'
  4. id 'kotlin-android-extensions'
  5. }
  6. android {
  7. compileSdkVersion 31
  8. buildToolsVersion "30.0.3"
  9. defaultConfig {
  10. applicationId "com.znan.autoclick"
  11. minSdkVersion 24
  12. targetSdkVersion 31
  13. versionCode 1
  14. versionName "1.0"
  15. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  16. }
  17. buildTypes {
  18. release {
  19. minifyEnabled false
  20. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  21. }
  22. }
  23. compileOptions {
  24. sourceCompatibility JavaVersion.VERSION_1_8
  25. targetCompatibility JavaVersion.VERSION_1_8
  26. }
  27. kotlinOptions {
  28. jvmTarget = '1.8'
  29. }
  30. }
  31. dependencies {
  32. implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  33. implementation 'androidx.core:core-ktx:1.3.2'
  34. implementation 'androidx.appcompat:appcompat:1.2.0'
  35. implementation 'com.google.android.material:material:1.3.0'
  36. implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
  37. testImplementation 'junit:junit:4.+'
  38. androidTestImplementation 'androidx.test.ext:junit:1.1.2'
  39. androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
  40. //协程
  41. implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
  42. implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
  43. }

accessibility.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:accessibilityEventTypes="typeAllMask"
  4. android:accessibilityFeedbackType="feedbackAllMask"
  5. android:canPerformGestures="true"
  6. android:canRetrieveWindowContent="true"
  7. android:description="@string/accessibility_desc" />

AndroidManifest.xml 注册权限和服务

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.znan.autoclick">
  4. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  5. <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
  6. <application
  7. android:allowBackup="true"
  8. android:icon="@mipmap/ic_launcher"
  9. android:label="@string/app_name"
  10. android:roundIcon="@mipmap/ic_launcher_round"
  11. android:supportsRtl="true"
  12. android:theme="@style/Theme.AutoClick">
  13. <activity android:name=".MainActivity">
  14. <intent-filter>
  15. <action android:name="android.intent.action.MAIN" />
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. <service android:name=".AutoClickService"
  20. android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
  21. <intent-filter>
  22. <action android:name="android.accessibilityservice.AccessibilityService" />
  23. </intent-filter>
  24. <meta-data
  25. android:name="android.accessibilityservice"
  26. android:resource="@xml/accessibility" />
  27. </service>
  28. </application>
  29. </manifest>

4.代码

AutoClickService.kt 无障碍服务

  1. class AutoClickService : AccessibilityService() {
  2. private val TAG = javaClass.canonicalName
  3. var mainScope: CoroutineScope? = null
  4. private val broadcastReceiver = BroadcastHandler(this)
  5. //点击间隔
  6. private var mInterval = -1L
  7. //点击坐标xy
  8. private var mPointX = -1f
  9. private var mPointY = -1f
  10. //悬浮窗视图
  11. private lateinit var mFloatingView: FloatingClickView
  12. companion object {
  13. //打开悬浮窗
  14. val ACTION_SHOW = "action_show"
  15. //自动点击事件 开启/关闭
  16. val ACTION_PLAY = "action_play"
  17. val ACTION_STOP = "action_stop"
  18. //关闭悬浮窗
  19. val ACTION_CLOSE = "action_close"
  20. }
  21. private inner class BroadcastHandler(val context: Context) : BroadcastReceiver() {
  22. fun register() {
  23. context.registerReceiver(
  24. this,
  25. IntentFilter().apply {
  26. addAction(BroadcastConstants.BROADCAST_ACTION_AUTO_CLICK)
  27. //息屏关闭自动点击事件
  28. addAction(Intent.ACTION_SCREEN_OFF)
  29. }
  30. )
  31. }
  32. fun unregister() {
  33. context.unregisterReceiver(this)
  34. }
  35. override fun onReceive(p0: Context?, intent: Intent?) {
  36. intent?.apply {
  37. when(action) {
  38. Intent.ACTION_SCREEN_OFF -> {
  39. mFloatingView.remove()
  40. mainScope?.cancel()
  41. }
  42. BroadcastConstants.BROADCAST_ACTION_AUTO_CLICK -> {
  43. when (getStringExtra(BroadcastConstants.KEY_ACTION)) {
  44. ACTION_SHOW -> {
  45. mFloatingView.remove()
  46. mainScope?.cancel()
  47. mInterval = getLongExtra(BroadcastConstants.KEY_INTERVAL, 5000)
  48. mFloatingView.show()
  49. }
  50. ACTION_PLAY -> {
  51. mPointX = getFloatExtra(BroadcastConstants.KEY_POINT_X, 0f)
  52. mPointY = getFloatExtra(BroadcastConstants.KEY_POINT_Y, 0f)
  53. mainScope = MainScope()
  54. autoClickView(mPointX, mPointY)
  55. }
  56. ACTION_STOP -> {
  57. mainScope?.cancel()
  58. }
  59. ACTION_CLOSE -> {
  60. mFloatingView.remove()
  61. mainScope?.cancel()
  62. }
  63. else -> {
  64. Log.e(TAG, "action error")
  65. }
  66. }
  67. }
  68. }
  69. }
  70. }
  71. }
  72. override fun onCreate() {
  73. super.onCreate()
  74. startForegroundNotification()
  75. mFloatingView = FloatingClickView(this)
  76. broadcastReceiver.register()
  77. }
  78. private fun startForegroundNotification() {
  79. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  80. val notificationBuilder =
  81. NotificationCompat.Builder(this, NotificationConstants.CHANNEL_ID)
  82. val notification = notificationBuilder.setOngoing(true)
  83. .setSmallIcon(R.mipmap.ic_launcher)
  84. .setCategory(Notification.CATEGORY_SERVICE)
  85. .build()
  86. startForeground(-1, notification)
  87. } else {
  88. startForeground(-1, Notification())
  89. }
  90. }
  91. @RequiresApi(Build.VERSION_CODES.N)
  92. private fun autoClickView(x: Float, y: Float) {
  93. mainScope?.launch {
  94. while (true) {
  95. delay(mInterval)
  96. Log.d(TAG, "auto click x:$x y:$y")
  97. val path = Path()
  98. path.moveTo(x, y)
  99. val gestureDescription = GestureDescription.Builder()
  100. .addStroke(GestureDescription.StrokeDescription(path, 100L, 100L))
  101. .build()
  102. dispatchGesture(
  103. gestureDescription,
  104. object : AccessibilityService.GestureResultCallback() {
  105. override fun onCompleted(gestureDescription: GestureDescription?) {
  106. super.onCompleted(gestureDescription)
  107. Log.d(TAG, "自动点击完成")
  108. }
  109. override fun onCancelled(gestureDescription: GestureDescription?) {
  110. super.onCancelled(gestureDescription)
  111. Log.d(TAG, "自动点击取消")
  112. }
  113. },
  114. null
  115. )
  116. }
  117. }
  118. }
  119. override fun onInterrupt() {
  120. }
  121. override fun onAccessibilityEvent(event: AccessibilityEvent?) {
  122. }
  123. override fun onDestroy() {
  124. super.onDestroy()
  125. broadcastReceiver.unregister()
  126. mainScope?.cancel()
  127. }
  128. }

悬浮窗

SingletonHolder.kt

  1. open class SingletonHolder<out T, in A>(creator: (A) -> T) {
  2. private var creator: ((A) -> T)? = creator
  3. @Volatile private var instance: T? = null
  4. fun getInstance(arg: A): T {
  5. val i = instance
  6. if (i != null) {
  7. return i
  8. }
  9. return synchronized(this) {
  10. val i2 = instance
  11. if (i2 != null) {
  12. i2
  13. } else {
  14. val created = creator!!(arg)
  15. instance = created
  16. creator = null
  17. created
  18. }
  19. }
  20. }
  21. }

FloatingManager.kt

  1. import android.content.Context
  2. import android.view.View
  3. import android.view.WindowManager
  4. class FloatingManager private constructor(context: Context) {
  5. //获得WindowManager对象
  6. private var mWindowManager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
  7. companion object : SingletonHolder<FloatingManager, Context>(::FloatingManager)
  8. /**
  9. * 添加悬浮窗
  10. * @param view
  11. * @param params
  12. * @return
  13. */
  14. fun addView(view: View, params: WindowManager.LayoutParams): Boolean {
  15. try {
  16. mWindowManager.addView(view, params)
  17. return true
  18. } catch (e: Exception) {
  19. e.printStackTrace()
  20. }
  21. return false
  22. }
  23. /**
  24. * 移除悬浮窗
  25. *
  26. * @param view
  27. * @return
  28. */
  29. fun removeView(view: View): Boolean {
  30. try {
  31. mWindowManager.removeView(view)
  32. return true
  33. } catch (e: Exception) {
  34. e.printStackTrace()
  35. }
  36. return false
  37. }
  38. /**
  39. * 更新悬浮窗参数
  40. *
  41. * @param view
  42. * @param params
  43. * @return
  44. */
  45. fun updateView(view: View, params: WindowManager.LayoutParams): Boolean {
  46. try {
  47. mWindowManager.updateViewLayout(view, params)
  48. return true
  49. } catch (e: Exception) {
  50. e.printStackTrace()
  51. }
  52. return false
  53. }
  54. }

FloatingClickView.kt

  1. class FloatingClickView(private val mContext: Context) : FrameLayout(mContext) {
  2. private lateinit var mWindowManager: FloatingManager
  3. private var mParams: WindowManager.LayoutParams? = null
  4. private lateinit var mView: View
  5. //按下坐标
  6. private var mTouchStartX = -1f
  7. private var mTouchStartY = -1f
  8. val STATE_CLICKING = "state_clicking"
  9. val STATE_NORMAL = "state_normal"
  10. private var mCurrentState = STATE_NORMAL
  11. private var ivIcon: AppCompatImageView? = null
  12. init {
  13. initView()
  14. }
  15. private fun initView() {
  16. mView = LayoutInflater.from(context).inflate(R.layout.view_floating_click, null)
  17. ivIcon = mView.findViewById(R.id.iv_icon)
  18. mWindowManager = FloatingManager.getInstance(mContext)
  19. initListener()
  20. }
  21. @SuppressLint("ClickableViewAccessibility")
  22. private fun initListener() {
  23. mView.setOnTouchListener { v, event ->
  24. when (event.action) {
  25. MotionEvent.ACTION_DOWN -> {
  26. mTouchStartX = event.rawX
  27. mTouchStartY = event.rawY
  28. }
  29. MotionEvent.ACTION_MOVE -> {
  30. mParams?.let {
  31. it.x += (event.rawX - mTouchStartX).toInt()
  32. it.y += (event.rawY - mTouchStartY).toInt()
  33. mWindowManager.updateView(mView, it)
  34. }
  35. mTouchStartX = event.rawX
  36. mTouchStartY = event.rawY
  37. }
  38. }
  39. false
  40. }
  41. mView.setOnClickListener {
  42. val location = IntArray(2)
  43. it.getLocationOnScreen(location)
  44. val intent = Intent().apply {
  45. action = BroadcastConstants.BROADCAST_ACTION_AUTO_CLICK
  46. when (mCurrentState) {
  47. STATE_NORMAL -> {
  48. mCurrentState = STATE_CLICKING
  49. putExtra(BroadcastConstants.KEY_ACTION, AutoClickService.ACTION_PLAY)
  50. putExtra(BroadcastConstants.KEY_POINT_X, (location[0] - 1).toFloat())
  51. putExtra(BroadcastConstants.KEY_POINT_Y, (location[1] - 1).toFloat())
  52. ivIcon?.setImageResource(R.drawable.ic_auto_click_icon_green_24)
  53. }
  54. STATE_CLICKING -> {
  55. mCurrentState = STATE_NORMAL
  56. putExtra(BroadcastConstants.KEY_ACTION, AutoClickService.ACTION_STOP)
  57. ivIcon?.setImageResource(R.drawable.ic_auto_click_icon_gray_24)
  58. }
  59. }
  60. }
  61. context.sendBroadcast(intent)
  62. }
  63. }
  64. fun show() {
  65. mParams = WindowManager.LayoutParams()
  66. mParams?.apply {
  67. gravity = Gravity.CENTER
  68. //总是出现在应用程序窗口之上
  69. type = if (Build.VERSION.SDK_INT >= 26) {
  70. WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
  71. } else {
  72. WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
  73. }
  74. //设置图片格式,效果为背景透明
  75. format = PixelFormat.RGBA_8888
  76. flags =
  77. WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
  78. WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR or
  79. WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
  80. width = LayoutParams.WRAP_CONTENT
  81. height = LayoutParams.WRAP_CONTENT
  82. if (mView.isAttachedToWindow) {
  83. mWindowManager.removeView(mView)
  84. }
  85. mWindowManager.addView(mView, this)
  86. }
  87. }
  88. fun remove() {
  89. mCurrentState = STATE_NORMAL
  90. ivIcon?.setImageResource(R.drawable.ic_auto_click_icon_gray_24)
  91. mWindowManager.removeView(mView)
  92. }
  93. }

页面事件

MainActivity.kt

  1. class MainActivity : AppCompatActivity() {
  2. private val TAG = javaClass::class.java.canonicalName
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. setContentView(R.layout.activity_main)
  6. initNotification()
  7. initListener()
  8. startAutoClickService()
  9. }
  10. private fun initListener() {
  11. btn_accessibility.setOnClickListener {
  12. checkAccessibility()
  13. }
  14. btn_floating_window.setOnClickListener {
  15. checkFloatingWindow()
  16. }
  17. btn_show_window.setOnClickListener {
  18. hideKeyboard()
  19. if (TextUtils.isEmpty(et_interval.text.toString())) {
  20. Snackbar.make(et_interval, "请输入间隔", Snackbar.LENGTH_SHORT).show()
  21. return@setOnClickListener
  22. }
  23. showFloatingWindow(et_interval.text.toString().toLong())
  24. }
  25. btn_close_window.setOnClickListener {
  26. closeFloatWindow()
  27. }
  28. btn_test.setOnClickListener {
  29. Log.d(TAG, "btn_test on click")
  30. }
  31. }
  32. /**
  33. * 跳转设置开启无障碍
  34. */
  35. private fun checkAccessibility() {
  36. val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
  37. startActivity(intent)
  38. }
  39. /**
  40. * 跳转设置顶层悬浮窗
  41. */
  42. private fun checkFloatingWindow() {
  43. if (Build.VERSION.SDK_INT >= 23) {
  44. if (Settings.canDrawOverlays(this)) {
  45. Toast.makeText(this, "已开启", Toast.LENGTH_SHORT).show()
  46. } else {
  47. val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
  48. startActivity(intent)
  49. }
  50. }
  51. }
  52. private fun startAutoClickService() {
  53. val intent = Intent(this, AutoClickService::class.java)
  54. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  55. startForegroundService(intent)
  56. } else {
  57. startService(intent)
  58. }
  59. }
  60. private fun showFloatingWindow(interval: Long) {
  61. sendBroadcast(Intent().apply {
  62. action = BroadcastConstants.BROADCAST_ACTION_AUTO_CLICK
  63. putExtra(BroadcastConstants.KEY_ACTION, AutoClickService.ACTION_SHOW)
  64. putExtra(BroadcastConstants.KEY_INTERVAL, interval)
  65. })
  66. }
  67. private fun closeFloatWindow() {
  68. sendBroadcast(Intent().apply {
  69. action = BroadcastConstants.BROADCAST_ACTION_AUTO_CLICK
  70. putExtra(BroadcastConstants.KEY_ACTION, AutoClickService.ACTION_CLOSE)
  71. })
  72. }
  73. private fun initNotification() {
  74. //注册渠道id
  75. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  76. val name = NotificationConstants.CHANNEl_NAME
  77. val descriptionText = NotificationConstants.CHANNEL_DES
  78. val importance = NotificationManager.IMPORTANCE_DEFAULT
  79. val channel =
  80. NotificationChannel(NotificationConstants.CHANNEL_ID, name, importance).apply {
  81. description = descriptionText
  82. }
  83. channel.enableLights(true)
  84. channel.lightColor = Color.GREEN
  85. // Register the channel with the system
  86. val notificationManager: NotificationManager =
  87. getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  88. notificationManager.createNotificationChannel(channel)
  89. }
  90. }
  91. override fun onDestroy() {
  92. val intent = Intent(this, AutoClickService::class.java)
  93. stopService(intent)
  94. super.onDestroy()
  95. }
  96. //收起输入法
  97. fun hideKeyboard() {
  98. val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  99. if (imm.isActive && currentFocus != null) {
  100. imm.hideSoftInputFromWindow(
  101. currentFocus!!.windowToken,
  102. InputMethodManager.HIDE_NOT_ALWAYS
  103. )
  104. }
  105. }
  106. }
  1. object NotificationConstants {
  2. val CHANNEL_ID = "auto_channel_id"
  3. val CHANNEl_NAME = "Auto Click"
  4. val CHANNEL_DES = "Auto Click Service"
  5. }
  6. object BroadcastConstants {
  7. val BROADCAST_ACTION_AUTO_CLICK = "BROADCAST_ACTION_AUTO_CLICK"
  8. val KEY_ACTION = "KEY_ACTION"
  9. val KEY_INTERVAL = "KEY_INTERVAL"
  10. val KEY_POINT_X = "KEY_POINT_X"
  11. val KEY_POINT_Y = "KEY_POINT_Y"
  12. }

5.布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <androidx.appcompat.widget.AppCompatTextView
  7. android:id="@+id/tv_message"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_marginStart="50dp"
  11. android:layout_marginTop="20dp"
  12. android:text="先打开无障碍权限 和 悬浮窗顶层权限\n点击位置在图标左上角xy偏移一个px\n程序将会在延迟一个间隔后开始执行"
  13. app:layout_constraintStart_toStartOf="parent"
  14. app:layout_constraintTop_toTopOf="parent" />
  15. <com.google.android.material.button.MaterialButton
  16. android:id="@+id/btn_accessibility"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_marginStart="50dp"
  20. android:layout_marginTop="20dp"
  21. android:text="无障碍选项"
  22. app:layout_constraintStart_toStartOf="parent"
  23. app:layout_constraintTop_toBottomOf="@id/tv_message" />
  24. <com.google.android.material.button.MaterialButton
  25. android:id="@+id/btn_floating_window"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_marginStart="20dp"
  29. android:text="悬浮窗选项"
  30. app:layout_constraintStart_toEndOf="@id/btn_accessibility"
  31. app:layout_constraintTop_toTopOf="@id/btn_accessibility" />
  32. <androidx.appcompat.widget.AppCompatTextView
  33. android:id="@+id/tv_unit"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:layout_marginEnd="50dp"
  37. android:text="ms"
  38. android:textSize="24sp"
  39. app:layout_constraintBottom_toBottomOf="@id/et_interval"
  40. app:layout_constraintEnd_toEndOf="parent"
  41. app:layout_constraintTop_toTopOf="@id/et_interval" />
  42. <androidx.appcompat.widget.AppCompatEditText
  43. android:id="@+id/et_interval"
  44. android:layout_width="0dp"
  45. android:layout_height="48dp"
  46. android:layout_marginStart="50dp"
  47. android:layout_marginTop="50dp"
  48. android:layout_marginEnd="10dp"
  49. android:hint="点击的间隔(建议大于100)(毫秒)"
  50. android:inputType="number"
  51. android:textColor="#FF0000"
  52. android:textSize="14sp"
  53. app:layout_constraintEnd_toStartOf="@id/tv_unit"
  54. app:layout_constraintStart_toStartOf="parent"
  55. app:layout_constraintTop_toBottomOf="@id/btn_accessibility" />
  56. <com.google.android.material.button.MaterialButton
  57. android:id="@+id/btn_show_window"
  58. android:layout_width="wrap_content"
  59. android:layout_height="wrap_content"
  60. android:layout_marginTop="50dp"
  61. android:text="打开悬浮视图"
  62. app:layout_constraintEnd_toEndOf="parent"
  63. app:layout_constraintStart_toStartOf="parent"
  64. app:layout_constraintTop_toBottomOf="@id/et_interval" />
  65. <com.google.android.material.button.MaterialButton
  66. android:id="@+id/btn_close_window"
  67. android:layout_width="wrap_content"
  68. android:layout_height="wrap_content"
  69. android:layout_marginTop="10dp"
  70. android:text="关闭悬浮视图"
  71. app:layout_constraintEnd_toEndOf="parent"
  72. app:layout_constraintStart_toStartOf="parent"
  73. app:layout_constraintTop_toBottomOf="@id/btn_show_window" />
  74. <com.google.android.material.button.MaterialButton
  75. android:id="@+id/btn_test"
  76. android:layout_width="wrap_content"
  77. android:layout_height="wrap_content"
  78. android:layout_marginBottom="100dp"
  79. android:text="测试点击按钮"
  80. app:layout_constraintBottom_toBottomOf="parent"
  81. app:layout_constraintEnd_toEndOf="parent"
  82. app:layout_constraintStart_toStartOf="parent" />
  83. </androidx.constraintlayout.widget.ConstraintLayout>
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content">
  5. <androidx.appcompat.widget.AppCompatImageView
  6. android:id="@+id/iv_icon"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:src="@drawable/ic_auto_click_icon_gray_24" />
  10. </FrameLayout>

6.app-auto-click.zip

百度网盘

 提取码: 6p2u 

 告辞~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/310964?site
推荐阅读
相关标签
  

闽ICP备14008679号