Android許可權彈窗影響錄音動畫解決辦法
阿新 • • 發佈:2019-01-23
開發中遇到這樣一個問題。在使用者按住錄音按鈕開始錄音時,有些許可權控制比較嚴格的手機,測試時發現裝了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; }