告訴你為什麼視頻廣告點不了關閉

語言: CN / TW / HK

theme: fancy

開啟掘金成長之旅!這是我參與「掘金日新計劃 · 2 月更文挑戰」的第 5 天,點擊查看活動詳情

前言

我們平時玩遊戲多多少少會碰到一些視頻廣告,看完後是能領取遊戲獎勵的,然後你會發現有時候看完點擊那個關閉按鈕,結果是跳下載,你理所當然的認為是點擊到了外邊,事實真的是這樣的嗎?有些東西不好那啥,你們懂的,所以以下內容純屬我個人猜測,純屬虛構

1. 整個廣告流程的各個角色

要想對廣告這東西有個大概的瞭解,你得先知道你看廣告的過程中都有哪些角色參與了進來。

簡單來説,是有三方參與了進來:\ (1)廣告提供商:顧名思義負責提供廣告,比如你看的廣告是一款遊戲的廣告,那這個遊戲的公司就是廣告的提供商。\ (2)當前應用:就是播放這個廣告的應用。\ (3)平台:播放廣告這個操作就是平台負責的,它負責連接上面兩方,從廣告提供商中拿到廣告,然後讓當前應用接入。

平台有很多,比如字節、騰訊都有相對應的廣告平台,或者一些小公司自己做廣告平台。他們之間的py交易是這樣的:所有廣告的功能是由平台去開發,然後他會提供一套sdk或者什麼的讓應用接入,應用你接入之後每播放1次廣告,平台就給你多少錢,但是播放的是什麼廣告,這個就是平台自己去下發。然後廣告提供商就找到平台,和他談商業合作,你幫我展示我家的產品的廣告多少次,我給你多少錢。 簡單來説他們之間的交易就是這樣。

簡單來説,就是廣告提供商想要影響力,其它兩方要錢,他們都希望廣告能更多的展示。

2. 廣告提供商的操作

廣告提供商是花錢讓平台推廣廣告的,那我肯定是希望儘量每次廣告的展示都有用户去點擊然後下載我們家的應用。

所以廣告提供商想出了一個很壞的辦法,相信大家都遇到過,就是我播放視頻,我在視頻的最後幾幀裏面的圖片的右上角放一個關閉圖片,誤導用户這個關閉圖片是點了之後能關閉的,其實它是視頻的一部分,所以你點了就相當於點了視頻,那就觸發跳轉下載應用這些操作。

破解的方法也很簡單,你等到計算結束後的幾秒再點關閉按鈕,不要一看到關閉按鈕的圖片出來馬上點。

3. 應用的操作

應用是很難在廣告播放的時候去做手腳,因為這部分的代碼不是他們寫的,他們只是去調用平台寫的代碼。

那他們想讓廣告儘可能多的展示,唯一能做的就是把展示廣告的地方增加,儘可能多的讓更多場景能展示廣告。當然這也有副作用,你要是這個應用點哪裏都是廣告,這不得把用户給搞吐了,砸了自己的口碑,如果只有一些地方有,用户還是能理解的,畢竟賺錢嘛,不寒參。

4. 平台的操作

平台的操作那就豐富了,代碼是我寫的,兄弟,我想怎麼玩就怎麼玩,我能有一百種方法算計你。

猜測的,注意,是猜測的[狗頭]

有的人説,故意把關閉按鈕設置小,讓我們誤觸關閉按鈕以外的區域。我只能説,你讓我來做,我都不屑於把關閉按鈕設置小。

我們都知道平時開發時,我們覺得點擊按鈕不靈,所以我們想擴大圖標的點擊區域,但是又不想改變圖標的大小,所以我們用padding來實現。同樣的,我也能做到不改變圖標的大小,然後縮小點擊的範圍

我寫一個自定義view(假設就是關閉圖標)

``` public class TestV extends View {

public TestV(Context context) {
    super(context);
}

public TestV(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TestV(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        int w = getMeasuredWidth();
        int h = getMeasuredHeight();
        Log.d("mmp", "============ view點擊");
        if (event.getX() < w / 4 || event.getX() > 3 * w / 4 || event.getY() < h / 4 || event.getY() > 3 * h / 4) {
            return super.dispatchTouchEvent(event);
        } else {
            Log.d("mmp", "============ view點擊觸發-》關閉");
            return true;
        }
    }
    return super.dispatchTouchEvent(event);
}

} ```

代碼很簡單就不過多講解,能看出我很簡單就實現讓點擊範圍縮小1/4。所以當你點到邊緣的時候,其實就相當於點到了廣告。

除了縮小範圍之外,我還能設置2秒前後點擊是不同的效果,你有沒有一種感覺,第一次點關閉按鈕就是跳到下載應用,然後返回再點擊就是關閉,所以你覺得是你第一次點擊的時候是誤觸了外邊。

``` public class TestV extends View {

private boolean canClose = true;

public TestV(Context context) {
    super(context);
}

public TestV(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public TestV(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public void setVisibility(int visibility) {
    super.setVisibility(visibility);
    if (visibility == View.VISIBLE) {
        canClose = false;
    }
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        int w = getMeasuredWidth();
        int h = getMeasuredHeight();
        Log.d("mmp", "============ view點擊");
        if (!canClose) {
            return super.dispatchTouchEvent(event);
        } else {
            Log.d("mmp", "============ view點擊觸發-》關閉");
            return true;
        }
    }
    return super.dispatchTouchEvent(event);
}

// 播放完成
public void playFinish() {
    setVisibility(VISIBLE);
    Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            canClose = true;
        }
    }, 2000);
}

} ```

播放完成之後調用playFinish方法,然後會把canClose這個狀態設置為false,2秒後再設為true。這樣你在2秒前點擊按鈕,其實就是點擊外部的效果,也就會跳去下載。

而且你注意,這些限制,我可以不寫死在代碼裏面,可以用後台返回,比如這個2000,我可以後台返回。我就能做到比如第一天我返回0,你覺得沒什麼問題,能正常點關閉,我判斷你是第二天,我直接返2000給你,然後你一想,之前都是正常的,那這次不正常,肯定是我點錯。

你以為的意外只不過是我想讓你以為是意外罷了。那這個如何去破解呢?我只能説無解,他能有100種方法讓你點中跳出去下載,那還能有是什麼解法?