返回列表 发新帖

[求助问答] 来smali巨佬

[复制链接]

16

主题

302

回帖

1255

积分

高中生

Rank: 4

金币
626
好评
0
信誉
96
发表在  2025-10-13 22:07:29 来自手机  | 显示全部楼层 | 阅读模式  来自 浙江
.method public static showBall()V
    .registers 6
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()V"
        }
    .end annotation

    sget-object v0, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;

    if-nez v0, :cond_62

    sget-object v0, Lcom/grass/mh/StartFw;->ctx:Landroid/content/Context;

    invoke-static {v0}, Landroid/provider/Settings;->canDrawOverlays(Landroid/content/Context;)Z

    move-result v1

    if-eqz v1, :cond_61

    sget-object v0, Lcom/grass/mh/StartFw;->ctx:Landroid/content/Context;

    const-string v1, "window"

    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Landroid/view/WindowManager;

    invoke-static {v0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;

    move-result-object v2

    const v3, 0x7f0c0499

    const/4 v4, 0x0

    invoke-virtual {v2, v3, v4}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;

    move-result-object v2

    sput-object v2, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;

    new-instance v3, Landroid/view/WindowManager$LayoutParams;

    invoke-direct {v3}, Landroid/view/WindowManager$LayoutParams;-><init>()V

    const v4, 0x7d6

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->type:I

    const v4, 0x365

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->flags:I

    const v4, -0x1

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->width:I

    const v4, -0x2

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->height:I

    const v4, 0x8

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->format:I

    const/4 v4, 0x0

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->x:I

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->y:I

    const v4, 0x320

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->width:I

    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->height:I

    invoke-interface {v1, v2, v3}, Landroid/view/WindowManager;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V

    new-instance v4, Lcom/grass/mh/BallClickListener;

    invoke-direct {v4}, Lcom/grass/mh/BallClickListener;-><init>()V

    invoke-virtual {v2, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    new-instance v4, Lcom/grass/mh/BallTouchListener;

    invoke-direct {v4, v3, v1, v2}, Lcom/grass/mh/BallTouchListener;-><init>(Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager;Landroid/view/View;)V

    invoke-virtual {v2, v4}, Landroid/view/View;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V

    :cond_61
    return-void

    :cond_62
    return-void
.end method


就是悬浮窗和悬浮球的切换,点按钮切悬浮球直接崩溃,其他正常,怎么改改
回复

使用道具 举报

429

主题

2254

回帖

9055

积分

硕士生

lin

Rank: 6Rank: 6

金币
1535
好评
9
信誉
105

MT论坛帅哥考神MT论坛新人MT论坛最佳新人MT论坛灌水老大

QQ
发表于 2025-10-13 22:14:58 来自手机  | 显示全部楼层  来自 黑龙江
.method public static showBall()V
    .registers 7
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "()V"
        }
    .end annotation

    .prologue
    sget-object v0, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;
    if-eqz v0, :cond_8  # 如果已经存在,直接返回
    return-void

    :cond_8
    sget-object v0, Lcom/grass/mh/StartFw;->ctx:Landroid/content/Context;
    if-nez v0, :cond_d  # 检查上下文是否为空
    return-void

    :cond_d
    # 检查悬浮窗权限
    invoke-static {v0}, Landroid/provider/Settings;->canDrawOverlays(Landroid/content/Context;)Z
    move-result v1
    if-nez v1, :cond_1a
   
    # 权限检查失败,可以在这里添加权限请求或提示
    const-string v1, "需要悬浮窗权限"
    invoke-static {v0, v1}, Lcom/grass/mh/ToastUtil;->show(Landroid/content/Context;Ljava/lang/String;)V
    return-void

    :cond_1a
    # 获取WindowManager
    const-string v1, "window"
    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
    move-result-object v1
    check-cast v1, Landroid/view/WindowManager;
   
    if-nez v1, :cond_25  # 检查WindowManager是否获取成功
    return-void

    :cond_25
    # 加载布局
    invoke-static {v0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
    move-result-object v2
   
    const v3, 0x7f0c0499  # 确保这个布局ID正确
    const/4 v4, 0x0
    invoke-virtual {v2, v3, v4}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
    move-result-object v2
   
    if-nez v2, :cond_34  # 检查布局是否加载成功
    return-void

    :cond_34
    sput-object v2, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;
   
    # 创建布局参数
    new-instance v3, Landroid/view/WindowManager$LayoutParams;
    invoke-direct {v3}, Landroid/view/WindowManager$LayoutParams;-><init>()V
   
    # 根据Android版本设置type
    sget v4, Landroid/os/Build$VERSION;->SDK_INT:I
    const/16 v5, 0x1a
    if-lt v4, v5, :cond_47
    const/16 v4, 0x7f6  # TYPE_APPLICATION_OVERLAY
    :goto_42
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->type:I
   
    # 设置flags - 更安全的标志
    const v4, 0x328  # NOT_FOCUSABLE | NOT_TOUCH_MODAL
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->flags:I
   
    # 设置格式
    const/4 v4, -0x3  # PixelFormat.TRANSLUCENT
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->format:I
   
    # 设置位置和大小
    const/4 v4, 0x0
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->x:I
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->y:I
   
    const/16 v4, 0x50  # 80dp
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->width:I
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->height:I
   
    # 设置gravity
    const/16 v4, 0x33  # START | TOP
    iput v4, v3, Landroid/view/WindowManager$LayoutParams;->gravity:I
   
    # 添加视图
    :try_start_5c
    invoke-interface {v1, v2, v3}, Landroid/view/WindowManager;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
    :try_end_5f
    .catch Ljava/lang/Exception; {:try_start_5c .. :try_end_5f} :catch_6a
   
    # 设置点击监听
    new-instance v4, Lcom/grass/mh/BallClickListener;
    invoke-direct {v4}, Lcom/grass/mh/BallClickListener;-><init>()V
    invoke-virtual {v2, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
   
    # 设置触摸监听
    new-instance v4, Lcom/grass/mh/BallTouchListener;
    invoke-direct {v4, v3, v1, v2}, Lcom/grass/mh/BallTouchListener;-><init>(Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager;Landroid/view/View;)V
    invoke-virtual {v2, v4}, Landroid/view/View;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V
   
    return-void

    :cond_47
    const/16 v4, 0x7d2  # TYPE_PHONE
    goto :goto_42

    :catch_6a
    move-exception v4
    # 处理异常,比如清除view引用
    const/4 v5, 0x0
    sput-object v5, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;
   
    # 可以记录日志或提示用户
    const-string v5, "添加悬浮窗失败"
    invoke-static {v0, v5}, Lcom/grass/mh/ToastUtil;->show(Landroid/content/Context;Ljava/lang/String;)V
   
    return-void
.end method

ai太好用了 你知道吗
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表