1. 程式人生 > >Android許可權彈窗影響錄音動畫解決辦法

Android許可權彈窗影響錄音動畫解決辦法

開發中遇到這樣一個問題。在使用者按住錄音按鈕開始錄音時,有些許可權控制比較嚴格的手機,測試時發現裝了360或者其他安全軟體的時候。使用錄音時就會彈出許可權確認框。但此時由於OnTouch事件已經觸發,錄音的動畫已經執行,在確認完許可權手指離開後,動畫仍然在執行。程式並沒有執行Up的操作。

後經過測試發現,在使用者按下錄音按鈕後在ACTION—DWON中的錄音操作觸發許可權彈窗,此時OnTouch被強行中止,但是並沒有被消費。在使用者操作完許可權彈窗後繼續執行了ACTION—MOVE,ACTION—CANCEL。並沒有執行ACTION—UP。因此寫在UP中取消動畫的操作沒有執行。導致手指離開後動畫仍然在繼續。

但是後來發現一個比較奇怪的現象。並不是每次許可權彈窗結束後都會跳轉到ACTION-CANCEL中。在使用者操作較快時會執行DOWN ,MOVE,UP,在操作較慢時最後會執行CANCEL。目前仍不清楚發生這種情況的原因是什麼,如果知道的可以留言告知。

最終的解決方案如下:

@Override
public boolean onTouch(View v, MotionEvent event) {
    float y = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            scrollView.setCanScrollable(false);
            layoutAudioPrepare.setSelected(true);
            txtAudioPrepare.setText("鬆開結束");
            popWinAudio.setStatus(true);
            popWinAudio.checkAndShowStartRecording(layoutUploadContentContainer,//在此方法中執行的錄音操作
                    Gravity.CENTER, 0, 0);
            initY = y;
            //如果出現彈框,程式會卡在checkAndShowStartRecording方法
            // 在彈框操作結束後記錄時間
            firstTime = System.currentTimeMillis();

            break;
        case MotionEvent.ACTION_MOVE:
            layoutAudioPrepare.setSelected(true);
            if (initY - y > 100) {
                txtAudioPrepare.setText("鬆開刪除");
                popWinAudio.setStatus(false);
            } else {
                txtAudioPrepare.setText("鬆開結束");
                popWinAudio.setStatus(true);
            }
            break;
        case MotionEvent.ACTION_UP:

            long lastTime = System.currentTimeMillis();

            //當出現彈框時,三個方法幾乎同時進行。時間差極小,一般在10ms內
            if (lastTime - firstTime< 500) {//正常錄音少於500ms時也不記錄
                scrollView.setCanScrollable(true);
                layoutAudioPrepare.setSelected(false);
                popWinAudio.setStatus(false);
                txtAudioPrepare.setText("按住錄音");
                popWinAudio.finishRecording();
                layoutAudioFinish.setVisibility(View.GONE);
                layoutAudioPrepare.setVisibility(View.VISIBLE);
                absoluteFilepath = null;
            } else {
                scrollView.setCanScrollable(true);
                layoutAudioPrepare.setSelected(false);
                txtAudioPrepare.setText("按住錄音");
                popWinAudio.finishRecording();
            }

            break;
        case MotionEvent.ACTION_CANCEL://彈出許可權框結束,進入此方法,結束錄音。
            scrollView.setCanScrollable(true);
            layoutAudioPrepare.setSelected(false);
            popWinAudio.setStatus(false);
            txtAudioPrepare.setText("按住錄音");
            popWinAudio.finishRecording();
            layoutAudioFinish.setVisibility(View.GONE);
            layoutAudioPrepare.setVisibility(View.VISIBLE);
            absoluteFilepath = null;

            break;
    }
    return true;
}