From 02d805ebc41ec40ab85e620940cdd5c210114317 Mon Sep 17 00:00:00 2001 From: liujing Date: Tue, 20 Oct 2020 20:52:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=80=81=E7=89=88?= =?UTF-8?q?=E6=9C=AC-=E6=9A=82=E6=97=B6=E4=B8=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/v2x/view/TextureVideoView.java | 919 +++++++----------- 1 file changed, 342 insertions(+), 577 deletions(-) diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/TextureVideoView.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/TextureVideoView.java index 25d6690a3c..b628bcd25f 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/TextureVideoView.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/TextureVideoView.java @@ -1,3 +1,5 @@ +package com.mogo.module.v2x.view; + /* * Copyright (C) 2006 The Android Open Source Project * @@ -14,245 +16,129 @@ * limitations under the License. */ -package com.mogo.module.v2x.view; - -import android.app.AlertDialog; +import android.annotation.SuppressLint; import android.content.Context; -import android.content.DialogInterface; -import android.content.res.Resources; +import android.graphics.Color; import android.graphics.SurfaceTexture; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; -import android.media.MediaPlayer.OnInfoListener; +import android.media.MediaPlayer.OnSeekCompleteListener; import android.net.Uri; -import android.opengl.GLES20; -import android.os.Build; import android.util.AttributeSet; -import android.util.Log; -import android.view.KeyEvent; -import android.view.MotionEvent; import android.view.Surface; import android.view.TextureView; -import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; -import android.widget.MediaController; import android.widget.MediaController.MediaPlayerControl; +import com.mogo.module.v2x.R; +import com.mogo.module.v2x.V2XConst; +import com.mogo.utils.logger.Logger; + import java.io.IOException; import java.util.Map; -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; -import javax.microedition.khronos.egl.EGLSurface; +import static com.mogo.module.v2x.V2XConst.MODULE_NAME; /** - * Displays a video file. The TextureVideoView class - * can load images from various sources (such as resources or content - * providers), takes care of computing its measurement from the video so that - * it can be used in any layout manager, and provides various display options - * such as scaling and tinting.

- * - * Note: VideoView does not retain its full state when going into the - * background. In particular, it does not restore the current play state, - * play position or selected tracks. Applications should - * save and restore these on their own in - * {@link android.app.Activity#onSaveInstanceState} and - * {@link android.app.Activity#onRestoreInstanceState}.

- * Also note that the audio session id (from {@link #getAudioSessionId}) may - * change from its previously returned value when the VideoView is restored.

- * - * This code is based on the official Android sources for 7.1.1_r13 with the following differences: - *

    - *
  1. extends {@link TextureView} instead of a {@link android.view.SurfaceView} - * allowing proper view animations
  2. - *
  3. removes code that uses hidden APIs and thus is not available (e.g. subtitle support)
  4. - *
  5. various small fixes and improvements
  6. - *
+ * Displays a video file. The VideoView class can load images from various + * sources (such as resources or content providers), takes care of computing its + * measurement from the video so that it can be used in any layout manager, and + * provides various display options such as scaling and tinting. */ -public class TextureVideoView extends TextureView - implements MediaPlayerControl { - private static final String TAG = "TextureVideoView"; - - // all possible internal states - private static final int STATE_ERROR = -1; - private static final int STATE_IDLE = 0; - private static final int STATE_PREPARING = 1; - private static final int STATE_PREPARED = 2; - private static final int STATE_PLAYING = 3; - private static final int STATE_PAUSED = 4; - private static final int STATE_PLAYBACK_COMPLETED = 5; - +public class TextureVideoView extends TextureView implements MediaPlayerControl { + private String TAG = "V2XModuleProvider"; // settable by the client private Uri mUri; private Map mHeaders; + private int mDuration; - // mCurrentState is a TextureVideoView object's current state. - // mTargetState is the state that a method caller intends to reach. - // For instance, regardless the TextureVideoView object's current state, - // calling pause() intends to bring the object to a target state - // of STATE_PAUSED. - private int mCurrentState = STATE_IDLE; - private int mTargetState = STATE_IDLE; + // all possible internal states + private int mCurrentState = V2XConst.STATE_IDLE; + private int mTargetState = mCurrentState, mTagetStateBackup = mCurrentState; + private int mPrepareState = V2XConst.STATE_PREPARED; // All the stuff we need for playing and showing a video private Surface mSurface = null; private MediaPlayer mMediaPlayer = null; - private int mAudioSession; - private int mVideoWidth; - private int mVideoHeight; - private MediaController mMediaController; + private int mVideoWidth, mVideoHeight; + private OnCompletionListener mOnCompletionListener; private MediaPlayer.OnPreparedListener mOnPreparedListener; private int mCurrentBufferPercentage; private OnErrorListener mOnErrorListener; - private OnInfoListener mOnInfoListener; - private int mSeekWhenPrepared; // recording the seek position while preparing - private boolean mCanPause; - private boolean mCanSeekBack; - private boolean mCanSeekForward; - private boolean mShouldRequestAudioFocus = true; + private MediaPlayer.OnInfoListener mOnInfoListener; + private int mSeekWhenPrepared; + private boolean isFocusLoss = true; + private boolean isSuspendFromActivity = false; + private int progressWhileSuspend = 0; + public static final int MEDIA_INFO_VIDEO_NOT_SUPPORTED = 860; + public static final int MEDIA_INFO_AUDIO_NOT_SUPPORTED = 862; public TextureVideoView(Context context) { - this(context, null); + super(context); + initVideoView(); } public TextureVideoView(Context context, AttributeSet attrs) { - this(context, attrs, 0); + super(context, attrs, 0); + initVideoView(); } public TextureVideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - - mVideoWidth = 0; - mVideoHeight = 0; - - setSurfaceTextureListener(mSurfaceTextureListener); - - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - - mCurrentState = STATE_IDLE; - mTargetState = STATE_IDLE; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - //Log.i("@@@@", "onMeasure(" + MeasureSpec.toString(widthMeasureSpec) + ", " - // + MeasureSpec.toString(heightMeasureSpec) + ")"); - - int width = getDefaultSize(mVideoWidth, widthMeasureSpec); - int height = getDefaultSize(mVideoHeight, heightMeasureSpec); - if (mVideoWidth > 0 && mVideoHeight > 0) { - - int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); - int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); - int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); - int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); - - if (widthSpecMode == MeasureSpec.EXACTLY && heightSpecMode == MeasureSpec.EXACTLY) { - // the size is fixed - width = widthSpecSize; - height = heightSpecSize; - - // for compatibility, we adjust size based on aspect ratio - if ( mVideoWidth * height < width * mVideoHeight ) { - //Log.i("@@@", "image too wide, correcting"); - width = height * mVideoWidth / mVideoHeight; - } else if ( mVideoWidth * height > width * mVideoHeight ) { - //Log.i("@@@", "image too tall, correcting"); - height = width * mVideoHeight / mVideoWidth; - } - } else if (widthSpecMode == MeasureSpec.EXACTLY) { - // only the width is fixed, adjust the height to match aspect ratio if possible - width = widthSpecSize; - height = width * mVideoHeight / mVideoWidth; - if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) { - // couldn't match aspect ratio within the constraints - height = heightSpecSize; - } - } else if (heightSpecMode == MeasureSpec.EXACTLY) { - // only the height is fixed, adjust the width to match aspect ratio if possible - height = heightSpecSize; - width = height * mVideoWidth / mVideoHeight; - if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) { - // couldn't match aspect ratio within the constraints - width = widthSpecSize; - } - } else { - // neither the width nor the height are fixed, try to use actual video size - width = mVideoWidth; - height = mVideoHeight; - if (heightSpecMode == MeasureSpec.AT_MOST && height > heightSpecSize) { - // too tall, decrease both width and height - height = heightSpecSize; - width = height * mVideoWidth / mVideoHeight; - } - if (widthSpecMode == MeasureSpec.AT_MOST && width > widthSpecSize) { - // too wide, decrease both width and height - width = widthSpecSize; - height = width * mVideoHeight / mVideoWidth; - } - } - } else { - // no size yet, just adopt the given spec sizes - } - setMeasuredDimension(width, height); + initVideoView(); } + @SuppressLint("NewApi") @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(TextureVideoView.class.getName()); } + @SuppressLint("NewApi") @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(TextureVideoView.class.getName()); } - public int resolveAdjustedSize(int desiredSize, int measureSpec) { - return getDefaultSize(desiredSize, measureSpec); + private void initVideoView() { + mVideoWidth = 0; + mVideoHeight = 0; + setSurfaceTextureListener(mSurfaceTextureListener); + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + mCurrentState = V2XConst.STATE_IDLE; + mTargetState = V2XConst.STATE_IDLE; + } + + public boolean requestAudioFocus() { + return true; } - /** - * Sets video path. - * - * @param path the path of the video. - */ public void setVideoPath(String path) { setVideoURI(Uri.parse(path)); } - /** - * Sets video URI. - * - * @param uri the URI of the video. - */ public void setVideoURI(Uri uri) { setVideoURI(uri, null); } - /** - * Sets video URI using specific headers. - * - * @param uri the URI of the video. - * @param headers the headers for the URI request. - * Note that the cross domain redirection is allowed by default, but that can be - * changed with key/value pairs through the headers parameter with - * "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value - * to disallow or allow cross domain redirection. - */ public void setVideoURI(Uri uri, Map headers) { + if (uri == null) { + Logger.i(MODULE_NAME, "setVideoURI--- uri = null"); + } else { + Logger.i(MODULE_NAME, "setVideoURI--- uri = " + uri.getPath()); + } mUri = uri; mHeaders = headers; mSeekWhenPrepared = 0; + isFocusLoss = !requestAudioFocus(); openVideo(); requestLayout(); invalidate(); @@ -263,354 +149,232 @@ public class TextureVideoView extends TextureView mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; - mCurrentState = STATE_IDLE; - mTargetState = STATE_IDLE; - if (mShouldRequestAudioFocus) { - AudioManager am = (AudioManager) getContext().getApplicationContext().getSystemService(Context.AUDIO_SERVICE); - am.abandonAudioFocus(null); - } + mTargetState = mCurrentState = V2XConst.STATE_IDLE; } - clearSurface(); - } - - /** - * Clears the surface texture by attaching a GL context and clearing it. - * Code taken from Hugo Gresse's answer on stackoverflow.com. - */ - private void clearSurface() { - if (mSurface == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - return; - } - - EGL10 egl = (EGL10) EGLContext.getEGL(); - EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - egl.eglInitialize(display, null); - - int[] attribList = { - EGL10.EGL_RED_SIZE, 8, - EGL10.EGL_GREEN_SIZE, 8, - EGL10.EGL_BLUE_SIZE, 8, - EGL10.EGL_ALPHA_SIZE, 8, - EGL10.EGL_RENDERABLE_TYPE, EGL10.EGL_WINDOW_BIT, - EGL10.EGL_NONE, 0, // placeholder for recordable [@-3] - EGL10.EGL_NONE - }; - EGLConfig[] configs = new EGLConfig[1]; - int[] numConfigs = new int[1]; - egl.eglChooseConfig(display, attribList, configs, configs.length, numConfigs); - EGLConfig config = configs[0]; - EGLContext context = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, new int[]{ - 12440, 2, EGL10.EGL_NONE - }); - EGLSurface eglSurface = egl.eglCreateWindowSurface(display, config, mSurface, new int[]{ - EGL10.EGL_NONE - }); - - egl.eglMakeCurrent(display, eglSurface, eglSurface, context); - GLES20.glClearColor(0, 0, 0, 1); - GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); - egl.eglSwapBuffers(display, eglSurface); - egl.eglDestroySurface(display, eglSurface); - egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); - egl.eglDestroyContext(display, context); - egl.eglTerminate(display); } + @SuppressLint("NewApi") private void openVideo() { - if (mUri == null || mSurface == null) { - // not ready for playback just yet, will try again later + Logger.i(MODULE_NAME, "openVideo"); + if (mUri == null) { + Logger.i(MODULE_NAME, "mUri == null "); + } + if (mSurface == null) { + Logger.i(MODULE_NAME, "mSurface == null "); + } + if (mUri == null || mSurface == null || isSuspendFromActivity) { + Logger.i(MODULE_NAME, "isSuspendFromActivity = " + isSuspendFromActivity); return; } - // we shouldn't clear the target state, because somebody might have - // called start() previously release(false); - - if (mShouldRequestAudioFocus) { - AudioManager am = (AudioManager) getContext().getApplicationContext().getSystemService(Context.AUDIO_SERVICE); - am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); - } - try { mMediaPlayer = new MediaPlayer(); - - if (mAudioSession != 0) { - mMediaPlayer.setAudioSessionId(mAudioSession); - } else { - mAudioSession = mMediaPlayer.getAudioSessionId(); - } mMediaPlayer.setOnPreparedListener(mPreparedListener); mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); + mDuration = -1; mMediaPlayer.setOnCompletionListener(mCompletionListener); mMediaPlayer.setOnErrorListener(mErrorListener); - mMediaPlayer.setOnInfoListener(mInfoListener); mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); + mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener); + mMediaPlayer.setOnInfoListener(mInfoListener); mCurrentBufferPercentage = 0; - mMediaPlayer.setDataSource(getContext().getApplicationContext(), mUri, mHeaders); - mMediaPlayer.setSurface(mSurface); + mMediaPlayer.setDataSource(getContext(), mUri, mHeaders); + if (mSurface != null) { + /* + Canvas mCanvas = mSurface.lockCanvas(new Rect()); + mCanvas.drawColor(Color.BLACK); + mSurface.unlockCanvasAndPost(mCanvas); + invalidate(); + */ + mMediaPlayer.setSurface(mSurface); + } mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setScreenOnWhilePlaying(true); - mMediaPlayer.prepareAsync(); - - // we don't set the target state here either, but preserve the - // target state that was there before. - mCurrentState = STATE_PREPARING; - attachMediaController(); - } catch (IOException ex) { - Log.w(TAG, "Unable to open content: " + mUri, ex); - mCurrentState = STATE_ERROR; - mTargetState = STATE_ERROR; - mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); - return; - } catch (IllegalArgumentException ex) { - Log.w(TAG, "Unable to open content: " + mUri, ex); - mCurrentState = STATE_ERROR; - mTargetState = STATE_ERROR; - mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); - return; + mMediaPlayer.setVolume(0, 0); + mMediaPlayer.prepare(); + mPrepareState = mCurrentState = V2XConst.STATE_PREPARING; + } catch (IOException | SecurityException | IllegalStateException | IllegalArgumentException ex) { + ex.printStackTrace(); + onError(); } } - public void setMediaController(MediaController controller) { - if (mMediaController != null) { - mMediaController.hide(); - } - mMediaController = controller; - attachMediaController(); + private void onError() { + mTargetState = mCurrentState = V2XConst.STATE_ERROR; + if (mErrorListener != null) + mErrorListener.onError(mMediaPlayer, + MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); } - private void attachMediaController() { - if (mMediaPlayer != null && mMediaController != null) { - mMediaController.setMediaPlayer(this); - View anchorView = this.getParent() instanceof View ? - (View)this.getParent() : this; - mMediaController.setAnchorView(anchorView); - mMediaController.setEnabled(isInPlaybackState()); - } - } - - MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener = - new MediaPlayer.OnVideoSizeChangedListener() { - public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { - mVideoWidth = mp.getVideoWidth(); - mVideoHeight = mp.getVideoHeight(); - if (mVideoWidth != 0 && mVideoHeight != 0) { - /* - * 播放器大小等于获取的视频尺寸!!!!!!!!!!!!!!!!! - * */ -// getSurfaceTexture().setDefaultBufferSize(mVideoWidth, mVideoHeight); -// requestLayout(); - } - } - }; - - MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { - public void onPrepared(MediaPlayer mp) { - mCurrentState = STATE_PREPARED; - - mCanPause = mCanSeekBack = mCanSeekForward = true; - - if (mOnPreparedListener != null) { - mOnPreparedListener.onPrepared(mMediaPlayer); - } - if (mMediaController != null) { - mMediaController.setEnabled(true); - } + MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() { + public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { mVideoWidth = mp.getVideoWidth(); mVideoHeight = mp.getVideoHeight(); - - int seekToPosition = mSeekWhenPrepared; // mSeekWhenPrepared may be changed after seekTo() call - if (seekToPosition != 0) { - seekTo(seekToPosition); - } if (mVideoWidth != 0 && mVideoHeight != 0) { - //Log.i("@@@@", "video size: " + mVideoWidth +"/"+ mVideoHeight); -// getSurfaceTexture().setDefaultBufferSize(mVideoWidth, mVideoHeight);/*播放器大小等于获取的视频尺寸!!!!!!!!!!!!!!!!!*/ - // We won't get a "surface changed" callback if the surface is already the right size, so - // start the video here instead of in the callback. - if (mTargetState == STATE_PLAYING) { - start(); - if (mMediaController != null) { - mMediaController.show(); - } - } else if (!isPlaying() && - (seekToPosition != 0 || getCurrentPosition() > 0)) { - if (mMediaController != null) { - // Show the media controls when we're paused into a video and make 'em stick. - mMediaController.show(0); - } - } - } else { - // We don't know the video size yet, but should start anyway. - // The video size might be reported to us later. - if (mTargetState == STATE_PLAYING) { - start(); - } + Logger.d(MODULE_NAME, "OnVideoSizeChangedListener mVideoWidth:" + " mVideoWidth:" + mVideoWidth + " mVideoHeight:" + mVideoHeight); } } }; - private OnCompletionListener mCompletionListener = - new OnCompletionListener() { - public void onCompletion(MediaPlayer mp) { - mCurrentState = STATE_PLAYBACK_COMPLETED; - mTargetState = STATE_PLAYBACK_COMPLETED; - if (mMediaController != null) { - mMediaController.hide(); - } - if (mOnCompletionListener != null) { - mOnCompletionListener.onCompletion(mMediaPlayer); - } + MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { + public void onPrepared(MediaPlayer mp) { + Logger.i(MODULE_NAME, "MediaPlayer.OnPreparedListener"); + mPrepareState = mCurrentState = V2XConst.STATE_PREPARED; + mVideoWidth = mp.getVideoWidth(); + mVideoHeight = mp.getVideoHeight(); + + int seekToPosition = mSeekWhenPrepared; +// Logger.i(MODULE_NAME, "seekToPosition = " + seekToPosition); + if (seekToPosition != 0) { + seekTo(seekToPosition); + } + if (mTargetState == V2XConst.STATE_PLAYING) { + start(); + } + if (mOnPreparedListener != null) { + mOnPreparedListener.onPrepared(mMediaPlayer); + } + mp.setOnInfoListener((mp1, what, extra) -> { + if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) + setBackgroundColor(Color.TRANSPARENT); + return true; + }); + } + }; + + private OnCompletionListener mCompletionListener = new OnCompletionListener() { + public void onCompletion(MediaPlayer mp) { + Logger.i(MODULE_NAME, "MediaPlayer.OnCompletionListener"); + mTargetState = mCurrentState = V2XConst.STATE_PLAYBACK_COMPLETED; + if (mOnCompletionListener != null) { + mOnCompletionListener.onCompletion(mMediaPlayer); + } + } + }; + + private OnSeekCompleteListener mSeekCompleteListener = mp -> { + Logger.i(MODULE_NAME, "MediaPlayer.OnSeekCompleteListener"); + try { + mCurrentState = mMediaPlayer.isPlaying() ? V2XConst.STATE_PLAYING : V2XConst.STATE_PAUSED; + } catch (Exception e) { + mCurrentState = V2XConst.STATE_PLAYING; + e.printStackTrace(); + } + }; + + private OnErrorListener mErrorListener = new OnErrorListener() { + public boolean onError(MediaPlayer mp, int framework_err, int impl_err) { + Logger.i(MODULE_NAME, "MediaPlayer.onError"); + mTargetState = mPrepareState = mCurrentState = V2XConst.STATE_ERROR; + if (mOnErrorListener != null) { + mOnErrorListener.onError(mMediaPlayer, framework_err, + impl_err); + } + release(false); + return true; + } + }; + + private MediaPlayer.OnInfoListener mInfoListener = new MediaPlayer.OnInfoListener() { + + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + Logger.i(MODULE_NAME, "MediaPlayer.OnInfoListener---what = " + what + ";extra = " + extra); + int messageId = 0; + if (what == MEDIA_INFO_VIDEO_NOT_SUPPORTED) { + messageId = R.string.VideoView_info_text_video_not_supported; + } else if (what == MEDIA_INFO_AUDIO_NOT_SUPPORTED) { + messageId = R.string.file_not_support; + } + if (messageId != 0) { + if (mOnInfoListener != null) { + mOnInfoListener.onInfo(mp, what, extra); } - }; + return true; + } + return false; + } + }; - private OnInfoListener mInfoListener = - new OnInfoListener() { - public boolean onInfo(MediaPlayer mp, int arg1, int arg2) { - if (mOnInfoListener != null) { - mOnInfoListener.onInfo(mp, arg1, arg2); - } - return true; - } - }; - - private OnErrorListener mErrorListener = - new OnErrorListener() { - public boolean onError(MediaPlayer mp, int framework_err, int impl_err) { - Log.d(TAG, "Error: " + framework_err + "," + impl_err); - mCurrentState = STATE_ERROR; - mTargetState = STATE_ERROR; - if (mMediaController != null) { - mMediaController.hide(); - } - - /* If an error handler has been supplied, use it and finish. */ - if (mOnErrorListener != null) { - if (mOnErrorListener.onError(mMediaPlayer, framework_err, impl_err)) { - return true; - } - } - - /* Otherwise, pop up an error dialog so the user knows that - * something bad has happened. Only try and pop up the dialog - * if we're attached to a window. When we're going away and no - * longer have a window, don't bother showing the user an error. - */ - if (getWindowToken() != null) { - Resources r = getContext().getResources(); - int messageId; - - if (framework_err == MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) { - messageId = android.R.string.VideoView_error_text_invalid_progressive_playback; - } else { - messageId = android.R.string.VideoView_error_text_unknown; - } - - new AlertDialog.Builder(getContext()) - .setMessage(messageId) - .setPositiveButton(android.R.string.VideoView_error_button, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - /* If we get here, there is no onError listener, so - * at least inform them that the video is over. - */ - if (mOnCompletionListener != null) { - mOnCompletionListener.onCompletion(mMediaPlayer); - } - } - }) - .setCancelable(false) - .show(); - } - return true; - } - }; - - private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener = - new MediaPlayer.OnBufferingUpdateListener() { - public void onBufferingUpdate(MediaPlayer mp, int percent) { - mCurrentBufferPercentage = percent; - } - }; + private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() { + public void onBufferingUpdate(MediaPlayer mp, int percent) { + Logger.i(MODULE_NAME, "MediaPlayer.OnBufferingUpdateListener"); + mCurrentBufferPercentage = percent; + } + }; /** - * Register a callback to be invoked when the media file - * is loaded and ready to go. + * Register a callback to be invoked when the media file is loaded and ready + * to go. * * @param l The callback that will be run */ - public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) - { + public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) { mOnPreparedListener = l; } /** - * Register a callback to be invoked when the end of a media file - * has been reached during playback. + * Register a callback to be invoked when the end of a media file has been + * reached during playback. * * @param l The callback that will be run */ - public void setOnCompletionListener(OnCompletionListener l) - { + public void setOnCompletionListener(OnCompletionListener l) { mOnCompletionListener = l; } /** - * Register a callback to be invoked when an error occurs - * during playback or setup. If no listener is specified, - * or if the listener returned false, TextureVideoView will inform - * the user of any errors. + * Register a callback to be invoked when an error occurs during playback or + * setup. If no listener is specified, or if the listener returned false, + * VideoView will inform the user of any errors. * * @param l The callback that will be run */ - public void setOnErrorListener(OnErrorListener l) - { + public void setOnErrorListener(OnErrorListener l) { mOnErrorListener = l; } - /** - * Register a callback to be invoked when an informational event - * occurs during playback or setup. - * - * @param l The callback that will be run - */ - public void setOnInfoListener(OnInfoListener l) { + public void setOnInfoListener(MediaPlayer.OnInfoListener l) { mOnInfoListener = l; } - SurfaceTextureListener mSurfaceTextureListener = new SurfaceTextureListener() - { + SurfaceTextureListener mSurfaceTextureListener = new SurfaceTextureListener() { @Override - public void onSurfaceTextureSizeChanged(final SurfaceTexture surface, final int width, final int height) { - boolean isValidState = (mTargetState == STATE_PLAYING); - boolean hasValidSize = (width > 0 && height > 0); - if (mMediaPlayer != null && isValidState && hasValidSize) { - if (mSeekWhenPrepared != 0) { - seekTo(mSeekWhenPrepared); - } - start(); - } - } - - @Override - public void onSurfaceTextureAvailable(final SurfaceTexture surface, final int width, final int height) { + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + Logger.i(MODULE_NAME, "onSurfaceTextureAvailable"); mSurface = new Surface(surface); openVideo(); } @Override - public boolean onSurfaceTextureDestroyed(final SurfaceTexture surface) { - // after we return from this we can't use the surface any more - if (mSurface != null) { - mSurface.release(); - mSurface = null; + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + Logger.d(MODULE_NAME, "onSurfaceTextureSizeChanged mVideoWidth:" + " mVideoWidth:" + mVideoWidth + " mVideoHeight:" + mVideoHeight); + boolean isValidState = (mTargetState == V2XConst.STATE_PLAYING); + boolean hasValidSize = (mVideoWidth == width && mVideoHeight == height); + if (mMediaPlayer != null && isValidState && hasValidSize) { + if (mSeekWhenPrepared != 0) { + seekTo(mSeekWhenPrepared); + } + try { + Thread.sleep(100); + } catch (Exception e) { + e.printStackTrace(); + } + if (!isFocusLoss) start(); } - if (mMediaController != null) mMediaController.hide(); - release(true); - return true; } + @Override - public void onSurfaceTextureUpdated(final SurfaceTexture surface) { - // do nothing + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + Logger.i(MODULE_NAME, "onSurfaceTextureDestroyed"); + mSurface = null; + release(false); + return false; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) { + } }; @@ -618,125 +382,131 @@ public class TextureVideoView extends TextureView * release the media player in any state */ private void release(boolean cleartargetstate) { - if (mMediaPlayer != null) { - mMediaPlayer.reset(); - mMediaPlayer.release(); - mMediaPlayer = null; - mCurrentState = STATE_IDLE; - if (cleartargetstate) { - mTargetState = STATE_IDLE; - } - if (mShouldRequestAudioFocus) { - AudioManager am = (AudioManager) getContext().getApplicationContext().getSystemService(Context.AUDIO_SERVICE); - am.abandonAudioFocus(null); - } - } - } + Logger.i(MODULE_NAME, "release ---cleartargetstate=" + cleartargetstate); + mCurrentState = V2XConst.STATE_IDLE; - @Override - public boolean onTouchEvent(MotionEvent ev) { - if (isInPlaybackState() && mMediaController != null) { - toggleMediaControlsVisiblity(); - } - return false; - } + if (cleartargetstate) { + mTargetState = V2XConst.STATE_IDLE; - @Override - public boolean onTrackballEvent(MotionEvent ev) { - if (isInPlaybackState() && mMediaController != null) { - toggleMediaControlsVisiblity(); - } - return false; - } + new Thread(new Runnable() { + @Override + public void run() { + try { + if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { + try { + mMediaPlayer.stop(); + } catch (IllegalStateException e) { + try { + this.wait(1000); + mMediaPlayer.stop(); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } + } - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) - { - boolean isKeyCodeSupported = keyCode != KeyEvent.KEYCODE_BACK && - keyCode != KeyEvent.KEYCODE_VOLUME_UP && - keyCode != KeyEvent.KEYCODE_VOLUME_DOWN && - keyCode != KeyEvent.KEYCODE_VOLUME_MUTE && - keyCode != KeyEvent.KEYCODE_MENU && - keyCode != KeyEvent.KEYCODE_CALL && - keyCode != KeyEvent.KEYCODE_ENDCALL; - if (isInPlaybackState() && isKeyCodeSupported && mMediaController != null) { - if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || - keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { - if (mMediaPlayer.isPlaying()) { - pause(); - mMediaController.show(); - } else { - start(); - mMediaController.hide(); + if (mMediaPlayer != null) { + mMediaPlayer.release();// release会做reset + } + mMediaPlayer = null; + } catch (IllegalStateException e) { + e.printStackTrace(); + } } - return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) { - if (!mMediaPlayer.isPlaying()) { - start(); - mMediaController.hide(); - } - return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP - || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) { - if (mMediaPlayer.isPlaying()) { - pause(); - mMediaController.show(); - } - return true; - } else { - toggleMediaControlsVisiblity(); - } - } - - return super.onKeyDown(keyCode, event); - } - - private void toggleMediaControlsVisiblity() { - if (mMediaController.isShowing()) { - mMediaController.hide(); + }).start(); } else { - mMediaController.show(); + if (mMediaPlayer != null) { + try { + mMediaPlayer.stop(); + mMediaPlayer.reset(); + mMediaPlayer.release(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } + } + mMediaPlayer = null; } } - @Override + public boolean isPrepared() { + return mPrepareState == V2XConst.STATE_PREPARED + || isSuspendFromActivity; + } + public void start() { - if (isInPlaybackState()) { - mMediaPlayer.start(); - mCurrentState = STATE_PLAYING; + Logger.i(MODULE_NAME, "TextureVideoView---start"); + if (isFocusLoss) { + mTagetStateBackup = V2XConst.STATE_PLAYING; + return; } - mTargetState = STATE_PLAYING; + //Logger.i(MODULE_NAME, "mCurrentState = " + mCurrentState); + if (isInPlaybackState()) { + Logger.i(MODULE_NAME, "MediaPlayer.start"); + mMediaPlayer.start(); + mCurrentState = V2XConst.STATE_PLAYING; + } + mTargetState = V2XConst.STATE_PLAYING; } - @Override public void pause() { + Logger.i(MODULE_NAME, "TextureVideoView---pause"); + Logger.i(MODULE_NAME, "mCurrentState = " + mCurrentState); if (isInPlaybackState()) { if (mMediaPlayer.isPlaying()) { + Logger.i(MODULE_NAME, " MediaPlayer.pause"); mMediaPlayer.pause(); - mCurrentState = STATE_PAUSED; + mCurrentState = V2XConst.STATE_PAUSED; } } - mTargetState = STATE_PAUSED; + mTagetStateBackup = mTargetState = V2XConst.STATE_PAUSED; } public void suspend() { - release(false); + Logger.i(MODULE_NAME, "TextureVideoView---suspend"); + if (!isSuspendFromActivity) { + isSuspendFromActivity = true; + if (mMediaPlayer != null) { + if (isInPlaybackState()) { + progressWhileSuspend = mMediaPlayer.getCurrentPosition(); + } + } + release(false); + } } public void resume() { + Logger.i(MODULE_NAME, "TextureVideoView---resume"); + isSuspendFromActivity = false; openVideo(); + seekTo(progressWhileSuspend); + + if (mTagetStateBackup == V2XConst.STATE_IDLE) + mTagetStateBackup = mTargetState; + Logger.i(MODULE_NAME, "isFocusLoss = " + isFocusLoss); + Logger.i(MODULE_NAME, "isInPlaybackState() = " + isInPlaybackState()); + if (isFocusLoss) { + if (isInPlaybackState()) { + if (mMediaPlayer.isPlaying()) { + mMediaPlayer.pause(); + mCurrentState = V2XConst.STATE_PAUSED; + } + } + } } - @Override + // cache duration as mDuration for faster access public int getDuration() { if (isInPlaybackState()) { - return mMediaPlayer.getDuration(); + if (mDuration > 0) { + return mDuration; + } + mDuration = mMediaPlayer.getDuration(); + return mDuration; } - - return -1; + mDuration = -1; + return mDuration; } - @Override public int getCurrentPosition() { if (isInPlaybackState()) { return mMediaPlayer.getCurrentPosition(); @@ -744,22 +514,25 @@ public class TextureVideoView extends TextureView return 0; } - @Override public void seekTo(int msec) { - if (isInPlaybackState()) { + Logger.i(MODULE_NAME, "TextureVideoView---seekTo---msec = " + msec); + if (isInPlaybackState() && mCurrentState != V2XConst.STATE_SEEKING + && msec > 0 && msec < getDuration()) { + mCurrentState = V2XConst.STATE_SEEKING; + + Logger.i(MODULE_NAME, "MediaPlayer.seekTo(msec) = " + msec); mMediaPlayer.seekTo(msec); mSeekWhenPrepared = 0; } else { mSeekWhenPrepared = msec; + progressWhileSuspend = msec; } } - @Override public boolean isPlaying() { return isInPlaybackState() && mMediaPlayer.isPlaying(); } - @Override public int getBufferPercentage() { if (mMediaPlayer != null) { return mCurrentBufferPercentage; @@ -768,58 +541,50 @@ public class TextureVideoView extends TextureView } private boolean isInPlaybackState() { - return (mMediaPlayer != null && - mCurrentState != STATE_ERROR && - mCurrentState != STATE_IDLE && - mCurrentState != STATE_PREPARING); + return (mMediaPlayer != null && mCurrentState != V2XConst.STATE_ERROR + && mCurrentState != V2XConst.STATE_IDLE && mCurrentState != V2XConst.STATE_PREPARING); } @Override public boolean canPause() { - return mCanPause; + return false; } @Override public boolean canSeekBackward() { - return mCanSeekBack; + return false; } @Override public boolean canSeekForward() { - return mCanSeekForward; + return false; } - public int getAudioSessionId() { - if (mAudioSession == 0) { - MediaPlayer foo = new MediaPlayer(); - mAudioSession = foo.getAudioSessionId(); - foo.release(); + public String getVideoPath() { + if (mUri != null) { + return mUri.getPath(); } - return mAudioSession; + return null; } - /** - * Sets the request audio focus flag. If enabled, {@link TextureVideoView} will request - * audio focus when opening a video by calling {@link AudioManager}. This flag - * should be set before calling {@link TextureVideoView#setVideoPath(String)} or - * {@link TextureVideoView#setVideoURI(Uri)}. By default, {@link TextureVideoView} will - * request audio focus. - * - * @param shouldRequestAudioFocus If {@code true}, {@link TextureVideoView} will request - * audio focus before opening a video, else audio focus is not requested - */ - public void setShouldRequestAudioFocus(boolean shouldRequestAudioFocus) { - mShouldRequestAudioFocus = shouldRequestAudioFocus; + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = getDefaultSize(mVideoWidth, widthMeasureSpec); + int height = getDefaultSize(mVideoHeight, heightMeasureSpec); + setMeasuredDimension(width, height); } - /** - * Returns the current state of the audio focus request flag. - * - * @return {@code true}, if {@link TextureVideoView} will request - * audio focus before opening a video, else {@code false} - */ - public boolean shouldRequestAudioFocus() { - return mShouldRequestAudioFocus; + public boolean isPause() { + return mTargetState == V2XConst.STATE_PAUSED; } + @Override + public int getAudioSessionId() { + return 0; + } + + public int getCurrentState() { + Logger.i(MODULE_NAME, "mCurrentState == " + mCurrentState); + return mCurrentState; + } } From 05d4e71bf3b5725b25ae31eef0dbe04d7533aa19 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 21 Oct 2020 09:58:40 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E6=89=8B=E5=8A=BF=E6=93=8D=E4=BD=9C=E5=92=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/impl/amap/AMapNaviViewWrapper.java | 36 ++++++++++++++++--- .../mogo/map/impl/amap/AMapViewWrapper.java | 6 ++-- .../com/mogo/map/impl/amap/hook/BnHooker.java | 20 +++++------ 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index c908e33c9e..677f6f0b21 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -94,11 +94,14 @@ public class AMapNaviViewWrapper implements IMogoMapView, private BnHooker bnHooker; + private Location mLastDriveLocationShadow = null; + private Marker mMyLocationMarker; + public AMapNaviViewWrapper( AMapNaviView mapView ) { this.mMapView = mapView; this.mIMap = new AMapWrapper( mMapView.getMap(), mMapView.getContext(), this ); try { - bnHooker = new BnHooker( mMapView.getMap(), mapView.getContext() ); + bnHooker = new BnHooker( mMapView.getMap() ); } catch ( Exception e ) { e.printStackTrace(); } @@ -281,9 +284,8 @@ public class AMapNaviViewWrapper implements IMogoMapView, if ( motionEvent.getAction() == MotionEvent.ACTION_DOWN ) { changeMyLocationType2UnFollow(); } - try { - bnHooker.print(); + bnHooker.clearAllMessages(); } catch ( Exception e ) { e.printStackTrace(); } @@ -581,7 +583,7 @@ public class AMapNaviViewWrapper implements IMogoMapView, } } - private void changeMyLocationType2UnFollow(){ + private void changeMyLocationType2UnFollow() { if ( mCurrentUIMode == null ) { return; } @@ -892,9 +894,35 @@ public class AMapNaviViewWrapper implements IMogoMapView, @Override public void onMyLocationChange( Location location ) { + if ( ( int ) location.getSpeed() > 0 ) { + mLastDriveLocationShadow = location; + } else { + if ( ( int ) location.getBearing() == 0 + && mCurrentUIMode == EnumMapUI.NorthUP_2D + && mLastDriveLocationShadow != null ) { + if ( mMyLocationMarker == null ) { + initMyLocationMarker(); + } + if ( mMyLocationMarker != null ) { + mMyLocationMarker.setRotateAngle( 360 - mLastDriveLocationShadow.getBearing() ); + } + } + } NaviClient.getInstance( getContext() ).syncCarLocation( location ); } + private void initMyLocationMarker() { + List< Marker > markers = mMapView.getMap().getMapScreenMarkers(); + if ( markers != null ) { + for ( Marker marker : markers ) { + if ( marker != null && marker.getObject() == null ) { + this.mMyLocationMarker = marker; + break; + } + } + } + } + @Override public EnumMapUI getCurrentUiMode() { return mCurrentUIMode; diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java index 8ef68ba368..c512ab3eda 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java @@ -17,10 +17,8 @@ import com.amap.api.maps.AMap; import com.amap.api.maps.AMapUtils; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.MapView; -import com.amap.api.maps.TextureMapView; import com.amap.api.maps.model.BitmapDescriptorFactory; import com.amap.api.maps.model.CameraPosition; -import com.amap.api.maps.model.CameraPositionCreator; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.Marker; @@ -94,7 +92,7 @@ public class AMapViewWrapper implements IMogoMapView, this.mMapView = mapView; this.mIMap = new AMapWrapper( mMapView.getMap(), mMapView.getContext(), this ); try { - new BnHooker( mMapView.getMap(), mapView.getContext() ); + new BnHooker( mMapView.getMap() ); } catch ( Exception e ) { e.printStackTrace(); } @@ -206,7 +204,7 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void onCreate( Bundle bundle ) { - Logger.d( TAG, Log.getStackTraceString( new Throwable( ) ) ); + Logger.d( TAG, Log.getStackTraceString( new Throwable() ) ); if ( mMapView != null ) { mMapView.onCreate( bundle ); Logger.d( TAG, "map onCreate" ); diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/hook/BnHooker.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/hook/BnHooker.java index 83925eccf5..51177489d3 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/hook/BnHooker.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/hook/BnHooker.java @@ -1,14 +1,10 @@ package com.mogo.map.impl.amap.hook; -import android.content.Context; - import com.amap.api.maps.AMap; import com.autonavi.amap.mapcore.interfaces.IAMap; import com.autonavi.base.ae.gmap.GLMapEngine; import com.autonavi.base.amap.api.mapcore.IAMapDelegate; import com.autonavi.base.amap.mapcore.interfaces.IAMapListener; -import com.mogo.map.impl.amap.navi.NaviClient; -import com.mogo.utils.logger.Logger; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; @@ -25,13 +21,10 @@ import java.util.List; public class BnHooker implements InvocationHandler { private static final String TAG = "BnHooker"; - private final Context mContext; private Object host; - public BnHooker( AMap map, Context context ) throws Exception { - - mContext = context; + public BnHooker( AMap map ) throws Exception { if ( map == null ) { return; @@ -53,15 +46,18 @@ public class BnHooker implements InvocationHandler { } - public void print() throws Exception { + public void clearAllMessages() throws Exception { Method method = host.getClass().getDeclaredMethod( "getGLMapEngine" ); method.setAccessible( true ); GLMapEngine glMapEngine = ( GLMapEngine ) method.invoke( host ); - glMapEngine.clearAllMessages( 0 ); + clearMessageList( "mStateMessageList", glMapEngine ); + clearMessageList( "mAnimateStateMessageList", glMapEngine ); + } - Field stateMessageListField = glMapEngine.getClass().getDeclaredField( "mStateMessageList" ); + private void clearMessageList( String filedName, Object obj ) throws Exception { + Field stateMessageListField = obj.getClass().getDeclaredField( filedName ); stateMessageListField.setAccessible( true ); - List valList = ( List ) stateMessageListField.get( glMapEngine ); + List valList = ( List ) stateMessageListField.get( obj ); valList.clear(); } From 3c5a59cab1169e89135e696016313eef868ed40b Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 21 Oct 2020 10:45:35 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E6=89=8B=E5=8A=BF=E6=93=8D=E4=BD=9C=E5=92=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E5=86=B2=E7=AA=81=20-=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/map/impl/amap/AMapNaviViewWrapper.java | 10 ++++++---- .../mogo/module/service/marker/MapMarkerManager.java | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 677f6f0b21..2d5e744af4 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -284,10 +284,12 @@ public class AMapNaviViewWrapper implements IMogoMapView, if ( motionEvent.getAction() == MotionEvent.ACTION_DOWN ) { changeMyLocationType2UnFollow(); } - try { - bnHooker.clearAllMessages(); - } catch ( Exception e ) { - e.printStackTrace(); + if ( motionEvent.getAction() != MotionEvent.ACTION_UP ) { + try { + bnHooker.clearAllMessages(); + } catch ( Exception e ) { + e.printStackTrace(); + } } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index 3087516e18..d6830582c0 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -1022,6 +1022,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, public void onCloseCurrentSelectedMarker(){ if ( mLastCheckMarker != null && !mLastCheckMarker.isDestroyed()) { closeMarker( mLastCheckMarker ); + mLastCheckMarker = null; } } }