Here are the examples of the java api android.widget.MediaController taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
53 Examples
19
Source : VideoView.java
with MIT License
from xugaoxiang
with MIT License
from xugaoxiang
public void setMediaController(MediaController controller) {
}
19
Source : VideoFragment.java
with Apache License 2.0
from Kerr1Gan
with Apache License 2.0
from Kerr1Gan
/**
* Created by Ethan_Xiang on 2017/10/10.
*/
public clreplaced VideoFragment extends Fragment {
private String mVideoUrl = "http://sp.9ky.cc/vlook.php?id=YklkPTQ5NDcyMjY=";
private MediaController mMediaController;
private VideoView mVideoView;
private int mLastPosition = 0;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.cc_fragment_video, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mMediaController = new MediaController(getContext());
mVideoView = (VideoView) view.findViewById(R.id.video);
mVideoView.setVideoPath(mVideoUrl);
mVideoView.setMediaController(mMediaController);
mVideoView.requestFocus();
}
@Override
public void onResume() {
super.onResume();
mVideoView.start();
mVideoView.seekTo(mLastPosition);
}
@Override
public void onPause() {
super.onPause();
mVideoView.pause();
mLastPosition = mVideoView.getCurrentPosition();
}
@Override
public void onDestroy() {
super.onDestroy();
mVideoView.stopPlayback();
}
}
19
Source : VideoViewTV.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public void setMediaController(MediaController controller) {
if (this.mediaController != null) {
this.mediaController.hide();
}
this.mediaController = controller;
attachMediaController();
}
19
Source : VideoViewH264mp4.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
19
Source : VideoPlayer.java
with Apache License 2.0
from djzhao627
with Apache License 2.0
from djzhao627
/**
* Created by djzhao on 17/04/29.
*/
public clreplaced VideoPlayer extends BaseActivity {
private VideoView videoView;
private MediaController mediaController;
@Override
protected void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
setContentView(R.layout.activity_test_video_player);
findViewById();
initView();
}
@Override
protected void findViewById() {
this.videoView = $(R.id.player_test_vv);
}
@Override
protected void initView() {
// String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/movie.mp4";
String uri = "android.resource://" + getPackageName() + "/" + R.raw.base;
// 本地视频
// videoView.setVideoPath(path);
// 网络视频
// videoView.setVideoURI(Uri.parse("http://www.runoob.com/try/demo_source/movie.mp4"));
videoView.setVideoURI(Uri.parse(uri));
mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setMediaPlayer(videoView);
}
}
19
Source : MainActivity.java
with MIT License
from a914-gowtham
with MIT License
from a914-gowtham
public clreplaced MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final int REQUEST_TAKE_VIDEO = 552;
private VideoView videoView;
private MediaController mediaController;
private EditText edtFixedGap, edtMinGap, edtMinFrom, edtMAxTo;
private int trimType;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = findViewById(R.id.video_view);
edtFixedGap = findViewById(R.id.edt_fixed_gap);
edtMinGap = findViewById(R.id.edt_min_gap);
edtMinFrom = findViewById(R.id.edt_min_from);
edtMAxTo = findViewById(R.id.edt_max_to);
mediaController = new MediaController(this);
findViewById(R.id.btn_default_trim).setOnClickListener(this);
findViewById(R.id.btn_fixed_gap).setOnClickListener(this);
findViewById(R.id.btn_min_gap).setOnClickListener(this);
findViewById(R.id.btn_min_max_gap).setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (requestCode == TrimVideo.VIDEO_TRIMMER_REQ_CODE && data != null) {
Uri uri = Uri.parse(TrimVideo.getTrimmedVideoPath(data));
Log.d(TAG, "Trimmed path:: " + uri);
videoView.setMediaController(mediaController);
videoView.setVideoURI(uri);
videoView.requestFocus();
videoView.start();
videoView.setOnPreparedListener(mediaPlayer -> {
mediaController.setAnchorView(videoView);
});
String filepath = String.valueOf(uri);
File file = new File(filepath);
long length = file.length();
Log.d(TAG, "Video size:: " + (length / 1024));
} else if (requestCode == REQUEST_TAKE_VIDEO && resultCode == RESULT_OK) {
/* //check video duration if needed
if (TrimmerUtils.getVideoDuration(this,data.getData())<=30){
Toast.makeText(this,"Video should be larger than 30 sec",Toast.LENGTH_SHORT).show();
return;
}*/
if (data.getData() != null) {
LogMessage.v("Video path:: " + data.getData());
openTrimActivity(String.valueOf(data.getData()));
} else {
Toast.makeText(this, "video uri is null", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void openTrimActivity(String data) {
if (trimType == 0) {
TrimVideo.activity(data).start(this);
} else if (trimType == 1) {
TrimVideo.activity(data).setTrimType(TrimType.FIXED_DURATION).setFixedDuration(getEdtValueLong(edtFixedGap)).start(this);
} else if (trimType == 2) {
TrimVideo.activity(data).setTrimType(TrimType.MIN_DURATION).setMinDuration(getEdtValueLong(edtMinGap)).start(this);
} else {
TrimVideo.activity(data).setTrimType(TrimType.MIN_MAX_DURATION).setMinToMax(getEdtValueLong(edtMinFrom), getEdtValueLong(edtMAxTo)).start(this);
}
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn_default_trim:
onDefaultTrimClicked();
break;
case R.id.btn_fixed_gap:
onFixedTrimClicked();
break;
case R.id.btn_min_gap:
onMinGapTrimClicked();
break;
case R.id.btn_min_max_gap:
onMinToMaxTrimClicked();
break;
}
}
private void onDefaultTrimClicked() {
trimType = 0;
if (checkCamStoragePer())
showVideoOptions();
}
private void onFixedTrimClicked() {
trimType = 1;
if (isEdtTxtEmpty(edtFixedGap))
Toast.makeText(this, "Enter fixed gap duration", Toast.LENGTH_SHORT).show();
else if (checkCamStoragePer())
showVideoOptions();
}
private void onMinGapTrimClicked() {
trimType = 2;
if (isEdtTxtEmpty(edtMinGap))
Toast.makeText(this, "Enter min gap duration", Toast.LENGTH_SHORT).show();
else if (checkCamStoragePer())
showVideoOptions();
}
private void onMinToMaxTrimClicked() {
trimType = 3;
if (isEdtTxtEmpty(edtMinFrom))
Toast.makeText(this, "Enter min gap duration", Toast.LENGTH_SHORT).show();
else if (isEdtTxtEmpty(edtMAxTo))
Toast.makeText(this, "Enter max gap duration", Toast.LENGTH_SHORT).show();
else if (checkCamStoragePer())
showVideoOptions();
}
public void showVideoOptions() {
try {
BottomSheet.Builder builder = getBottomSheet();
builder.sheet(R.menu.menu_video);
builder.listener(item -> {
if (R.id.action_take == item.gereplacedemId())
captureVideo();
else
openVideo();
return false;
});
builder.show();
} catch (Exception e) {
e.printStackTrace();
}
}
public BottomSheet.Builder getBottomSheet() {
return new BottomSheet.Builder(this).replacedle(R.string.txt_option);
}
public void captureVideo() {
try {
Intent intent = new Intent("android.media.action.VIDEO_CAPTURE");
intent.putExtra("android.intent.extra.durationLimit", 30);
startActivityForResult(intent, REQUEST_TAKE_VIDEO);
} catch (Exception e) {
e.printStackTrace();
}
}
public void openVideo() {
try {
Intent intent = new Intent();
intent.setType("video/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_VIDEO);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (isPermissionOk(grantResults))
showVideoOptions();
}
private boolean isEdtTxtEmpty(EditText editText) {
return editText.getText().toString().trim().isEmpty();
}
private long getEdtValueLong(EditText editText) {
return Long.parseLong(editText.getText().toString().trim());
}
private boolean checkCamStoragePer() {
return checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA);
}
private boolean checkPermission(String... permissions) {
boolean allPermitted = false;
for (String permission : permissions) {
allPermitted = (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED);
if (!allPermitted)
break;
}
if (allPermitted)
return true;
ActivityCompat.requestPermissions(this, permissions, 220);
return false;
}
private boolean isPermissionOk(int... results) {
boolean isAllGranted = true;
for (int result : results) {
if (PackageManager.PERMISSION_GRANTED != result) {
isAllGranted = false;
break;
}
}
return isAllGranted;
}
}
18
Source : MediaActivity.java
with Apache License 2.0
from yangchong211
with Apache License 2.0
from yangchong211
public clreplaced MediaActivity extends AppCompatActivity {
private VideoView mVideo;
private Button mBtnStart;
private Button mBtnPause;
private MediaController mMediaController;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_player);
initView();
initListener();
}
private void initView() {
mVideo = findViewById(R.id.video);
mBtnStart = findViewById(R.id.btn_start);
mBtnPause = findViewById(R.id.btn_pause);
Uri uri = Uri.parse(ConstantVideo.VideoPlayerList[2]);
mVideo.setVideoURI(uri);
mMediaController = new MediaController(this);
mVideo.setMediaController(mMediaController);
mVideo.start();
mVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// mp.setLooping(true);
// 播放
mp.start();
BaseToast.showRoundRectToast("开始播放!");
}
});
mVideo.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
BaseToast.showRoundRectToast("播放完毕!");
}
});
}
private void initListener() {
mBtnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mVideo.start();
}
});
mBtnPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mVideo.pause();
}
});
}
}
18
Source : VideoPlayerFragment.java
with GNU General Public License v3.0
from victordiaz
with GNU General Public License v3.0
from victordiaz
public void loadVideo(final String path) {
/*
* Alternatively,for streaming media you can use
* mVideoView.setVideoURI(Uri.parse(URLstring));
*/
mVideoView.setVideoPath(path);
MediaController mediaController = new MediaController(c);
mediaController.setAnchorView(mVideoView);
mVideoView.setMediaController(null);
mVideoView.requestFocus();
mVideoView.setKeepScreenOn(true);
mVideoView.start();
mVideoView.setOnClickListener(v -> close());
mVideoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp_ = mp;
mp_.setLooping(true);
// mVideoView.animate().rotation(200).alpha((float) 0.5)
// .scaleX(0.2f).scaleY(0.2f).setDuration(2000);
r = new Runnable() {
@Override
public void run() {
for (VideoListener l : listeners) {
try {
l.onTimeUpdate(mp_.getCurrentPosition(), mp_.getDuration());
} catch (Exception e) {
}
}
handler.postDelayed(this, 1000);
}
};
handler.post(r);
}
});
// mp_.setO
mVideoView.setOnCompletionListener(mp -> {
// finish();
for (VideoListener l : listeners) {
l.onFinish(true);
}
});
}
18
Source : TimelineVideoActivity.java
with GNU General Public License v3.0
from swentel
with GNU General Public License v3.0
from swentel
public clreplaced TimelineVideoActivity extends AppCompatActivity {
VideoView videoPlayer;
TextView noVideo;
MediaController mediaController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timeline_video);
noVideo = findViewById(R.id.timeline_video_not_video_found);
videoPlayer = findViewById(R.id.timeline_video);
Bundle extras = getIntent().getExtras();
if (extras != null) {
final String videoUrl = extras.getString("video");
if (videoUrl != null) {
if (videoUrl.contains("youtube.com")) {
hideVideoPlayer(false);
TextView youtubeVideo = findViewById(R.id.timeline_video_youtube);
youtubeVideo.setVisibility(View.VISIBLE);
youtubeVideo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(videoUrl));
startActivity(i);
}
});
} else {
videoPlayer.setVideoPath(videoUrl);
videoPlayer.canPause();
mediaController = new MediaController(this);
mediaController.setAnchorView(videoPlayer);
videoPlayer.setMediaController(mediaController);
videoPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaController.show();
if (Preferences.getPreference(TimelineVideoActivity.this, "pref_key_video_autoplay", false)) {
videoPlayer.start();
}
}
});
}
} else {
hideVideoPlayer(true);
}
} else {
hideVideoPlayer(true);
}
}
public void hideVideoPlayer(boolean showVideoNotFound) {
videoPlayer.setVisibility(View.GONE);
if (showVideoNotFound) {
noVideo.setVisibility(View.VISIBLE);
}
}
@Override
public void onBackPressed() {
if (videoPlayer != null) {
videoPlayer.stopPlayback();
}
super.onBackPressed();
}
@Override
public void onDestroy() {
if (videoPlayer != null) {
videoPlayer.stopPlayback();
}
super.onDestroy();
}
}
18
Source : PlayerControl.java
with Apache License 2.0
from Straas
with Apache License 2.0
from Straas
private void processPlaybackState(PlaybackStateCompat state, MediaController mediaController) {
if (state == null || state.getActiveQueueItemId() == StraasMediaCore.AD_PLAYBACK_ID) {
return;
}
mLastPlaybackState = state;
if (mediaController != null && mediaController.isShowing()) {
mediaController.show();
}
}
18
Source : MediaControllerSubject.java
with Apache License 2.0
from pkware
with Apache License 2.0
from pkware
/**
* Propositions for {@link MediaController} subjects.
*/
public clreplaced MediaControllerSubject extends AbstractFrameLayoutSubject<MediaController> {
@Nullable
private final MediaController actual;
public MediaControllerSubject(@Nonnull FailureMetadata failureMetadata, @Nullable MediaController actual) {
super(failureMetadata, actual);
this.actual = actual;
}
public void isShowing() {
check("isShowing()").that(actual.isShowing()).isTrue();
}
public void isNotShowing() {
check("isShowing()").that(actual.isShowing()).isFalse();
}
}
18
Source : PlaybackActivity.java
with Apache License 2.0
from pili-engineering
with Apache License 2.0
from pili-engineering
public clreplaced PlaybackActivity extends Activity implements MediaController.MediaPlayerControl {
private static final String TAG = "PlaybackActivity";
private static final String MP4_PATH = "MP4_PATH";
private static final String PREVIOUS_ORIENTATION = "PREVIOUS_ORIENTATION";
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private MediaPlayer mMediaPlayer;
private MediaController mMediaController;
private String mVideoPath;
private int mPreviousOrientation;
private int mSeekingPosition = 0;
public static void start(Activity activity, String mp4Path) {
Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
intent.putExtra(MP4_PATH, mp4Path);
activity.startActivity(intent);
}
public static void start(Activity activity, String mp4Path, int previousOrientation) {
Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
intent.putExtra(MP4_PATH, mp4Path);
intent.putExtra(PREVIOUS_ORIENTATION, previousOrientation);
activity.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playback);
mVideoPath = getIntent().getStringExtra(MP4_PATH);
mPreviousOrientation = getIntent().getIntExtra(PREVIOUS_ORIENTATION, 1);
mMediaPlayer = new MediaPlayer();
if (mMediaPlayer != null) {
mMediaPlayer.setOnInfoListener(mOnInfoListener);
mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
mMediaPlayer.setOnErrorListener(mOnErrorListener);
} else {
Log.e(TAG, "creating MediaPlayer instance failed, exit.");
return;
}
mSurfaceView = findViewById(R.id.video);
mSurfaceView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mMediaController.isShowing()) {
mMediaController.show(0);
} else {
mMediaController.hide();
}
}
});
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer.setDisplay(mSurfaceHolder);
if (!"".equals(mVideoPath) && !mMediaPlayer.isPlaying()) {
try {
mMediaPlayer.reset();
mMediaPlayer.setLooping(true);
mMediaPlayer.setDataSource(mVideoPath);
mMediaPlayer.prepare();
mMediaPlayer.seekTo(mSeekingPosition);
} catch (IOException e) {
e.printStackTrace();
}
}
makeUpVideoPlayingSize();
mMediaPlayer.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mMediaPlayer.isPlaying()) {
mSeekingPosition = mMediaPlayer.getCurrentPosition();
mMediaPlayer.stop();
}
}
});
mMediaController = new MediaController(this);
mMediaController.setMediaPlayer(this);
mMediaController.setAnchorView(mSurfaceView);
}
private void makeUpVideoPlayingSize() {
int screenWidth, screenHeight, videoWidth, videoHeight, displayWidth, displayHeight;
float screenAspectRatio, videoAspectRatio;
WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(outMetrics);
screenWidth = outMetrics.widthPixels;
screenHeight = outMetrics.heightPixels;
screenAspectRatio = (float) screenHeight / screenWidth;
Log.i(TAG, "Screen size: " + screenWidth + " × " + screenHeight);
videoWidth = mMediaPlayer.getVideoWidth();
videoHeight = mMediaPlayer.getVideoHeight();
videoAspectRatio = (float) videoHeight / videoWidth;
Log.i(TAG, "Video size: " + screenWidth + " × " + screenHeight);
if (screenAspectRatio > videoAspectRatio) {
displayWidth = screenWidth;
displayHeight = (int) ((float) screenWidth / videoWidth * videoHeight);
} else {
displayWidth = (int) ((float) screenHeight / videoHeight * videoWidth);
displayHeight = screenHeight;
}
mSurfaceHolder.setFixedSize(displayWidth, displayHeight);
}
@Override
public void finish() {
if (0 == mPreviousOrientation) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
super.finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMediaPlayer.stop();
mMediaPlayer.release();
}
@Override
public void start() {
mMediaPlayer.start();
}
@Override
public void pause() {
mMediaPlayer.pause();
}
@Override
public int getDuration() {
return mMediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mMediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mMediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
private MediaPlayer.OnInfoListener mOnInfoListener = new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Log.i(TAG, "OnInfo, what = " + what + ", extra = " + extra);
switch(what) {
case MediaPlayer.MEDIA_INFO_UNKNOWN:
break;
case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
break;
case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
Log.i(TAG, "video rendering start, ts = " + extra);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_BUFFERING_START");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
Log.i(TAG, "onInfo: MEDIA_INFO_BUFFERING_END");
break;
case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
Log.i(TAG, "onInfo: MEDIA_INFO_BAD_INTERLEAVING");
break;
case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
Log.i(TAG, "onInfo: MEDIA_INFO_NOT_SEEKABLE");
break;
case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_METADATA_UPDATE");
break;
case MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE");
break;
case MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT ");
break;
default:
break;
}
return true;
}
};
private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.e(TAG, "Error happened, errorCode = " + extra);
final String errorTip;
switch(extra) {
case MediaPlayer.MEDIA_ERROR_IO:
/**
* SDK will do reconnecting automatically
*/
Log.e(TAG, "IO Error!");
return false;
case MediaPlayer.MEDIA_ERROR_MALFORMED:
errorTip = "Malformed bitstream!";
break;
case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
errorTip = "Unsupported bitstream!";
break;
case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
errorTip = "Timeout!";
break;
default:
errorTip = "unknown error !";
break;
}
if (errorTip != null) {
runOnUiThread(new Runnable() {
@Override
public void run() {
ToastUtils.s(PlaybackActivity.this, errorTip);
}
});
}
finish();
return true;
}
};
private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.i(TAG, "Play Completed !");
runOnUiThread(new Runnable() {
@Override
public void run() {
ToastUtils.s(PlaybackActivity.this, "Play Completed !");
}
});
finish();
}
};
private MediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.i(TAG, "onBufferingUpdate: " + percent);
}
};
private MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.i(TAG, "onVideoSizeChanged: width = " + width + ", height = " + height);
}
};
}
18
Source : AnotherRSS.java
with The Unlicense
from no-go
with The Unlicense
from no-go
/**
* Der Einstiegspunkt des Launchers.
* In der Applications-Klreplacede befinden sich auch die initalen
* Konfigurationen der SharedPreferences sowie einige Konstanten.
*
* @author Jochen Peters
*/
public clreplaced AnotherRSS extends Application {
public static boolean showAdditionalFeed = true;
public static String query = "";
public static MediaPlayer mediaPlayer;
public static MediaController mediaController;
public static final String urls = "http://www.tagesschau.de/xml/rss2 " + "http://www.taz.de/!p4608;rss/ " + "http://www.deutschlandfunk.de/die-nachrichten.353.de.rss " + "https://www.npo3.nl/blog.rss " + "http://digisocken.de/_p/wdrWetter/?rss=true " + "http://feeds.bbci.co.uk/news/world/europe/rss.xml " + "http://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml " + "http://feeds.t-online.de/rss/nachrichten " + "https://www.wz.de/feed.rss " + "https://www.heise.de/security/news/news-atom.xml " + "https://www.amnesty.de/rss/news " + "https://rp-online.de/panorama/wissen/feed.rss " + "http://feeds.reuters.com/Reuters/UKWorldNews " + "http://feeds.reuters.com/reuters/scienceNews?format=xml " + "https://www1.wdr.de/mediathek/audio/wdr5/wdr5-alles-in-butter/alles-in-butter106.podcast " + "https://www1.wdr.de/mediathek/audio/wdr5/polit-wg/polit-wg-104.podcast " + "https://www.tagesschau.de/export/video-podcast/webm/tagesschau-in-100-sekunden_https " + "https://thebugcast.org/feed/ogg " + "http://feeds.feedburner.com/daily_tech_news_show?format=xml " + "http://www.wetterleitstelle.de/nordrhein-westfalen.xml";
public static final boolean[] feedActive = { false, false, false, true, false, false, false, false, true, false, false, true, true, false, false, false, true, true, false, false };
public static clreplaced Config {
/**
* really delete old database entries (marked as deleted)
* older than Config.DEFAULT_expunge days
*/
public static final int DEFAULT_autodelete = 14;
public static final int DEFAULT_expunge = 5;
public static final String DEFAULT_rsssec = "10800";
public static final String DEFAULT_notifySound = "0";
public static final String DEFAULT_notifyColor = "#FF00FFFF";
public static final String DEFAULT_notifyType = "2";
public static final int DEFAULT_NIGHT_START = 18;
public static final int DEFAULT_NIGHT_STOP = 6;
public static final String SEARCH_HINT_COLOR = "#FFAA00";
public static final float DEFAULT_FONT_SIZE = 14.0f;
public static final int DEFAULT_MAX_IMG_WIDTH = 120;
public static final float IMG_ROUND = 15f;
public static final String DEFAULT_regexAll = "";
public static final String DEFAULT_regexTo = "";
public static final boolean DEFAULT_OFFLINEHINT = false;
/**
* sollte eine Verbindung nicht zu sande kommen, wird ein neuer
* Alarm in {@value #RETRYSEC_AFTER_OFFLINE} sec ausgelöst
*/
public static final long RETRYSEC_AFTER_OFFLINE = 75L;
}
public static Alarm alarm = null;
/**
* So kann der {@link Refresher} erkennen, ob er nur im Hintergrund läuft.
* Wäre withGui auf true, wird nur eine HeadUp Notifikation gezeigt.
* An dieser Stelle wird klar, dreplaced der Alarm <i>doch</i> auf this zugreifen kann (?)
*/
public static boolean withGui = false;
public static final String TAG = AnotherRSS.clreplaced.getSimpleName();
private static Context contextOfApplication;
@Override
public void onCreate() {
super.onCreate();
contextOfApplication = getApplicationContext();
mediaPlayer = new MediaPlayer();
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
if (!mPreferences.contains("rss_url")) {
mPreferences.edit().putString("rss_url", AnotherRSS.urls).commit();
PreferencesActivity.storeArray(feedActive, "rss_url_act", getApplicationContext());
} else {
if (!mPreferences.contains("rss_url_act_0")) {
String[] urls = mPreferences.getString("rss_url", AnotherRSS.urls).split(" ");
boolean[] act = new boolean[urls.length];
Arrays.fill(act, true);
PreferencesActivity.storeArray(act, "rss_url_act", getApplicationContext());
}
}
if (!mPreferences.contains("regexAll")) {
mPreferences.edit().putString("regexAll", Config.DEFAULT_regexAll).commit();
}
if (!mPreferences.contains("regexTo")) {
mPreferences.edit().putString("regexTo", Config.DEFAULT_regexTo).commit();
}
if (!mPreferences.contains("nightmode_use_start")) {
mPreferences.edit().putInt("nightmode_use_start", Config.DEFAULT_NIGHT_START).commit();
}
if (!mPreferences.contains("nightmode_use_stop")) {
mPreferences.edit().putInt("nightmode_use_stop", Config.DEFAULT_NIGHT_STOP).commit();
}
if (!mPreferences.contains("offline_hint")) {
mPreferences.edit().putBoolean("offline_hint", Config.DEFAULT_OFFLINEHINT).commit();
}
if (!mPreferences.contains("autodelete")) {
mPreferences.edit().putInt("autodelete", Config.DEFAULT_autodelete).commit();
}
if (alarm == null)
alarm = new Alarm();
}
public static Context getContextOfApplication() {
return contextOfApplication;
}
public static boolean inTimeSpan(int startH, int stopH) {
int nowH = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (startH == stopH && startH == nowH)
return true;
if (startH > stopH && (nowH <= stopH || nowH >= startH))
return true;
if (startH < stopH && nowH >= startH && nowH <= stopH)
return true;
return false;
}
}
18
Source : VideoPlayer.java
with Apache License 2.0
from djzhao627
with Apache License 2.0
from djzhao627
/**
* Created by djzhao on 17/04/29.
*/
public clreplaced VideoPlayer extends BaseActivity {
private VideoView videoView;
private MediaController mediaController;
private Context mContext;
private int tag;
private boolean videoStop;
private int currentPosition;
private String duration = "0";
@Override
protected void onCreate(Bundle paramBundle) {
super.onCreate(paramBundle);
tag = getIntent().getIntExtra("tag", 1);
setContentView(R.layout.activity_test_video_player);
findViewById();
initView();
}
@Override
protected void findViewById() {
this.videoView = $(R.id.player_test_vv);
}
@Override
protected void initView() {
mContext = this;
uiFlusHandler = new MyDialogHandler(mContext, "数据同步中...");
loadVideo();
}
private void loadVideo() {
// String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/movie.mp4";
String uri = "android.resource://" + getPackageName() + "/";
switch(tag) {
case 1:
duration = "8";
uri += R.raw.base;
break;
case 2:
duration = "9";
uri += R.raw.enhance;
break;
case 3:
duration = "11";
uri += R.raw.acme;
break;
}
// 本地视频
// videoView.setVideoPath(path);
// 网络视频
// videoView.setVideoURI(Uri.parse("http://www.runoob.com/try/demo_source/movie.mp4"));
videoView.setVideoURI(Uri.parse(uri));
mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setMediaPlayer(videoView);
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
videoStop = true;
saveTrainRecord();
}
});
videoView.start();
}
private void saveTrainRecord() {
uiFlusHandler.sendEmptyMessage(SHOW_LOADING_DIALOG);
String url = Constants.BASE_URL + "Train?method=addNewTrainRecord";
OkHttpUtils.post().url(url).id(1).addParams("userId", Constants.USER.getUserId() + "").addParams("duration", duration).build().execute(new MyStringCallback());
}
private void showInfo() {
String message = "";
switch(tag) {
case 1:
message = "“肌撕裂者-初级”";
break;
case 2:
message = "“肌撕裂者-中级”";
break;
case 3:
message = "“肌撕裂者-极致”";
break;
}
SystemClock.sleep(1000);
AlertDialog.Builder builder = new AlertDialog.Builder(VideoPlayer.this);
builder.setreplacedle("锻炼结束").setMessage("恭喜你," + message + "锻炼结束!").setPositiveButton("好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
}).create().show();
}
public clreplaced MyStringCallback extends StringCallback {
@Override
public void onResponse(String response, int id) {
uiFlusHandler.sendEmptyMessage(DISMISS_LOADING_DIALOG);
switch(id) {
case 1:
if (response.contains("error")) {
DisplayToast("锻炼记录同步失败");
}
showInfo();
break;
default:
DisplayToast("what?");
break;
}
}
@Override
public void onError(Call arg0, Exception arg1, int arg2) {
Toast.makeText(mContext, "网络链接出错!", Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (!videoStop) {
videoView.pause();
currentPosition = videoView.getCurrentPosition();
AlertDialog.Builder builder = new AlertDialog.Builder(VideoPlayer.this);
builder.setreplacedle("猛男").setMessage("你确定要放弃锻炼吗?").setPositiveButton("择日再战", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
}).setNegativeButton("我怎么可能半途而废", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
videoView.seekTo(currentPosition);
videoView.start();
}
}).create().show();
}
}
return super.onKeyDown(keyCode, event);
}
}
18
Source : PictureVideoPlayActivity.java
with Apache License 2.0
from Achenglove
with Apache License 2.0
from Achenglove
/**
* @author:luck
* @data:2017/8/28 下午11:00
* @描述: 视频播放类
*/
public clreplaced PictureVideoPlayActivity extends PictureBaseActivity implements MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, View.OnClickListener {
private String video_path = "";
private ImageView picture_left_back;
private MediaController mMediaController;
private VideoView mVideoView;
private ImageView iv_play;
private int mPositionWhenPaused = -1;
@Override
public boolean isImmersive() {
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
super.onCreate(savedInstanceState);
setContentView(R.layout.picture_activity_video_play);
video_path = getIntent().getStringExtra("video_path");
picture_left_back = findViewById(R.id.picture_left_back);
mVideoView = findViewById(R.id.video_view);
mVideoView.setBackgroundColor(Color.BLACK);
iv_play = findViewById(R.id.iv_play);
mMediaController = new MediaController(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setOnPreparedListener(this);
mVideoView.setMediaController(mMediaController);
picture_left_back.setOnClickListener(this);
iv_play.setOnClickListener(this);
}
@Override
public void onStart() {
// Play Video
mVideoView.setVideoPath(video_path);
mVideoView.start();
super.onStart();
}
@Override
public void onPause() {
// Stop video when the activity is pause.
mPositionWhenPaused = mVideoView.getCurrentPosition();
mVideoView.stopPlayback();
super.onPause();
}
@Override
protected void onDestroy() {
mMediaController = null;
mVideoView = null;
iv_play = null;
super.onDestroy();
}
@Override
public void onResume() {
// Resume video player
if (mPositionWhenPaused >= 0) {
mVideoView.seekTo(mPositionWhenPaused);
mPositionWhenPaused = -1;
}
super.onResume();
}
@Override
public boolean onError(MediaPlayer player, int arg1, int arg2) {
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
if (null != iv_play) {
iv_play.setVisibility(View.VISIBLE);
}
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.picture_left_back) {
finish();
} else if (id == R.id.iv_play) {
mVideoView.start();
iv_play.setVisibility(View.INVISIBLE);
}
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(new ContextWrapper(newBase) {
@Override
public Object getSystemService(String name) {
if (Context.AUDIO_SERVICE.equals(name)) {
return getApplicationContext().getSystemService(name);
}
return super.getSystemService(name);
}
});
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.setOnInfoListener((mp1, what, extra) -> {
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
// video started
mVideoView.setBackgroundColor(Color.TRANSPARENT);
return true;
}
return false;
});
}
}
17
Source : PreviewVideoActivity.java
with MIT License
from zhongjhATC
with MIT License
from zhongjhATC
/**
* 播放视频,用于录制后,在是否确认的界面中,播放视频
*/
private void playVideo(File file) {
mVVPreview.pause();
// mediaController 是底部控制条
MediaController mediaController = new MediaController(PreviewVideoActivity.this);
mediaController.setAnchorView(mVVPreview);
mediaController.setMediaPlayer(mVVPreview);
mediaController.setVisibility(View.GONE);
mVVPreview.setMediaController(mediaController);
Uri uri = Uri.fromFile(file);
mVVPreview.setVideoURI(uri);
// 这段代码需要放在更新视频文件后播放,不然会找不到文件。
mVVPreview.setVisibility(View.VISIBLE);
if (!mVVPreview.isPlaying()) {
mVVPreview.start();
}
mVVPreview.setOnCompletionListener(mediaPlayer -> {
// 循环播放
if (!mVVPreview.isPlaying()) {
mVVPreview.start();
}
});
}
17
Source : VideoPlayer.java
with GNU General Public License v3.0
from XecureIT
with GNU General Public License v3.0
from XecureIT
private void initializeVideoViewControls(@NonNull VideoView videoView) {
MediaController mediaController = new MediaController(getContext());
mediaController.setAnchorView(videoView);
mediaController.setMediaPlayer(videoView);
videoView.setMediaController(mediaController);
}
17
Source : ThemeManager.java
with GNU General Public License v3.0
from vassela
with GNU General Public License v3.0
from vassela
public void setMediaController(Context context, View view) {
if (view instanceof MediaController) {
MediaController v = (MediaController) view;
for (int i = 0; i < v.getChildCount(); i++) {
this.setMediaController(context, v.getChildAt(i));
}
} else if (view instanceof LinearLayout) {
LinearLayout ll = (LinearLayout) view;
for (int i = 0; i < ll.getChildCount(); i++) {
this.setMediaController(context, ll.getChildAt(i));
}
} else if (view instanceof SeekBar) {
((SeekBar) view).getProgressDrawable().mutate().setColorFilter(context.getResources().getColor(getColorTheme(context)), PorterDuff.Mode.SRC_IN);
}
}
17
Source : PlaybackActivity.java
with Apache License 2.0
from pili-engineering
with Apache License 2.0
from pili-engineering
public clreplaced PlaybackActivity extends Activity implements PLUploadResultListener, PLUploadProgressListener, MediaController.MediaPlayerControl {
private static final String TAG = "PlaybackActivity";
private static final String MP4_PATH = "MP4_PATH";
private static final String PREVIOUS_ORIENTATION = "PREVIOUS_ORIENTATION";
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private MediaPlayer mMediaPlayer;
private MediaController mMediaController;
private Button mUploadBtn;
private PLShortVideoUploader mVideoUploadManager;
private ProgressBar mProgressBarDeterminate;
private boolean mIsUpload = false;
private String mVideoPath;
private int mPreviousOrientation;
private int mSeekingPosition = 0;
public static void start(Activity activity, String mp4Path) {
Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
intent.putExtra(MP4_PATH, mp4Path);
activity.startActivity(intent);
}
public static void start(Activity activity, String mp4Path, int previousOrientation) {
Intent intent = new Intent(activity, PlaybackActivity.clreplaced);
intent.putExtra(MP4_PATH, mp4Path);
intent.putExtra(PREVIOUS_ORIENTATION, previousOrientation);
activity.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_replacedLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_playback);
PLUploadSetting uploadSetting = new PLUploadSetting();
uploadSetting.setHttpsEnabled(true);
mVideoUploadManager = new PLShortVideoUploader(getApplicationContext(), uploadSetting);
mVideoUploadManager.setUploadProgressListener(this);
mVideoUploadManager.setUploadResultListener(this);
mUploadBtn = (Button) findViewById(R.id.upload_btn);
mUploadBtn.setText(R.string.upload);
mUploadBtn.setOnClickListener(new UploadOnClickListener());
mProgressBarDeterminate = (ProgressBar) findViewById(R.id.progressBar);
mProgressBarDeterminate.setMax(100);
mVideoPath = getIntent().getStringExtra(MP4_PATH);
mPreviousOrientation = getIntent().getIntExtra(PREVIOUS_ORIENTATION, 1);
mMediaPlayer = new MediaPlayer();
if (mMediaPlayer != null) {
mMediaPlayer.setOnInfoListener(mOnInfoListener);
mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
mMediaPlayer.setOnErrorListener(mOnErrorListener);
} else {
Log.e(TAG, "creating MediaPlayer instance failed, exit.");
return;
}
mSurfaceView = (SurfaceView) findViewById(R.id.video);
mSurfaceView.setOnClickListener(v -> {
if (!mMediaController.isShowing()) {
mMediaController.show(0);
} else {
mMediaController.hide();
}
});
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer.setDisplay(mSurfaceHolder);
if (!"".equals(mVideoPath) && !mMediaPlayer.isPlaying()) {
try {
mMediaPlayer.reset();
mMediaPlayer.setLooping(true);
mMediaPlayer.setDataSource(mVideoPath);
mMediaPlayer.prepare();
mMediaPlayer.seekTo(mSeekingPosition);
} catch (IOException e) {
e.printStackTrace();
}
}
makeUpVideoPlayingSize();
mMediaPlayer.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mMediaPlayer.isPlaying()) {
mSeekingPosition = mMediaPlayer.getCurrentPosition();
mMediaPlayer.stop();
}
}
});
mMediaController = new MediaController(this);
mMediaController.setMediaPlayer(this);
mMediaController.setAnchorView(mSurfaceView);
}
private void makeUpVideoPlayingSize() {
int screenWidth, screenHeight, videoWidth, videoHeight, displayWidth, displayHeight;
float screenAspectRatio, videoAspectRatio;
WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(outMetrics);
screenWidth = outMetrics.widthPixels;
screenHeight = outMetrics.heightPixels;
screenAspectRatio = (float) screenHeight / screenWidth;
Log.i(TAG, "Screen size: " + screenWidth + " × " + screenHeight);
videoWidth = mMediaPlayer.getVideoWidth();
videoHeight = mMediaPlayer.getVideoHeight();
videoAspectRatio = (float) videoHeight / videoWidth;
Log.i(TAG, "Video size: " + screenWidth + " × " + screenHeight);
if (screenAspectRatio > videoAspectRatio) {
displayWidth = screenWidth;
displayHeight = (int) ((float) screenWidth / videoWidth * videoHeight);
} else {
displayWidth = (int) ((float) screenHeight / videoHeight * videoWidth);
displayHeight = screenHeight;
}
mSurfaceHolder.setFixedSize(displayWidth, displayHeight);
}
@Override
public void finish() {
if (0 == mPreviousOrientation) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
super.finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMediaPlayer.stop();
mMediaPlayer.release();
}
@Override
public void start() {
mMediaPlayer.start();
}
@Override
public void pause() {
mMediaPlayer.pause();
}
@Override
public int getDuration() {
return mMediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mMediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mMediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
public clreplaced UploadOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
if (!mIsUpload) {
mVideoUploadManager.startUpload(mVideoPath, Config.TOKEN);
mProgressBarDeterminate.setVisibility(View.VISIBLE);
mUploadBtn.setText(R.string.cancel_upload);
mIsUpload = true;
} else {
mVideoUploadManager.cancelUpload();
mProgressBarDeterminate.setVisibility(View.INVISIBLE);
mUploadBtn.setText(R.string.upload);
mIsUpload = false;
}
}
}
@Override
public void onUploadProgress(String fileName, double percent) {
mProgressBarDeterminate.setProgress((int) (percent * 100));
if (1.0 == percent) {
mProgressBarDeterminate.setVisibility(View.INVISIBLE);
}
}
public void copyToClipboard(String filePath) {
ClipData clipData = ClipData.newPlainText("VideoFilePath", filePath);
ClipboardManager clipboardManager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(clipData);
}
@Override
public void onUploadVideoSuccess(JSONObject response) {
try {
final String filePath = "http://" + Config.DOMAIN + "/" + response.getString("key");
copyToClipboard(filePath);
runOnUiThread(() -> ToastUtils.showLongToast(PlaybackActivity.this, "文件上传成功," + filePath + "已复制到粘贴板"));
mUploadBtn.setVisibility(View.INVISIBLE);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onUploadVideoFailed(final int statusCode, final String error) {
runOnUiThread(() -> ToastUtils.showLongToast(PlaybackActivity.this, "Upload failed, statusCode = " + statusCode + " error = " + error));
}
private MediaPlayer.OnInfoListener mOnInfoListener = new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Log.i(TAG, "OnInfo, what = " + what + ", extra = " + extra);
switch(what) {
case MediaPlayer.MEDIA_INFO_UNKNOWN:
break;
case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING:
break;
case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
Log.i(TAG, "video rendering start, ts = " + extra);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_BUFFERING_START");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
Log.i(TAG, "onInfo: MEDIA_INFO_BUFFERING_END");
break;
case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING:
Log.i(TAG, "onInfo: MEDIA_INFO_BAD_INTERLEAVING");
break;
case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE:
Log.i(TAG, "onInfo: MEDIA_INFO_NOT_SEEKABLE");
break;
case MediaPlayer.MEDIA_INFO_METADATA_UPDATE:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_METADATA_UPDATE");
break;
case MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBreplacedLE");
break;
case MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT:
Log.i(TAG, "onInfo: MediaPlayer.MEDIA_INFO_SUBreplacedLE_TIMED_OUT ");
break;
default:
break;
}
return true;
}
};
private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.e(TAG, "Error happened, errorCode = " + extra);
final String errorTip;
switch(extra) {
case MediaPlayer.MEDIA_ERROR_IO:
/**
* SDK will do reconnecting automatically
*/
Log.e(TAG, "IO Error!");
return false;
case MediaPlayer.MEDIA_ERROR_MALFORMED:
errorTip = "Malformed bitstream!";
break;
case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
errorTip = "Unsupported bitstream!";
break;
case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
errorTip = "Timeout!";
break;
default:
errorTip = "unknown error !";
break;
}
if (errorTip != null) {
runOnUiThread(() -> ToastUtils.showShortToast(PlaybackActivity.this, errorTip));
}
finish();
return true;
}
};
private MediaPlayer.OnCompletionListener mOnCompletionListener = mp -> {
Log.i(TAG, "Play Completed !");
runOnUiThread(() -> ToastUtils.showShortToast(PlaybackActivity.this, "Play Completed !"));
finish();
};
private MediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = (mp, percent) -> {
Log.i(TAG, "onBufferingUpdate: " + percent);
};
private MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = (mp, width, height) -> {
Log.i(TAG, "onVideoSizeChanged: width = " + width + ", height = " + height);
};
}
17
Source : VideoPlayerActivity.java
with Apache License 2.0
from liying2008
with Apache License 2.0
from liying2008
private void init() {
BaseConfig.sPositionWhenPaused = -1;
// Create media controller
MediaController mediaController = new MediaController(this);
// 设置MediaController
mVideoView.setMediaController(mediaController);
mVideoView.setOnCompletionListener(this);
mVideoView.setOnErrorListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mVideoView.setOnInfoListener(this);
} else {
mLoadingView.setVisibility(View.GONE);
}
mVideoView.setOnPreparedListener(this);
mGestureDetector = new GestureDetector(this, new MyGestureListener());
Uri uri = Uri.parse(mVideoUrl);
mVideoView.setVideoURI(uri);
}
17
Source : VideoViewH264mp4.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264mp4 extends SurfaceView implements LetvMediaPlayerControl {
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
private final int FORWARD_TIME;
private final int REWIND_TIME;
private String TAG;
private boolean enforcementPause;
private boolean enforcementWait;
protected int lastSeekWhenDestoryed;
private OnBufferingUpdateListener mBufferingUpdateListener;
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener;
private WeakReference<Context> mContext;
private int mCurrentBufferPercentage;
private int mCurrentState;
private int mDuration;
private OnErrorListener mErrorListener;
private OnInfoListener mInfoListener;
private MediaController mMediaController;
private MediaPlayer mMediaPlayer;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener;
private int mRatioType;
Callback mSHCallback;
private OnSeekCompleteListener mSeekCompleteListener;
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener;
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder;
private int mSurfaceWidth;
private int mTargetState;
private Uri mUri;
private int mVideoHeight;
private int mVideoWidth;
public VideoViewH264mp4(Context context) {
super(context);
this.TAG = "VideoViewH264mp4";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
this.mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
VideoViewH264mp4.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264mp4.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264mp4.this.mVideoWidth == 0 || VideoViewH264mp4.this.mVideoHeight == 0)) {
VideoViewH264mp4.this.getHolder().setFixedSize(VideoViewH264mp4.this.mVideoWidth, VideoViewH264mp4.this.mVideoHeight);
}
if (VideoViewH264mp4.this.mOnVideoSizeChangedListener != null) {
VideoViewH264mp4.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
}
}
};
this.mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(普通手机videoview) onPrepared()");
if (VideoViewH264mp4.this.mOnMediaStateTimeListener != null) {
VideoViewH264mp4.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264mp4.this.mCurrentState = 2;
VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
VideoViewH264mp4 videoViewH264mp4 = VideoViewH264mp4.this;
VideoViewH264mp4 videoViewH264mp42 = VideoViewH264mp4.this;
VideoViewH264mp4.this.mCanSeekForward = true;
videoViewH264mp42.mCanSeekBack = true;
videoViewH264mp4.mCanPause = true;
if (VideoViewH264mp4.this.mMediaController != null) {
VideoViewH264mp4.this.mMediaController.setEnabled(true);
}
VideoViewH264mp4.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264mp4.this.mVideoHeight = mp.getVideoHeight();
int seekToPosition = VideoViewH264mp4.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264mp4.this.seekTo(seekToPosition);
}
if (VideoViewH264mp4.this.mVideoWidth != 0 && VideoViewH264mp4.this.mVideoHeight != 0) {
VideoViewH264mp4.this.getHolder().setFixedSize(VideoViewH264mp4.this.mVideoWidth, VideoViewH264mp4.this.mVideoHeight);
if (VideoViewH264mp4.this.mSurfaceWidth == VideoViewH264mp4.this.mVideoWidth && VideoViewH264mp4.this.mSurfaceHeight == VideoViewH264mp4.this.mVideoHeight) {
if (VideoViewH264mp4.this.mTargetState == 3) {
VideoViewH264mp4.this.start();
if (VideoViewH264mp4.this.mMediaController != null) {
VideoViewH264mp4.this.mMediaController.show();
}
} else if (!VideoViewH264mp4.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264mp4.this.getCurrentPosition() > 0) && VideoViewH264mp4.this.mMediaController != null)) {
VideoViewH264mp4.this.mMediaController.show(0);
}
}
} else if (VideoViewH264mp4.this.mTargetState == 3) {
VideoViewH264mp4.this.start();
}
if (VideoViewH264mp4.this.mOnPreparedListener != null) {
VideoViewH264mp4.this.mOnPreparedListener.onPrepared(mp);
}
}
};
this.mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
LogTag.i("onCompletion()");
VideoViewH264mp4.this.mCurrentState = 5;
VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
VideoViewH264mp4.this.mTargetState = 5;
VideoViewH264mp4.this.mCurrentState = 6;
VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
if (VideoViewH264mp4.this.mMediaController != null) {
VideoViewH264mp4.this.mMediaController.hide();
}
if (VideoViewH264mp4.this.mOnCompletionListener != null) {
VideoViewH264mp4.this.mOnCompletionListener.onCompletion(mp);
}
}
};
this.mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
VideoViewH264mp4.this.mCurrentState = -1;
VideoViewH264mp4.this.StateChange(VideoViewH264mp4.this.mCurrentState);
VideoViewH264mp4.this.mTargetState = -1;
if (VideoViewH264mp4.this.mMediaController != null) {
VideoViewH264mp4.this.mMediaController.hide();
}
if (VideoViewH264mp4.this.mOnErrorListener != null) {
VideoViewH264mp4.this.mOnErrorListener.onError(mp, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewH264mp4(普通手机videoview) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewH264mp4.this.mOnMediaStateTimeListener != null) {
VideoViewH264mp4.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
return true;
}
};
this.mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264mp4.this.mCurrentBufferPercentage = percent;
if (VideoViewH264mp4.this.mOnBufferingUpdateListener != null) {
VideoViewH264mp4.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
this.mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
LogTag.i("onSeekComplete()");
if (VideoViewH264mp4.this.mOnSeekCompleteListener != null) {
VideoViewH264mp4.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264mp4.this.mMediaPlayer);
}
}
};
this.mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (VideoViewH264mp4.this.mOnInfoListener != null) {
VideoViewH264mp4.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
this.mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
VideoViewH264mp4.this.mSurfaceWidth = w;
VideoViewH264mp4.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264mp4.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264mp4.this.mVideoWidth == w && VideoViewH264mp4.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264mp4.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264mp4.this.mSeekWhenPrepared != 0) {
VideoViewH264mp4.this.seekTo(VideoViewH264mp4.this.mSeekWhenPrepared);
}
VideoViewH264mp4.this.start();
if (VideoViewH264mp4.this.mMediaController != null) {
VideoViewH264mp4.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceCreated()");
VideoViewH264mp4.this.mSurfaceHolder = holder;
VideoViewH264mp4.this.openVideo();
}
public void surfaceDestroyed(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceDestroyed()");
VideoViewH264mp4.this.mSurfaceHolder = null;
if (VideoViewH264mp4.this.mMediaController != null) {
VideoViewH264mp4.this.mMediaController.hide();
}
VideoViewH264mp4.this.lastSeekWhenDestoryed = VideoViewH264mp4.this.getCurrentPosition();
VideoViewH264mp4.this.release(true);
}
};
this.mContext = new WeakReference(context);
initVideoView();
}
public VideoViewH264mp4(Context context, AttributeSet attrs) {
this(context, attrs, 0);
this.mContext = new WeakReference(context);
initVideoView();
}
public VideoViewH264mp4(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.TAG = "VideoViewH264mp4";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
???;
???;
???;
???;
???;
???;
???;
???;
this.mContext = new WeakReference(context);
initVideoView();
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height < this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width + 3, height + 3);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String path) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(path);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(path));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(普通手机videoview) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null || this.mContext.get() == null) {
setVisibility(0);
return;
}
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
((Context) this.mContext.get()).sendBroadcast(i);
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(普通手机videoview) 创建MediaPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new MediaPlayer();
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource((Context) this.mContext.get(), this.mUri);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
StateChange(this.mCurrentState);
attachMediaController();
} catch (IOException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException ex2) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264mp4 release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public void start() {
if (this.mContext.get() != null) {
HttpRequestManager.getInstance((Context) this.mContext.get()).requestCapability();
if (this.enforcementWait || this.enforcementPause) {
StateChange(7);
} else if (isInPlaybackState()) {
LogTag.i("start() Mp4系统播放器开始播放");
this.mMediaPlayer.start();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264mp4(普通手机videoview) start()");
this.mCurrentState = 3;
StateChange(this.mCurrentState);
}
this.mTargetState = 3;
}
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
LogTag.i("pause()");
this.mMediaPlayer.pause();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264mp4(普通手机videoview) pause()");
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
}
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public void seekTo(int msec) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(msec);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = msec;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public void stopPlayback() {
LogTag.i("stopPlayback()");
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264mp4 stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264mp4 release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
if (this.mOnVideoViewStateChangeListener != null) {
this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
this.mOnVideoViewStateChangeListener = videoViewListener;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
}
public int getAudioSessionId() {
return 0;
}
public void setOnCacheListener(OnCacheListener l) {
}
public void setOnFirstPlayListener(OnFirstPlayLitener l) {
}
public int setSourceType(int sourceType) {
return 0;
}
public int setMachineInfomation(float ScreenResolution) {
return 0;
}
public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
return 0;
}
public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
return 0;
}
public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
return 0;
}
public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
return 0;
}
public int setgravity_yroValidInfomation(boolean gravityValid) {
return 0;
}
public int setAngleInit() {
return 0;
}
public int setTwoFingerZoom(float zoom) {
return 0;
}
public void setInitPosition(int msec) {
}
public void setVolume(int volume) {
}
public void setCacheTime(double start_cache, double block_cache) {
}
public void processSensorEvent(SensorEvent sensorEvent) {
}
}
17
Source : DVEasyVideoPlayActivity.java
with Apache License 2.0
from Devil-Chen
with Apache License 2.0
from Devil-Chen
/**
* 简易视频播放
*/
public clreplaced DVEasyVideoPlayActivity extends AppCompatActivity implements View.OnClickListener {
// 根布局
private View rootView;
// 视频地址
private String videoPath;
// 返回按钮
private RelativeLayout rl_back;
// 播放view
private VideoView videoView;
private MediaController mediaController;
/**
* 打开视频播放
* @param mContext
* @param path
*/
public static void openVideo(Context mContext, String path) {
Intent intent = new Intent(mContext, DVEasyVideoPlayActivity.clreplaced);
intent.putExtra("videoPath", path);
mContext.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setFullScreen();
rootView = LayoutInflater.from(this).inflate(R.layout.activity_dv_esay_video_play, null);
setContentView(rootView);
initView();
initData();
}
/**
* 设置全屏
*/
private void setFullScreen() {
// 隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_replacedLE);
// 隐藏状态栏
// 定义全屏参数
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
// 获得当前窗体对象
Window window = this.getWindow();
// 设置当前窗体为全屏显示
window.setFlags(flag, flag);
}
/**
* 初始化控件
*/
private void initView() {
videoView = (VideoView) findViewById(R.id.videoView);
rl_back = findViewById(R.id.rl_back);
rl_back.setOnClickListener(this);
}
/**
* 初始化数据
*/
private void initData() {
// 加载指定的视频文件
videoPath = getIntent().getStringExtra("videoPath");
if (TextUtils.isEmpty(videoPath)) {
Toast.makeText(this, "视频地址为空无法播放", Toast.LENGTH_SHORT).show();
finish();
}
videoView.setVideoPath(videoPath);
// 创建MediaController对象
mediaController = new MediaController(this);
// VideoView与MediaController建立关联
videoView.setMediaController(mediaController);
// 让VideoView获取焦点
videoView.requestFocus();
// 开始播放
videoView.start();
// 显示进度条
rootView.postDelayed(new Runnable() {
@Override
public void run() {
mediaController.show();
}
}, 100);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.rl_back) {
finish();
}
}
}
17
Source : MovieView.java
with MIT License
from developerfromjokela
with MIT License
from developerfromjokela
public clreplaced MovieView extends MotionEyeActivity {
private String TAG = this.getClreplaced().getSimpleName();
private Toolbar toolbar;
private MotionEyeMediaPlayer videoView;
private MediaController mc;
ProgressDialog mProgressDialog;
private String filename;
private String url;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movie_view);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Intent intent = getIntent();
if (intent.getExtras() != null) {
String baseurl = intent.getStringExtra("baseurl");
CameraUser user = (CameraUser) intent.getSerializableExtra("user");
camera = (Camera) intent.getSerializableExtra("camera");
Media media = (Media) intent.getSerializableExtra("media");
filename = media.getPath().split("/")[media.getPath().split("/").length - 1];
setreplacedle(filename);
try {
url = baseurl + "/movie/" + camera.getId() + "/playback" + media.getPath() + "?_=" + new Date().getTime();
MotionEyeHelper helper = new MotionEyeHelper();
helper.setUsername(user.getUsername());
helper.setPreplacedwordHash(user.getPreplacedword());
url = helper.addAuthParams("GET", url, "");
Log.e("RA", url);
videoView = findViewById(R.id.videoView);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.e("MovView", "Load done!");
findViewById(R.id.loadingLayout).setVisibility(View.GONE);
}
});
videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
snack(getString(R.string.video_playback_error, String.valueOf(i)));
findViewById(R.id.loadingLayout).setVisibility(View.GONE);
return true;
}
});
mc = new MediaController(this);
mc.show(500);
mc.setAnchorView(videoView);
mc.setMediaPlayer(videoView);
Uri video = Uri.parse(url);
videoView.setMediaController(mc);
videoView.getBufferPercentage();
videoView.setVideoURI(video);
videoView.requestFocus();
videoView.start();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
} else
finish();
}
private boolean checkForPermissions() {
int result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
return (result == PackageManager.PERMISSION_GRANTED);
}
private long downloadVideo(String url, String filename, Camera camera) {
if (!checkForPermissions()) {
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 101);
}
/*DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setreplacedle(filename);
request.setDescription(getString(R.string.downloading_recording_from, camera.getName()));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.allowScanningByMediaScanner();
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,filename);*/
// declare the dialog as a member field of your activity
// instantiate it within the onCreate method
mProgressDialog = new ProgressDialog(MovieView.this);
mProgressDialog.setreplacedle(filename);
mProgressDialog.setMessage(getString(R.string.downloading_recording_from, camera.getName()));
mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);
// execute this when the downloader must be fired
final DownloadTask downloadTask = new DownloadTask(MovieView.this);
downloadTask.execute(url, filename);
mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// cancel the task
downloadTask.cancel(true);
}
});
return 0;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.movie_view, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
menu.gereplacedem(1).setVisible(true);
}
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.gereplacedemId() == R.id.fullscreen) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
toggleHideyBar();
}
} else if (item.gereplacedemId() == R.id.download_video) {
long val = downloadVideo(url, filename, camera);
Log.e(TAG, "DOWNLOAD VAL: " + val);
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 101) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// granted
long val = downloadVideo(url, filename, camera);
Log.e(TAG, "DOWNLOAD VAL: " + val);
} else {
// not granted
snack(getString(R.string.allow_permissions));
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
/**
* Detects and toggles immersive mode (also known as "hidey bar" mode).
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void toggleHideyBar() {
// BEGIN_INCLUDE (get_current_ui_flags)
// The UI options currently enabled are represented by a bitfield.
// getSystemUiVisibility() gives us that bitfield.
int uiOptions = getWindow().getDecorView().getSystemUiVisibility();
int newUiOptions = uiOptions;
// END_INCLUDE (get_current_ui_flags)
// BEGIN_INCLUDE (toggle_ui_flags)
boolean isImmersiveModeEnabled = ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
if (isImmersiveModeEnabled) {
Log.i(TAG, "Turning immersive mode mode off. ");
} else {
toolbar.setVisibility(View.GONE);
Log.i(TAG, "Turning immersive mode mode on.");
mc.hide();
videoView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
toolbar.setVisibility(View.VISIBLE);
}
});
}
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
// Status bar hiding: Backwards compatible to Jellybean
if (Build.VERSION.SDK_INT >= 16) {
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
}
// Immersive mode: Backward compatible to KitKat.
// Note that this flag doesn't do anything by itself, it only augments the behavior
// of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample
// all three flags are being toggled together.
// Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
// Sticky immersive mode differs in that it makes the navigation and status bars
// semi-transparent, and the UI flag does not get cleared when the user interacts with
// the screen.
if (Build.VERSION.SDK_INT >= 18) {
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
// END_INCLUDE (set_ui_flags)
}
private clreplaced DownloadTask extends AsyncTask<String, Integer, String> {
private Context context;
private PowerManager.WakeLock mWakeLock;
public DownloadTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(String... sUrl) {
InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
// expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage();
}
// this will be useful to display download percentage
// might be -1: server did not report the length
int fileLength = connection.getContentLength();
// download the file
input = connection.getInputStream();
output = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + sUrl[1]);
byte[] data = new byte[4096];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
if (isCancelled()) {
input.close();
return null;
}
total += count;
// publishing the progress....
if (// only if total length is known
fileLength > 0)
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
} catch (Exception e) {
e.printStackTrace();
return e.toString();
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
}
if (connection != null)
connection.disconnect();
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// take CPU lock to prevent CPU from going off if the user
// presses the power button during download
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClreplaced().getName());
mWakeLock.acquire();
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
// if we get here, length is known, now set indeterminate to false
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result) {
mWakeLock.release();
mProgressDialog.dismiss();
if (result != null)
snack(getString(R.string.download_error, result));
else
snack(getString(R.string.video_downloaded));
}
}
}
17
Source : CometChatMediaViewActivity.java
with MIT License
from cometchat-pro
with MIT License
from cometchat-pro
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cometchat_media_view);
handleIntent();
mediaPlayer = new MediaPlayer();
toolbar = findViewById(R.id.toolbar);
toolbar.getNavigationIcon().setTint(getResources().getColor(R.color.textColorWhite));
toolbar.setreplacedle(senderName);
toolbar.setSubreplacedle(Utils.getLastMessageDate(sentAt));
imageMessage = findViewById(R.id.image_message);
videoMessage = findViewById(R.id.video_message);
audioMessage = findViewById(R.id.audio_message);
mediaSize = findViewById(R.id.media_size_tv);
playBtn = findViewById(R.id.playBtn);
if (mediaType.equals(CometChatConstants.MESSAGE_TYPE_IMAGE)) {
Glide.with(this).asBitmap().load(mediaUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
imageMessage.setImageBitmap(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
imageMessage.setVisibility(View.VISIBLE);
} else if (mediaType.equals(CometChatConstants.MESSAGE_TYPE_VIDEO)) {
MediaController mediacontroller = new MediaController(this);
mediacontroller.setAnchorView(videoMessage);
videoMessage.setMediaController(mediacontroller);
videoMessage.setVideoURI(Uri.parse(mediaUrl));
videoMessage.setVisibility(View.VISIBLE);
} else if (mediaType.equals(CometChatConstants.MESSAGE_TYPE_AUDIO)) {
mediaPlayer.reset();
mediaSize.setText(Utils.getFileSize(mSize));
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mediaPlayer.setDataSource(mediaUrl);
mediaPlayer.prepare();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
playBtn.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}
});
} catch (Exception e) {
Log.e(TAG, "MediaPlayerError: " + e.getMessage());
}
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
playBtn.setImageResource(R.drawable.ic_pause_24dp);
} else {
mediaPlayer.pause();
playBtn.setImageResource(R.drawable.ic_play_arrow_black_24dp);
}
}
});
audioMessage.setVisibility(View.VISIBLE);
}
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
17
Source : GabrielClientActivity.java
with Apache License 2.0
from cmusatyalab
with Apache License 2.0
from cmusatyalab
public clreplaced GabrielClientActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private static final String LOG_TAG = "GabrielClientActivity";
private static final int REQUEST_CODE = 1000;
private static int DISPLAY_WIDTH = 640;
private static int DISPLAY_HEIGHT = 480;
private static int BITRATE = 1 * 1024 * 1024;
private static final int MEDIA_TYPE_IMAGE = 1;
private static final int MEDIA_TYPE_VIDEO = 2;
// major components for streaming sensor data and receiving information
String serverIP = null;
private String styleType = "?";
private OpenrtistComm openrtistComm;
private boolean isRunning = false;
private boolean isFirstExperiment = true;
private List<int[]> supportingFPS = null;
private boolean isSurfaceReady = false;
private boolean waitingToStart = false;
private boolean isPreviewing = false;
public byte[] reusedBuffer = null;
private TextureView preview;
private SurfaceTexture mSurfaceTexture;
private MediaController mediaController = null;
private int mScreenDensity;
private MediaProjectionManager mProjectionManager;
private MediaProjection mMediaProjection;
private VirtualDisplay mVirtualDisplay;
private MediaRecorder mMediaRecorder;
private boolean capturingScreen = false;
private boolean recordingInitiated = false;
private String mOutputPath = null;
// views
private ImageView imgView = null;
private ImageView stereoView1 = null;
private ImageView stereoView2 = null;
private ImageView iconView = null;
private Handler iterationHandler = null;
private Handler fpsHandler = null;
private int cameraId = 0;
private boolean imageRotate = false;
private TextView fpsLabel = null;
private boolean cleared = false;
private int framesProcessed = 0;
private EngineInput engineInput;
final private Object engineInputLock = new Object();
private FrameSupplier frameSupplier = new FrameSupplier(this);
private Session session;
private Config config;
private ArFragment arFragment;
private ArSceneView sceneView;
private Scene scene;
private Image image;
private Image depth_map;
private Image img;
SeekBar simpleSeekBar;
private int depth_threshold = 0;
private ArrayAdapter<String> spinner_adapter = null;
private List<String> styleDescriptions = new ArrayList<>(Arrays.asList("Clear Display"));
public List<String> getStyleDescriptions() {
return styleDescriptions;
}
private List<String> styleIds = new ArrayList<>(Arrays.asList("none"));
public List<String> getStyleIds() {
return styleIds;
}
// Background threads based on
// https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L652
/**
* Thread for running tasks that shouldn't block the UI.
*/
private HandlerThread backgroundThread;
/**
* A {@link Handler} for running tasks in the background.
*/
private Handler backgroundHandler;
/**
* Starts a background thread and its {@link Handler}.
*/
private void startBackgroundThread() {
backgroundThread = new HandlerThread("ImageUpload");
backgroundThread.start();
backgroundHandler = new Handler(backgroundThread.getLooper());
backgroundHandler.post(imageUpload);
}
/**
* Stops the background thread and its {@link Handler}.
*/
private void stopBackgroundThread() {
openrtistComm.stop();
backgroundThread.quitSafely();
// Will stop backgroundThread.join() from blocking if backgroundThread is currently blocked
// on a call to wait()
backgroundThread.interrupt();
try {
backgroundThread.join();
backgroundThread = null;
backgroundHandler = null;
} catch (InterruptedException e) {
Log.e(LOG_TAG, "Problem stopping background thread", e);
}
}
private Runnable imageUpload = new Runnable() {
@Override
public void run() {
openrtistComm.sendSupplier(GabrielClientActivity.this.frameSupplier);
if (isRunning) {
backgroundHandler.post(imageUpload);
}
}
};
// local execution
private boolean runLocally = false;
private LocalTransfer localRunner = null;
private HandlerThread localRunnerThread = null;
private Handler localRunnerThreadHandler = null;
private volatile boolean localRunnerBusy = false;
private RenderScript rs = null;
private Bitmap localRunnerBitmapCache = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
isRunning = true;
Log.v(LOG_TAG, "++onCreate");
super.onCreate(savedInstanceState);
Const.STYLES_RETRIEVED = false;
Const.ITERATION_STARTED = false;
if (Const.STEREO_ENABLED) {
setContentView(R.layout.activity_stereo);
} else {
setContentView(R.layout.activity_main);
// Spinner element
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner_adapter = new ArrayAdapter<String>(this, R.layout.mylist, styleDescriptions);
// Spinner click listener
spinner.setOnItemSelectedListener(this);
spinner.setAdapter(spinner_adapter);
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
stereoView1 = (ImageView) findViewById(R.id.guidance_image1);
// styleView1 = (ImageView) findViewById(R.id.style_image1);
stereoView2 = (ImageView) findViewById(R.id.guidance_image2);
imgView = (ImageView) findViewById(R.id.guidance_image);
iconView = (ImageView) findViewById(R.id.style_image);
fpsLabel = (TextView) findViewById(R.id.fpsLabel);
// initiate views
simpleSeekBar = (SeekBar) findViewById(R.id.seekBar);
((TextView) findViewById(R.id.depthLabel)).setText(GabrielClientActivity.this.getApplicationContext().getString(R.string.depth_toast, Float.valueOf(0)));
// perform seek bar change listener event used for getting the progress value
simpleSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
depth_threshold = progress;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
TextView depthLabel = (TextView) findViewById(R.id.depthLabel);
depthLabel.setText(GabrielClientActivity.this.getApplicationContext().getString(R.string.depth_toast, Float.valueOf(depth_threshold) / 1000));
}
});
if (Const.SHOW_RECORDER) {
final ImageView recButton = (ImageView) findViewById(R.id.imgRecord);
recButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (capturingScreen) {
((ImageView) findViewById(R.id.imgRecord)).setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_videocam_24px));
stopRecording();
MediaActionSound m = new MediaActionSound();
m.play(MediaActionSound.STOP_VIDEO_RECORDING);
} else {
recordingInitiated = true;
MediaActionSound m = new MediaActionSound();
m.play(MediaActionSound.START_VIDEO_RECORDING);
((ImageView) findViewById(R.id.imgRecord)).setImageDrawable(getResources().getDrawable(R.drawable.ic_baseline_videocam_off_24px));
initRecorder();
shareScreen();
}
recButton.performHapticFeedback(android.view.HapticFeedbackConstants.LONG_PRESS);
}
});
final ImageView screenshotButton = (ImageView) findViewById(R.id.imgScreenshot);
screenshotButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bitmap b = Screenshot.takescreenshotOfRootView(imgView);
storeScreenshot(b, getOutputMediaFile(MEDIA_TYPE_IMAGE).getPath());
screenshotButton.performHapticFeedback(android.view.HapticFeedbackConstants.LONG_PRESS);
}
});
} else if (!Const.STEREO_ENABLED) {
// this view doesn't exist when stereo is enabled (activity_stereo.xml)
findViewById(R.id.imgRecord).setVisibility(View.GONE);
findViewById(R.id.imgScreenshot).setVisibility(View.GONE);
}
if (Const.ITERATE_STYLES) {
if (!Const.STEREO_ENABLED) {
final ImageView playpauseButton = (ImageView) findViewById(R.id.imgPlayPause);
playpauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Const.ITERATION_STARTED == false) {
Const.ITERATION_STARTED = true;
playpauseButton.setImageResource(R.drawable.ic_pause);
Toast.makeText(playpauseButton.getContext(), getString(R.string.iteration_started), Toast.LENGTH_LONG).show();
} else {
Const.ITERATION_STARTED = false;
playpauseButton.setImageResource(R.drawable.ic_play);
Toast.makeText(playpauseButton.getContext(), getString(R.string.iteration_stopped), Toast.LENGTH_LONG).show();
}
playpauseButton.performHapticFeedback(android.view.HapticFeedbackConstants.LONG_PRESS);
}
});
findViewById(R.id.spinner).setVisibility(View.GONE);
} else {
// artificially start iteration since we don't display
// any buttons in stereo view
Const.ITERATION_STARTED = true;
}
iterationHandler = new Handler();
iterationHandler.postDelayed(styleIterator, 100);
} else {
ImageView playpauseButton = (ImageView) findViewById(R.id.imgPlayPause);
playpauseButton.setVisibility(View.GONE);
}
if (Const.SHOW_FPS) {
findViewById(R.id.fpsLabel).setVisibility(View.VISIBLE);
fpsHandler = new Handler();
fpsHandler.postDelayed(fpsCalculator, 1000);
}
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mScreenDensity = metrics.densityDpi;
mMediaRecorder = new MediaRecorder();
mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
// setup local execution if needed
if (Const.SERVER_IP.equals(getString(R.string.local_execution_dns_placeholder))) {
runLocally = true;
styleDescriptions.add("Going to Work (L.S. Lowry)");
styleDescriptions.add("Mosaic (Unknown)");
styleDescriptions.add("The Scream (Edvard Munch)");
styleDescriptions.add("Starry Night (Vincent Van Gogh)");
styleDescriptions.add("Weeping Woman (Pablo Picreplacedo)");
styleIds.add("going_to_work");
styleIds.add("mosaic");
styleIds.add("the_scream");
styleIds.add("starry-night");
styleIds.add("weeping_woman");
Const.STYLES_RETRIEVED = true;
localRunner = new LocalTransfer(Const.IMAGE_WIDTH, Const.IMAGE_HEIGHT);
rs = RenderScript.create(this);
}
}
private void storeScreenshot(Bitmap bitmap, String path) {
OutputStream out = null;
File imageFile = new File(path);
try {
MediaActionSound m = new MediaActionSound();
m.play(MediaActionSound.SHUTTER_CLICK);
out = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageFile)));
Toast.makeText(this, getString(R.string.screenshot_taken, path), Toast.LENGTH_LONG).show();
out.close();
} catch (IOException e) {
Log.e(LOG_TAG, "IOException when attempting to store screenshot", e);
}
}
private Runnable styleIterator = new Runnable() {
private int position = 1;
@Override
public void run() {
if (Const.STYLES_RETRIEVED && Const.ITERATION_STARTED) {
// wait until styles are retrieved before iterating
if (++position == styleIds.size())
position = 1;
styleType = styleIds.get(position);
if (runLocally) {
localRunnerThreadHandler.post(new Runnable() {
@Override
public void run() {
try {
localRunner.load(getApplicationContext(), String.format("%s.pt", styleType));
} catch (FileNotFoundException e) {
styleType = "none";
AlertDialog.Builder builder = new AlertDialog.Builder(GabrielClientActivity.this, AlertDialog.THEME_HOLO_DARK);
builder.setMessage("Style Not Found Locally").setreplacedle("Failed to Load Style");
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
}
Toast.makeText(getApplicationContext(), styleDescriptions.get(position), Toast.LENGTH_SHORT).show();
if (Const.STEREO_ENABLED) {
if (stereoView1.getVisibility() == View.INVISIBLE) {
stereoView1.setVisibility(View.VISIBLE);
stereoView2.setVisibility(View.VISIBLE);
}
} else {
if (Const.DISPLAY_REFERENCE) {
iconView.setVisibility(View.VISIBLE);
}
if (imgView.getVisibility() == View.INVISIBLE) {
imgView.setVisibility(View.VISIBLE);
}
}
iterationHandler.postDelayed(this, 1000 * Const.ITERATE_INTERVAL);
} else {
iterationHandler.postDelayed(this, 100);
}
}
};
@Override
protected void onResume() {
Log.v(LOG_TAG, "++onResume");
super.onResume();
initOnce();
Intent intent = getIntent();
serverIP = intent.getStringExtra("SERVER_IP");
initPerRun(serverIP);
}
@Override
protected void onPause() {
Log.v(LOG_TAG, "++onPause");
if (iterationHandler != null)
iterationHandler.removeCallbacks(styleIterator);
if (capturingScreen)
stopRecording();
this.terminate();
super.onPause();
}
@Override
protected void onDestroy() {
Log.v(LOG_TAG, "++onDestroy");
if (iterationHandler != null)
iterationHandler.removeCallbacks(styleIterator);
if (capturingScreen)
stopRecording();
super.onDestroy();
}
/**
* Creates a media file in the {@code Environment.DIRECTORY_PICTURES} directory. The directory
* is persistent and available to other applications like gallery.
*
* @param type Media type. Can be video or image.
* @return A file object pointing to the newly created file.
*/
public static File getOutputMediaFile(int type) {
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {
return null;
}
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "OpenRTiST");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d(LOG_TAG, "failed to create media directory");
return null;
}
}
// Create a media file name
String pattern = "yyyyMMdd_HHmmss";
String timeStamp = new SimpleDateFormat(pattern, Locale.US).format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE) {
mediaFile = new File(mediaStorageDir.getPath(), "IMG_" + timeStamp + ".jpg");
} else if (type == MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath(), "VID_" + timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != REQUEST_CODE) {
Log.e(LOG_TAG, "Unknown request code: " + requestCode);
return;
}
if (resultCode != RESULT_OK) {
Toast.makeText(this, "Screen Cast Permission Denied", Toast.LENGTH_SHORT).show();
return;
}
mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
mVirtualDisplay = createVirtualDisplay();
mMediaRecorder.start();
capturingScreen = true;
if (Const.ITERATE_STYLES)
iterationHandler.postDelayed(styleIterator, 100 * Const.ITERATE_INTERVAL);
}
private void shareScreen() {
if (mMediaProjection == null) {
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
return;
}
}
private VirtualDisplay createVirtualDisplay() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
mScreenDensity = metrics.densityDpi;
return mMediaProjection.createVirtualDisplay("MainActivity", DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null, /*Callbacks*/
null);
}
private void initRecorder() {
try {
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mOutputPath = getOutputMediaFile(MEDIA_TYPE_VIDEO).getPath();
mMediaRecorder.setOutputFile(mOutputPath);
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setVideoEncodingBitRate(BITRATE);
mMediaRecorder.setVideoFrameRate(24);
mMediaRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "Problem with recorder", e);
}
}
private void stopRecording() {
mMediaRecorder.stop();
mMediaRecorder.reset();
Log.v(LOG_TAG, "Recording Stopped");
Toast.makeText(this, getString(R.string.recording_complete, mOutputPath), Toast.LENGTH_LONG).show();
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(mOutputPath))));
mMediaProjection = null;
stopScreenSharing();
}
private void stopScreenSharing() {
if (mVirtualDisplay == null) {
return;
}
mVirtualDisplay.release();
// mMediaRecorder.release(); //If used: mMediaRecorder object cannot
// be reused again
destroyMediaProjection();
capturingScreen = false;
}
private void destroyMediaProjection() {
if (mMediaProjection != null) {
mMediaProjection.stop();
mMediaProjection = null;
}
Log.i(LOG_TAG, "MediaProjection Stopped");
}
/**
* Does initialization for the entire application.
*/
private void initOnce() {
Log.v(LOG_TAG, "++initOnce");
if (Const.SENSOR_VIDEO) {
// preview = (CameraPreview) findViewById(R.id.camera_preview);
if (Const.STEREO_ENABLED)
preview = (TextureView) findViewById(R.id.camera_preview1);
else
preview = (TextureView) findViewById(R.id.camera_preview);
}
// get ARFragment instance to use SceneForm functions with ARCore
try {
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
arFragment.getPlaneDiscoveryController().hide();
sceneView = arFragment.getArSceneView();
scene = sceneView.getScene();
session = new Session(this);
sceneView.setupSession(session);
while (session == null) {
Log.v("CHECKPOINT FAILED: ", "null session");
}
Config config = new Config(session);
config.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE);
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
config.setDepthMode(Config.DepthMode.AUTOMATIC);
} else {
Log.v("CHECKPOINT FAILED: ", "DepthMode NOT Supported");
}
session.configure(config);
} catch (Exception e) {
e.printStackTrace();
}
// ensures that the update listener is called whenever the camera frame updates
scene.addOnUpdateListener(frameTime -> {
if (isRunning) {
// obtain the current frame from ARSession
Frame frame = sceneView.getArFrame();
if (styleType.equals("?") || !styleType.equals("none")) {
if (GabrielClientActivity.this.openrtistComm != null) {
// cloudlet execution
synchronized (GabrielClientActivity.this.engineInputLock) {
try {
// obtain the camera image
image = frame.acquireCameraImage();
if (image == null) {
Log.v("CHECKPOINT FAILED: ", "cameraimage null");
return;
}
if (image.getFormat() != ImageFormat.YUV_420_888) {
Log.v("CHECKPOINT FAILED: ", "Expected cameraimage in YUV_420_888 format, got format:" + image.getFormat());
return;
}
byte[] imageBytes = imageToByte(image);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
image.close();
// obtain the depth map if depth mode is supported
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
depth_map = frame.acquireDepthImage();
if (depth_map == null) {
Log.v("CHECKPOINT FAILED: ", "depth_map null");
return;
}
if (depth_map.getFormat() != ImageFormat.DEPTH16) {
Log.v("CHECKPOINT FAILED: ", "Expected depth_map in DEPTH16 format, got format:" + depth_map.getFormat());
return;
}
byte[] depthBytes = DEPTH16toBYTEs(depth_map);
depth_map.close();
// create engineInput for generating protobuf later and send data to server
GabrielClientActivity.this.engineInput = new EngineInput(imageBytes, depthBytes, imageHeight, imageWidth, styleType, depth_threshold);
GabrielClientActivity.this.engineInputLock.notifyAll();
// Log.v("CHECKPOINT SUCCESS", "GabrielClientActivity addOnUpdateListener");
} else {
// send depth as null and only send the image if depth mode is not supported
// replacedign the depth threshold as -1 as an indicator that the protobuf will not contain depth_map
GabrielClientActivity.this.engineInput = new EngineInput(imageBytes, null, imageHeight, imageWidth, styleType, -1);
GabrielClientActivity.this.engineInputLock.notifyAll();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} else {
GabrielClientActivity.this.engineInput = null;
Log.v(LOG_TAG, "Display Cleared");
try {
if (img != null) {
img.close();
}
img = frame.acquireCameraImage();
byte[] bytes = imageToByte(img);
final Bitmap camView = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
this.imgView = (ImageView) this.findViewById(R.id.guidance_image);
this.imgView.setVisibility(View.VISIBLE);
this.imgView.setImageBitmap(camView);
} catch (NotYetAvailableException e) {
e.printStackTrace();
}
}
}
});
// Media controller
if (mediaController == null) {
mediaController = new MediaController(this);
}
isRunning = true;
}
public EngineInput getEngineInput() {
synchronized (this.engineInputLock) {
try {
while (isRunning && this.engineInput == null) {
engineInputLock.wait();
}
// Log.v("CHECKPOINT SUCCESS", "GabrielClientActivity getEngineInput NOTIFIED");
EngineInput inputToSend = this.engineInput;
// Prevent sending the same frame again
this.engineInput = null;
return inputToSend;
} catch (/* InterruptedException */
Exception e) {
Log.e(LOG_TAG, "Error waiting for engine input", e);
return null;
}
}
}
/**
* Does initialization before each run (connecting to a specific server).
*/
private void initPerRun(String serverIP) {
Log.v(LOG_TAG, "++initPerRun");
// don't connect to cloudlet if running locally
// if a mobile only run is specified
if (runLocally) {
if ((localRunnerThread != null) && (localRunnerThread.isAlive())) {
localRunnerThread.quitSafely();
localRunnerThread.interrupt();
}
localRunnerThread = new HandlerThread("LocalTransferThread");
localRunnerThread.start();
localRunnerThreadHandler = new Handler(localRunnerThread.getLooper());
localRunnerBusy = false;
return;
}
if (serverIP == null)
return;
this.setupComm();
this.startBackgroundThread();
}
int getPort() {
// make sure there is a scheme before we use URI.create()
String endpoint = this.serverIP;
if (!endpoint.matches("^[a-zA-Z]+://.*$")) {
endpoint = "ws://" + endpoint;
}
int port = URI.create(endpoint).getPort();
if (port == -1) {
return Const.PORT;
}
return port;
}
void setupComm() {
int port = getPort();
Log.d("CHECKPOINT: ", "Port_discovery ServerIP " + serverIP);
Log.d("CHECKPOINT: ", "Port_discovery PORT: " + port);
Consumer<ByteString> imageViewUpdater = new ImageViewUpdater(this.imgView);
this.openrtistComm = OpenrtistComm.createOpenrtistComm(this.serverIP, port, this, this.iconView, imageViewUpdater, Const.TOKEN_LIMIT);
}
void setOpenrtistComm(OpenrtistComm openrtistComm) {
this.openrtistComm = openrtistComm;
}
/**
* ************* Convert imageformat to Byte arrays **********************
*/
/**
* Convert imageformat YUV_420_888 to Byte arrays.
*/
private static byte[] imageToByte(Image image) {
byte[] byteArray = null;
byteArray = NV21toJPEG(YUV420toNV21(image), image.getWidth(), image.getHeight(), 100);
return byteArray;
}
private static byte[] NV21toJPEG(byte[] nv21, int width, int height, int quality) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
YuvImage yuv = new YuvImage(nv21, ImageFormat.NV21, width, height, null);
yuv.compressToJpeg(new Rect(0, 0, width, height), quality, out);
return out.toByteArray();
}
private static byte[] YUV420toNV21(Image image) {
byte[] nv21;
// Get the three planes.
ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();
int ySize = yBuffer.remaining();
int uSize = uBuffer.remaining();
int vSize = vBuffer.remaining();
nv21 = new byte[ySize + uSize + vSize];
// U and V are swapped
yBuffer.get(nv21, 0, ySize);
vBuffer.get(nv21, ySize, vSize);
uBuffer.get(nv21, ySize + vSize, uSize);
return nv21;
}
/**
* Convert imageformat DEPTH16 to Byte arrays.
*/
private static byte[] DEPTH16toBYTEs(Image image) {
byte[] ans;
// DEPTH16 has 1 plane.
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
int size = buffer.remaining();
ans = new byte[size];
buffer.get(ans, 0, size);
return ans;
}
/**
* ************* End of onItemSelected ***************
*/
private Runnable fpsCalculator = new Runnable() {
@Override
public void run() {
if (true) {
// if(Const.SHOW_FPS) {
if (fpsLabel.getVisibility() == View.INVISIBLE) {
fpsLabel.setVisibility(View.VISIBLE);
}
String msg = "FPS: " + framesProcessed;
fpsLabel.setText(msg);
}
framesProcessed = 0;
fpsHandler.postDelayed(this, 1000);
}
};
/**
* Handles messages preplaceded from streaming threads and result receiving threads.
*/
Handler returnMsgHandler = new ReturnHandler(this);
static clreplaced ReturnHandler extends Handler {
private final WeakReference<GabrielClientActivity> mGabrielClientActivity;
ReturnHandler(GabrielClientActivity gabrielClientActivity) {
this.mGabrielClientActivity = new WeakReference<GabrielClientActivity>(gabrielClientActivity);
}
public void handleMessage(Message msg) {
final GabrielClientActivity gabrielClientActivity = this.mGabrielClientActivity.get();
if (gabrielClientActivity == null) {
return;
}
if (msg.what == NetworkProtocol.NETWORK_RET_FAILED) {
// suppress this error when screen recording as we have to temporarily leave this
// activity causing a network disruption
if (!gabrielClientActivity.recordingInitiated) {
AlertDialog.Builder builder = new AlertDialog.Builder(gabrielClientActivity, AlertDialog.THEME_HOLO_DARK);
builder.setMessage(msg.getData().getString("message")).setreplacedle(R.string.connection_error).setNegativeButton(R.string.back_button, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
gabrielClientActivity.finish();
}
}).setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
}
} else if (msg.what == Const.REFERENCE_IMAGE) {
if (!Const.STEREO_ENABLED) {
Bitmap refImage = null;
if (msg.obj != null) {
Log.v(LOG_TAG, "Setting reference image.");
refImage = (Bitmap) msg.obj;
gabrielClientActivity.iconView.setImageBitmap(refImage);
} else {
gabrielClientActivity.iconView.setImageResource(R.drawable.ic_question_mark);
}
}
}
if (msg.what == NetworkProtocol.NETWORK_RET_IMAGE) {
if (gabrielClientActivity.styleType.equals("none")) {
return;
}
if (!Const.STEREO_ENABLED && gabrielClientActivity.styleType.equals("?")) {
Spinner spinner = (Spinner) gabrielClientActivity.findViewById(R.id.spinner);
((ArrayAdapter<String>) spinner.getAdapter()).notifyDataSetChanged();
gabrielClientActivity.styleType = "none";
}
gabrielClientActivity.cleared = false;
Bitmap feedbackImg = (Bitmap) msg.obj;
gabrielClientActivity.set_image(feedbackImg);
gabrielClientActivity.framesProcessed++;
}
}
}
public void set_image(Bitmap feedbackImg) {
if (Const.STEREO_ENABLED) {
this.stereoView1 = (ImageView) this.findViewById(R.id.guidance_image1);
this.stereoView1.setVisibility(View.VISIBLE);
this.stereoView1.setImageBitmap(feedbackImg);
this.stereoView2 = (ImageView) this.findViewById(R.id.guidance_image2);
this.stereoView2.setVisibility(View.VISIBLE);
this.stereoView2.setImageBitmap(feedbackImg);
} else {
this.imgView = (ImageView) this.findViewById(R.id.guidance_image);
this.imgView.setVisibility(View.VISIBLE);
this.imgView.setImageBitmap(feedbackImg);
}
}
/**
* Terminates all services.
*/
private void terminate() {
Log.v(LOG_TAG, "++terminate");
isRunning = false;
if ((localRunnerThread != null) && (localRunnerThread.isAlive())) {
localRunnerThread.quitSafely();
localRunnerThread.interrupt();
localRunnerThread = null;
localRunnerThreadHandler = null;
}
if (rs != null) {
rs.destroy();
}
// Allow this.backgroundHandler to return if it is currently waiting on this.engineInputLock
synchronized (this.engineInputLock) {
this.engineInputLock.notify();
}
if (this.backgroundThread != null) {
this.stopBackgroundThread();
}
if (this.openrtistComm != null) {
this.openrtistComm.stop();
this.openrtistComm = null;
}
if (preview != null) {
reusedBuffer = null;
preview = null;
}
}
/**
* ************* End of Camera Preview ***************
*/
/**
* ************* onItemSelected **********************
*/
// Performing action onItemSelected and onNothing selected
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
if (styleIds.get(position) == "none") {
if (!Const.STYLES_RETRIEVED)
styleType = "?";
else
styleType = "none";
if (Const.STEREO_ENABLED) {
stereoView1.setVisibility(View.INVISIBLE);
stereoView2.setVisibility(View.INVISIBLE);
} else {
imgView.setVisibility(View.INVISIBLE);
if (Const.DISPLAY_REFERENCE) {
iconView.setVisibility(View.INVISIBLE);
}
}
} else {
styleType = styleIds.get(position);
if (Const.STEREO_ENABLED) {
if (stereoView1.getVisibility() == View.INVISIBLE) {
stereoView1.setVisibility(View.VISIBLE);
stereoView2.setVisibility(View.VISIBLE);
}
} else {
if (Const.DISPLAY_REFERENCE) {
iconView.setVisibility(View.VISIBLE);
}
if (imgView.getVisibility() == View.INVISIBLE) {
imgView.setVisibility(View.VISIBLE);
}
}
if (!styleType.equals("?") && runLocally) {
localRunnerThreadHandler.post(new Runnable() {
@Override
public void run() {
try {
localRunner.load(getApplicationContext(), String.format("%s.pt", styleType));
} catch (FileNotFoundException e) {
styleType = "none";
AlertDialog.Builder builder = new AlertDialog.Builder(GabrielClientActivity.this, AlertDialog.THEME_HOLO_DARK);
builder.setMessage("Style Not Found Locally").setreplacedle("Failed to Load Style");
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
}
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
public void showNetworkErrorMessage(String message) {
// suppress this error when screen recording as we have to temporarily leave this
// activity causing a network disruption
if (!recordingInitiated) {
this.runOnUiThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Light_Dialog_Alert);
builder.setMessage(message).setreplacedle(R.string.connection_error).setNegativeButton(R.string.back_button, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
GabrielClientActivity.this.finish();
}
}).setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
});
}
}
public void addStyles(Set<Map.Entry<String, String>> entrySet) {
this.styleType = "none";
for (Map.Entry<String, String> entry : entrySet) {
Log.v(LOG_TAG, "style: " + entry.getKey() + ", desc: " + entry.getValue());
styleDescriptions.add(entry.getValue().trim());
styleIds.add(entry.getKey().trim());
}
}
public void addFrameProcessed() {
framesProcessed++;
}
}
16
Source : CameraLayout.java
with MIT License
from zhongjhATC
with MIT License
from zhongjhATC
/**
* 播放视频,用于录制后,在是否确认的界面中,播放视频
*/
private void playVideo(File file) {
mViewHolder.vvPreview.pause();
// mediaController 是底部控制条
MediaController mediaController = new MediaController(mContext);
mediaController.setAnchorView(mViewHolder.vvPreview);
mediaController.setMediaPlayer(mViewHolder.vvPreview);
mediaController.setVisibility(View.GONE);
mViewHolder.vvPreview.setMediaController(mediaController);
Uri uri = Uri.fromFile(file);
mViewHolder.vvPreview.setVideoURI(uri);
// 这段代码需要放在更新视频文件后播放,不然会找不到文件。
mViewHolder.vvPreview.setVisibility(View.VISIBLE);
if (!mViewHolder.vvPreview.isPlaying()) {
mViewHolder.vvPreview.start();
}
mViewHolder.vvPreview.setOnCompletionListener(mediaPlayer -> {
// 循环播放
if (!mViewHolder.vvPreview.isPlaying()) {
mViewHolder.vvPreview.start();
}
});
}
16
Source : MainActivity.java
with Apache License 2.0
from xietiantian
with Apache License 2.0
from xietiantian
/**
* Our MAIN Activity - MAIN LAUNCHER
*/
public clreplaced MainActivity extends AppCompatActivity implements RecordingFragment.OnListFragmentInteractionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaController.MediaPlayerControl {
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
private ViewPager mViewPager;
private Handler handler = new Handler();
boolean isLicensed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkPermissions();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// 页面切换后将选中项清空
onListFragmentInteraction(new PhoneCallRecord[] {});
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
// set up MediaPlayer
mediaController = new MediaController(this);
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnCompletionListener(this);
// RateMeNowDialog.showRateDialog(this, 10);
}
@Override
protected void onStop() {
super.onStop();
mediaController.hide();
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mediaPlayer.release();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// the MediaController will hide after 3 seconds - tap the screen to make it appear again
mediaController.show();
return false;
}
Menu optionsMenu;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
optionsMenu = menu;
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
SwitchCompat switchCompat = (SwitchCompat) menu.findItem(R.id.onswitch).getActionView().findViewById(R.id.switch1);
switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
AppPreferences.getInstance(MainActivity.this).setRecordingEnabled(isChecked);
}
});
switchCompat.setChecked(AppPreferences.getInstance(MainActivity.this).isRecordingEnabled());
return true;
}
boolean doubleBackToExitPressedOnce;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
// Does the user really want to exit?
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, getString(R.string.press_back_again), Toast.LENGTH_LONG).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 2000);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.gereplacedemId();
// noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
Intent intent = new Intent(this, SettingsActivity.clreplaced);
intent.putExtra("write_external", permissionWriteExternal);
startActivity(intent);
return true;
}
if (id == R.id.action_save) {
if (null != selectedItems && selectedItems.length > 0) {
Runnable runnable = new Runnable() {
@Override
public void run() {
for (PhoneCallRecord record : selectedItems) {
record.getPhoneCall().setKept(true);
record.getPhoneCall().save(MainActivity.this);
}
LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(new Intent(// Causes refresh
LocalBroadcastActions.NEW_RECORDING_BROADCAST));
}
};
handler.post(runnable);
}
return true;
}
if (id == R.id.action_share) {
if (null != selectedItems && selectedItems.length > 0) {
Runnable runnable = new Runnable() {
@Override
public void run() {
ArrayList<Uri> fileUris = new ArrayList<Uri>();
for (PhoneCallRecord record : selectedItems) {
fileUris.add(Uri.fromFile(new File(record.getPhoneCall().getPathToRecording())));
}
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, fileUris);
shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_replacedle));
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
shareIntent.putExtra(Intent.EXTRA_HTML_TEXT, Html.fromHtml(getString(R.string.email_body_html), Html.FROM_HTML_MODE_LEGACY));
} else {
shareIntent.putExtra(Intent.EXTRA_HTML_TEXT, Html.fromHtml(getString(R.string.email_body_html)));
}
shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.email_body));
shareIntent.setType("audio/*");
startActivity(Intent.createChooser(shareIntent, getString(R.string.action_share)));
}
};
handler.post(runnable);
}
return true;
}
if (id == R.id.action_delete) {
if (null != selectedItems && selectedItems.length > 0) {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setreplacedle(R.string.delete_recording_replacedle);
alert.setMessage(R.string.delete_recording_subject);
alert.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Runnable runnable = new Runnable() {
@Override
public void run() {
Database callLog = Database.getInstance(MainActivity.this);
for (PhoneCallRecord record : selectedItems) {
int id = record.getPhoneCall().getId();
callLog.removeCall(id);
}
LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(new Intent(LocalBroadcastActions.RECORDING_DELETED_BROADCAST));
// 选中的都删除了,删除后selectedItems应该为空
onListFragmentInteraction(new PhoneCallRecord[] {});
}
};
handler.post(runnable);
dialog.dismiss();
}
});
alert.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alert.show();
}
return true;
}
if (id == R.id.action_delete_all) {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setreplacedle(R.string.delete_recording_replacedle);
alert.setMessage(R.string.delete_all_recording_subject);
alert.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Runnable runnable = new Runnable() {
@Override
public void run() {
Database.getInstance(MainActivity.this).removeAllCalls(false);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(new Intent(LocalBroadcastActions.RECORDING_DELETED_BROADCAST));
// 选中的都删除了,删除后selectedItems应该为空
onListFragmentInteraction(new PhoneCallRecord[] {});
}
};
handler.post(runnable);
dialog.dismiss();
}
});
alert.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alert.show();
return true;
}
if (R.id.action_whitelist == id) {
if (permissionReadContacts) {
Intent intent = new Intent(this, WhitelistActivity.clreplaced);
startActivity(intent);
} else {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setreplacedle(R.string.permission_whitelist_replacedle);
alert.setMessage(R.string.permission_whitelist);
}
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// Evoked by the {@link RecordCallService#displayNotification}
setIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
Intent intent = getIntent();
if (null != intent) {
// User clicked the {@link RecordCallService#displayNotification} to listen to the recording
long id = intent.getIntExtra("RecordingId", -1);
if (-1 != id) {
CallLog call = Database.getInstance(this).getCall((int) id);
if (null != call) {
audioPlayer(call.getPathToRecording());
}
// run only once...
intent.putExtra("RecordingId", -1);
}
}
}
@Override
public void onListFragmentInteraction(PhoneCallRecord[] items) {
optionsMenu.findItem(R.id.action_delete).setVisible(items.length > 0);
optionsMenu.findItem(R.id.action_share).setVisible(items.length > 0);
selectedItems = items;
// the MediaController will hide after 3 seconds - tap the screen to make it appear again
if (mediaController.isEnabled() && !mediaController.isShowing())
mediaController.show();
}
PhoneCallRecord[] selectedItems;
@Override
public void onItemPlay(PhoneCallRecord item) {
audioPlayer(item.getPhoneCall().getPathToRecording());
}
@Override
public boolean onLisreplacedemLongClick(View v, final PhoneCallRecord record, final PhoneCallRecord[] items) {
selectedItems = items;
PopupMenu popupMenu = new PopupMenu(this, v);
popupMenu.getMenuInflater().inflate(R.menu.menu_main_popup, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
}
});
popupMenu.show();
return false;
}
MediaPlayer mediaPlayer;
MediaController mediaController;
public void audioPlayer(String path) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Media Player stuff
*/
@Override
public void start() {
mediaPlayer.start();
}
@Override
public void pause() {
mediaPlayer.pause();
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(this.findViewById(R.id.list));
handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show(5000);
}
});
}
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
mediaController.hide();
mediaController.setEnabled(false);
}
boolean permissionReadContacts = false;
boolean permissionWriteExternal = false;
public void checkPermissions() {
permissionReadContacts = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
permissionWriteExternal = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
if (!permissionReadContacts)
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
new android.app.AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.str_access_permissions).setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.READ_CONTACTS }, 0x01);
}
}).show();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_CONTACTS }, 0x01);
}
}
if (!permissionWriteExternal)
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
new android.app.AlertDialog.Builder(this).setCancelable(true).setMessage(R.string.str_write_external_permission).setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0x02);
}
}).show();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0x02);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch(requestCode) {
case 0x01:
{
// validateRequestPermissionsRequestCode in FragmentActivity requires requestCode to be of 8 bits, meaning the range is from 0 to 255.
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0) {
// we only asked for one permission
permissionReadContacts = grantResults[0] == PackageManager.PERMISSION_GRANTED;
}
break;
}
case 0x02:
{
// validateRequestPermissionsRequestCode in FragmentActivity requires requestCode to be of 8 bits, meaning the range is from 0 to 255.
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0) {
// we only asked for one permission
permissionWriteExternal = grantResults[0] == PackageManager.PERMISSION_GRANTED;
}
break;
}
}
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public clreplaced SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment gereplacedem(int position) {
// gereplacedem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner clreplaced below).
if (position == 1)
return RecordingFragment.newInstance(1, RecordingFragment.SORT_TYPE.INCOMING);
else if (position == 2)
return RecordingFragment.newInstance(1, RecordingFragment.SORT_TYPE.OUTGOING);
else
return RecordingFragment.newInstance(1, RecordingFragment.SORT_TYPE.ALL);
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPagereplacedle(int position) {
switch(position) {
case 0:
return getString(R.string.all);
case 1:
return getString(R.string.incoming);
case 2:
return getString(R.string.outgoing);
}
return null;
}
}
}
16
Source : Replayer.java
with GNU General Public License v3.0
from vassela
with GNU General Public License v3.0
from vassela
public clreplaced Replayer extends Activity implements MediaController.MediaPlayerControl, OnPreparedListener, AppCompatCallback {
private MediaPlayer mediaPlayer;
private ReplayFileVisualizer replayFileVisualizer;
private MediaController mediaController;
private Handler handler = new Handler();
private int direction;
private String number;
private int doubleCall;
private String doubleCallNumber;
private long startingDate;
private long endingDate;
// private long duration;
private String recordPath;
private String recordFilename;
private int recordFormat;
// private int locked;
private String description;
private String recordFileAbsolutePath;
private boolean isPrepared;
private DatabaseManager databaseManager = new DatabaseManager();
private TelephoneCallNotifier telephoneCallNotifier = new TelephoneCallNotifier();
private LocalizerManager localizerManager = new LocalizerManager();
private ThemeManager themeManager = new ThemeManager();
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
private static SimpleDateFormat simpleDurationFormat = new SimpleDateFormat("HH:mm:ss");
private AppCompatDelegate delegate;
@Override
public void onCreate(Bundle savedInstanceState) {
try {
localizerManager.setPreferencesLocale(getApplicationContext());
themeManager.setPreferencesTheme(getApplicationContext(), this);
delegate = AppCompatDelegate.create(this, this);
delegate.installViewFactory();
super.onCreate(savedInstanceState);
delegate.onCreate(savedInstanceState);
delegate.setContentView(R.layout.replayer);
Toolbar toolbar = (Toolbar) findViewById(R.id.replayer_toolbar);
delegate.setSupportActionBar(toolbar);
delegate.getSupportActionBar().setLogo(R.drawable.ic_menu_play_clip);
delegate.setreplacedle("Replayer");
delegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
delegate.getSupportActionBar().setDisplayShowHomeEnabled(true);
Intent intent = getIntent();
if (intent.getExtras() != null) {
direction = intent.getIntExtra("direction", 0);
number = intent.getStringExtra("number");
doubleCall = intent.getIntExtra("doubleCall", 0);
doubleCallNumber = intent.getStringExtra("doubleCallNumber");
startingDate = intent.getLongExtra("startingDate", 0);
endingDate = intent.getLongExtra("endingDate", 0);
// duration = intent.getLongExtra("duration", 0);
recordPath = intent.getStringExtra("recordPath");
recordFilename = intent.getStringExtra("recordFilename");
recordFormat = intent.getIntExtra("recordFormat", 0);
// locked = intent.getIntExtra("locked",0);
description = intent.getStringExtra("description");
TextView directionTextView = (TextView) findViewById(R.id.replayer_direction);
TextView numberTextView = (TextView) findViewById(R.id.replayer_number);
TextView doubleCallTextView = (TextView) findViewById(R.id.replayer_double_call);
TextView doubleCallNumberTextView = (TextView) findViewById(R.id.replayer_double_call_number);
TextView startingDateTextView = (TextView) findViewById(R.id.replayer_starting_date);
TextView endingDateTextView = (TextView) findViewById(R.id.replayer_ending_date);
// TextView durationTextView = (TextView) findViewById(R.id.replayer_duration);
// TextView recordPathTextView = (TextView) findViewById(R.id.replayer_record_path);
TextView recordFilenameTextView = (TextView) findViewById(R.id.replayer_record_filename);
TextView recordFormatTextView = (TextView) findViewById(R.id.replayer_record_format);
// TextView lockedTextView = (TextView) findViewById(R.id.replayer_locked);
TextView descriptionTextView = (TextView) findViewById(R.id.replayer_description);
directionTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_direction) + " : " + direction);
if (number.contains("MICROPHONE")) {
numberTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_number) + " : " + getApplicationContext().getString(R.string.records_microphone));
} else {
numberTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_number) + " : " + number);
}
if (doubleCall == 0) {
doubleCallTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_doublecall) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_doublecall_no));
} else {
doubleCallTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_doublecall) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_doublecall_yes));
}
doubleCallNumberTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_doublecallnumber) + " : " + doubleCallNumber);
startingDateTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_startingdate) + " : " + simpleDateFormat.format(new Date(startingDate)));
endingDateTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_endingdate) + " : " + simpleDateFormat.format(new Date(endingDate)));
// durationTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_duration) + " : " + simpleDurationFormat.format(new Date(duration)));
// recordPathTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_recordpath) + " : " + recordPath);
recordFilenameTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_recordfilename) + " : " + recordFilename);
recordFormatTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_recordformat) + " : " + new RecordFileMaker().getRecordFormat(getApplicationContext(), recordFormat));
/*if(locked == 0)
{
lockedTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_locked) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_locked_no));
}
else
{
lockedTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_locked) + " : " + getApplicationContext().getString(R.string.record_dialog_detail_locked_yes));
}*/
descriptionTextView.setText(getApplicationContext().getString(R.string.record_dialog_detail_description) + " : " + description);
recordFileAbsolutePath = recordPath + "/" + recordFilename;
ReplayFileReader replayFileReader = new ReplayFileReader();
boolean isReplayFileExists = replayFileReader.onCreate(getApplicationContext(), recordFileAbsolutePath);
isPrepared = false;
if (isReplayFileExists == true) {
mediaController = new MediaController(this);
if (// 3GPP, AMR, MP3
recordFormat < 10) {
initMediaplayer();
} else // WAV
{
initWavMediaplayer(replayFileReader);
}
} else {
Log.e("Replayer", "initMediaController : " + getApplicationContext().getString(R.string.log_replayer_error_player_init));
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
}
replayFileReader.onClose(getApplicationContext(), recordFileAbsolutePath);
}
} catch (Exception e) {
Log.e("Replayer", "onCreate : " + getApplicationContext().getString(R.string.log_replayer_error_create) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_create), new Date().getTime(), 1, false);
}
}
public void initMediaplayer() {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(recordFileAbsolutePath);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepare();
} catch (Exception e) {
try {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
} catch (Exception e2) {
Log.w("Replayer", "initMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_echec_player_close) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_player_close), new Date().getTime(), 2, false);
Log.e("Replayer", "initMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
} finally {
Log.e("Replayer", "initMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
}
}
}
public void initWavMediaplayer(ReplayFileReader replayFileReader) {
boolean isValidAudioReplayWavFile = replayFileReader.isValidAudioReplayWavFile(getApplicationContext(), recordFileAbsolutePath);
if (isValidAudioReplayWavFile == true) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(recordFileAbsolutePath);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepare();
} catch (Exception e) {
try {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
} catch (Exception e2) {
Log.w("Replayer", "initWavMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_echec_player_close) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_player_close), new Date().getTime(), 2, false);
Log.e("Replayer", "initWavMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
} finally {
Log.e("Replayer", "initWavMediaplayer : " + getApplicationContext().getString(R.string.log_replayer_error_player_init) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_player_init), new Date().getTime(), 1, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
}
}
}
}
public void initMediaController() {
try {
Log.d("Replayer", "initMediaController");
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(findViewById(R.id.replayer_media_controller));
themeManager.setMediaController(getApplicationContext(), mediaController);
handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show();
}
});
} catch (Exception e) {
Log.e("Replayer", "initMediaController : " + getApplicationContext().getString(R.string.log_replayer_error_controller_init) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_error_controller_init), new Date().getTime(), 1, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_launch_toast), true);
} finally {
Log.i("Replayer", "initMediaController : " + getApplicationContext().getString(R.string.log_replayer_replay_file) + " : " + recordFileAbsolutePath);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_replay_file) + " : " + recordFileAbsolutePath, new Date().getTime(), 3, false);
}
}
@Override
public void onPrepared(MediaPlayer mp) {
isPrepared = true;
initMediaController();
}
@Override
protected void onStop() {
try {
super.onStop();
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
replayFileVisualizer.releaseReplayFileVisualizer(getApplicationContext());
mediaController.hide();
mediaPlayer.stop();
mediaPlayer.release();
}
} catch (Exception e) {
Log.w("Replayer", "onStop : " + getApplicationContext().getString(R.string.log_replayer_echec_stop) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_stop), new Date().getTime(), 2, false);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
mediaController.show();
return true;
} else {
return false;
}
} catch (Exception e) {
Log.w("Replayer", "onTouchEvent : " + getApplicationContext().getString(R.string.log_replayer_echec_touch_event) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_touch_event), new Date().getTime(), 2, false);
return false;
}
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public int getCurrentPosition() {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
return mediaPlayer.getCurrentPosition();
} else {
return 0;
}
} catch (Exception e) {
Log.w("Replayer", "getCurrentPosition : " + getApplicationContext().getString(R.string.log_replayer_echec_get_current_position) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_get_current_position), new Date().getTime(), 2, false);
return 0;
}
}
@Override
public int getDuration() {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
Log.d("Replayer", "getDuration : mediaPlayer.getDuration" + mediaPlayer.getDuration());
return mediaPlayer.getDuration();
} else {
return 0;
}
} catch (Exception e) {
Log.w("Replayer", "getDuration : " + getApplicationContext().getString(R.string.log_replayer_echec_get_duration) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_get_duration), new Date().getTime(), 2, false);
return 0;
}
}
@Override
public boolean isPlaying() {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
return mediaPlayer.isPlaying();
} else {
return false;
}
} catch (Exception e) {
Log.w("Replayer", "isPlaying : " + getApplicationContext().getString(R.string.log_replayer_echec_is_playing) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_is_playing), new Date().getTime(), 2, false);
return false;
}
}
@Override
public void pause() {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
replayFileVisualizer.releaseReplayFileVisualizer(getApplicationContext());
mediaPlayer.pause();
}
} catch (Exception e) {
Log.w("Replayer", "pause : " + getApplicationContext().getString(R.string.log_replayer_echec_pause) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_pause), new Date().getTime(), 2, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_pause_toast), false);
}
}
@Override
public void seekTo(int pos) {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
mediaPlayer.seekTo(pos);
}
} catch (Exception e) {
Log.w("Replayer", "seekTo : " + getApplicationContext().getString(R.string.log_replayer_echec_seek_to) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_seek_to), new Date().getTime(), 2, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_seek_to_toast), false);
}
}
@Override
public void start() {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
mediaPlayer.start();
try {
replayFileVisualizer = (ReplayFileVisualizer) findViewById(R.id.replayer_visualizer);
replayFileVisualizer.linkToMediaPlayer(getApplicationContext(), mediaPlayer);
replayFileVisualizer.showAudioDisplayer(getApplicationContext());
} catch (Exception e) {
Log.w("Replayer", "start : " + getApplicationContext().getString(R.string.log_replayer_echec_start_visualizer) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_start_visualizer), new Date().getTime(), 2, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_play_visualizer_toast), false);
}
}
} catch (Exception e) {
Log.w("Replayer", "start : " + getApplicationContext().getString(R.string.log_replayer_echec_start) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_start), new Date().getTime(), 2, false);
telephoneCallNotifier.displayToast(getApplicationContext(), getApplicationContext().getString(R.string.notification_replayer_error_play_toast), false);
}
}
@Override
public int getAudioSessionId() {
try {
if ((mediaPlayer != null) && (mediaController != null) && (isPrepared == true)) {
return mediaPlayer.getAudioSessionId();
} else {
return 0;
}
} catch (Exception e) {
Log.w("Replayer", "getAudioSessionId : " + getApplicationContext().getString(R.string.log_replayer_echec_get_audio_session_id) + " : " + e);
databaseManager.insertLog(getApplicationContext(), "" + getApplicationContext().getString(R.string.log_replayer_echec_get_audio_session_id), new Date().getTime(), 2, false);
return 0;
}
}
@Override
public void onSupportActionModeFinished(ActionMode arg0) {
}
@Override
public void onSupportActionModeStarted(ActionMode arg0) {
}
@Override
public ActionMode onWindowStartingSupportActionMode(Callback arg0) {
return null;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.gereplacedemId();
switch(id) {
case android.R.id.home:
super.onBackPressed();
break;
}
return super.onOptionsItemSelected(item);
}
}
16
Source : PreviewActivity.java
with MIT License
from sandrios
with MIT License
from sandrios
/**
* PreviewActivity to preview the image captured by sandrios camera
* Created by Arpit Gandhi on 7/6/16.
*/
public clreplaced PreviewActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "PreviewActivity";
private final static String SHOW_CROP = "show_crop";
private final static String MEDIA_ACTION_ARG = "media_action_arg";
private final static String FILE_PATH_ARG = "file_path_arg";
private final static String RESPONSE_CODE_ARG = "response_code_arg";
private final static String VIDEO_POSITION_ARG = "current_video_position";
private final static String VIDEO_IS_PLAYED_ARG = "is_played";
private final static String MIME_TYPE_VIDEO = "video";
private final static String MIME_TYPE_IMAGE = "image";
private String previewFilePath;
private PreviewActivity mContext;
private SurfaceView surfaceView;
private FrameLayout photoPreviewContainer;
private UCropView imagePreview;
private ViewGroup buttonPanel;
private AspectFrameLayout videoPreviewContainer;
private MediaController mediaController;
private MediaPlayer mediaPlayer;
private int currentPlaybackPosition = 0;
private boolean isVideoPlaying = true;
private boolean showCrop = false;
private MediaController.MediaPlayerControl MediaPlayerControlImpl = new MediaController.MediaPlayerControl() {
@Override
public void start() {
mediaPlayer.start();
}
@Override
public void pause() {
mediaPlayer.pause();
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return mediaPlayer.getAudioSessionId();
}
};
private SurfaceHolder.Callback surfaceCallbacks = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
showVideoPreview(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
};
public static Intent newIntent(Context context, @CameraConfiguration.MediaAction int mediaAction, String filePath, boolean showImageCrop) {
return new Intent(context, PreviewActivity.clreplaced).putExtra(MEDIA_ACTION_ARG, mediaAction).putExtra(SHOW_CROP, showImageCrop).putExtra(FILE_PATH_ARG, filePath);
}
public static boolean isResultConfirm(@NonNull Intent resultIntent) {
return BaseSandriosActivity.ACTION_CONFIRM == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
}
public static String getMediaFilePatch(@NonNull Intent resultIntent) {
return resultIntent.getStringExtra(FILE_PATH_ARG);
}
public static boolean isResultRetake(@NonNull Intent resultIntent) {
return BaseSandriosActivity.ACTION_RETAKE == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
}
public static boolean isResultCancel(@NonNull Intent resultIntent) {
return BaseSandriosActivity.ACTION_CANCEL == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preview);
mContext = this;
surfaceView = findViewById(R.id.video_preview);
surfaceView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mediaController == null)
return false;
if (mediaController.isShowing()) {
mediaController.hide();
showButtonPanel(true);
} else {
showButtonPanel(false);
mediaController.show();
}
return false;
}
});
videoPreviewContainer = findViewById(R.id.previewAspectFrameLayout);
photoPreviewContainer = findViewById(R.id.photo_preview_container);
imagePreview = findViewById(R.id.image_view);
buttonPanel = findViewById(R.id.preview_control_panel);
View confirmMediaResult = findViewById(R.id.confirm_media_result);
View reTakeMedia = findViewById(R.id.re_take_media);
View cancelMediaAction = findViewById(R.id.cancel_media_action);
findViewById(R.id.crop_image).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
UCrop.Options options = new UCrop.Options();
options.setToolbarColor(ContextCompat.getColor(mContext, android.R.color.black));
options.setStatusBarColor(ContextCompat.getColor(mContext, android.R.color.black));
Uri uri = Uri.fromFile(new File(previewFilePath));
UCrop.of(uri, uri).withOptions(options).start(mContext);
}
});
if (confirmMediaResult != null)
confirmMediaResult.setOnClickListener(this);
if (reTakeMedia != null)
reTakeMedia.setOnClickListener(this);
if (cancelMediaAction != null)
cancelMediaAction.setOnClickListener(this);
Bundle args = getIntent().getExtras();
int mediaAction = args.getInt(MEDIA_ACTION_ARG);
previewFilePath = args.getString(FILE_PATH_ARG);
showCrop = args.getBoolean(SHOW_CROP);
if (mediaAction == CameraConfiguration.MEDIA_ACTION_VIDEO) {
displayVideo(savedInstanceState);
} else if (mediaAction == CameraConfiguration.MEDIA_ACTION_PHOTO) {
displayImage();
} else {
String mimeType = Utils.getMimeType(previewFilePath);
if (mimeType.contains(MIME_TYPE_VIDEO)) {
displayVideo(savedInstanceState);
} else if (mimeType.contains(MIME_TYPE_IMAGE)) {
displayImage();
} else
finish();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveVideoParams(outState);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
showImagePreview();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
if (mediaController != null) {
mediaController.hide();
mediaController = null;
}
}
private void displayImage() {
if (showCrop)
findViewById(R.id.crop_image).setVisibility(View.VISIBLE);
else
findViewById(R.id.crop_image).setVisibility(View.GONE);
videoPreviewContainer.setVisibility(View.GONE);
surfaceView.setVisibility(View.GONE);
showImagePreview();
}
private void showImagePreview() {
try {
Uri uri = Uri.fromFile(new File(previewFilePath));
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(new File(uri.getPath()).getAbsolutePath(), options);
imagePreview.getCropImageView().setImageUri(uri, null);
imagePreview.getOverlayView().setShowCropFrame(false);
imagePreview.getOverlayView().setShowCropGrid(false);
imagePreview.getCropImageView().setRotateEnabled(false);
imagePreview.getOverlayView().setDimmedColor(Color.TRANSPARENT);
} catch (Exception e) {
e.printStackTrace();
}
}
private void displayVideo(Bundle savedInstanceState) {
findViewById(R.id.crop_image).setVisibility(View.GONE);
if (savedInstanceState != null) {
loadVideoParams(savedInstanceState);
}
photoPreviewContainer.setVisibility(View.GONE);
surfaceView.getHolder().addCallback(surfaceCallbacks);
}
private void showVideoPreview(SurfaceHolder holder) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(previewFilePath);
mediaPlayer.setDisplay(holder);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaController = new MediaController(mContext);
mediaController.setAnchorView(surfaceView);
mediaController.setMediaPlayer(MediaPlayerControlImpl);
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
videoPreviewContainer.setAspectRatio((double) videoWidth / videoHeight);
mediaPlayer.start();
mediaPlayer.seekTo(currentPlaybackPosition);
if (!isVideoPlaying)
mediaPlayer.pause();
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
finish();
return true;
}
});
mediaPlayer.prepareAsync();
} catch (Exception e) {
Log.e(TAG, "Error media player playing video.");
finish();
}
}
private void saveCroppedImage(Uri croppedFileUri) {
try {
File saveFile = new File(previewFilePath);
FileInputStream inStream = new FileInputStream(new File(croppedFileUri.getPath()));
FileOutputStream outStream = new FileOutputStream(saveFile);
FileChannel inChannel = inStream.getChannel();
FileChannel outChannel = outStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inStream.close();
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void saveVideoParams(Bundle outState) {
if (mediaPlayer != null) {
outState.putInt(VIDEO_POSITION_ARG, mediaPlayer.getCurrentPosition());
outState.putBoolean(VIDEO_IS_PLAYED_ARG, mediaPlayer.isPlaying());
}
}
private void loadVideoParams(Bundle savedInstanceState) {
currentPlaybackPosition = savedInstanceState.getInt(VIDEO_POSITION_ARG, 0);
isVideoPlaying = savedInstanceState.getBoolean(VIDEO_IS_PLAYED_ARG, true);
}
private void showButtonPanel(boolean show) {
if (show) {
buttonPanel.setVisibility(View.VISIBLE);
} else {
buttonPanel.setVisibility(View.GONE);
}
}
@Override
public void onClick(View view) {
Intent resultIntent = new Intent();
if (view.getId() == R.id.confirm_media_result) {
resultIntent.putExtra(RESPONSE_CODE_ARG, BaseSandriosActivity.ACTION_CONFIRM);
resultIntent.putExtra(FILE_PATH_ARG, previewFilePath);
try {
rotateImageIfRequired(previewFilePath);
} catch (IOException e) {
e.printStackTrace();
}
} else if (view.getId() == R.id.re_take_media) {
deleteMediaFile();
resultIntent.putExtra(RESPONSE_CODE_ARG, BaseSandriosActivity.ACTION_RETAKE);
} else if (view.getId() == R.id.cancel_media_action) {
deleteMediaFile();
resultIntent.putExtra(RESPONSE_CODE_ARG, BaseSandriosActivity.ACTION_CANCEL);
}
setResult(RESULT_OK, resultIntent);
finish();
}
/**
* Rotate an image if required.
*
* @param selectedImage Image URI
* @return The resulted Bitmap after manipulation
*/
private Bitmap rotateImageIfRequired(String selectedImage) throws IOException {
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(selectedImage, bmOptions);
InputStream input = getContentResolver().openInputStream(Uri.fromFile(new File(selectedImage)));
ExifInterface ei;
if (Build.VERSION.SDK_INT > 23)
ei = new ExifInterface(input);
else
ei = new ExifInterface(selectedImage);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return rotateImage(bitmap, 90);
case ExifInterface.ORIENTATION_ROTATE_180:
return rotateImage(bitmap, 180);
case ExifInterface.ORIENTATION_ROTATE_270:
return rotateImage(bitmap, 270);
default:
return bitmap;
}
}
private Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
@Override
public void onBackPressed() {
super.onBackPressed();
deleteMediaFile();
}
private boolean deleteMediaFile() {
File mediaFile = new File(previewFilePath);
return mediaFile.delete();
}
}
16
Source : FragmentShowImage.java
with GNU Affero General Public License v3.0
from RooyeKhat-Media
with GNU Affero General Public License v3.0
from RooyeKhat-Media
public clreplaced FragmentShowImage extends BaseFragment {
public static ArrayList<String> downloadedList = new ArrayList<>();
public final String ROOM_ID = "roomId";
public final String SELECTED_IMAGE = "selectedImage";
public final String TYPE = "type";
public View appBarLayout;
public MediaController videoController;
public int po;
private TextView txtImageNumber;
private TextView txtImageName;
private TextView txtImageDate;
private TextView txtImageTime;
private EmojiTextViewE txtImageDesc;
private LinearLayout toolbarShowImage;
private boolean isShowToolbar = true;
private ViewGroup ltImageName;
private ViewPager viewPager;
private boolean isFirstPlay = true;
private boolean isReadyToPause = true;
private int selectedFile = 0;
private AdapterViewPager mAdapter;
private RealmResults<RealmRoomMessage> mRealmList;
private ArrayList<RealmRoomMessage> mFList = new ArrayList<>();
private Long mRoomId;
private Long selectedFileToken;
private MediaPlayer mMediaPlayer;
private String path;
private String type = null;
private boolean isLockScreen = false;
private boolean isFocusable = false;
private Realm realmShowImage;
private ViewGroup rooShowImage;
private ViewGroup mainShowImage;
private ExitFragmentTransition exitFragmentTransition;
private TouchImageView touchImageViewTmp = null;
private int lastOrientation = 0;
public static FocusAudioListener focusAudioListener;
private ProtoGlobal.RoomMessageType messageType;
ArrayList<TextureView> mTextureViewTmp = new ArrayList<>();
public static FragmentShowImage newInstance() {
return new FragmentShowImage();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
realmShowImage = Realm.getDefaultInstance();
// View view = inflater.inflate(R.layout.activity_show_image, container, false);
// exitFragmentTransition = FragmentTransition.with(this).duration(200).interpolator(new LinearOutSlowInInterpolator()).to(view.findViewById(R.id.asi_view_pager)).start(savedInstanceState);
//
// exitFragmentTransition.exitListener(new AnimatorListenerAdapter() {
// @Override
// public void onAnimationStart(Animator animation) {
// Log.d("FFFFFFF", "onAnimationStart: ");
// }
//
// @Override
// public void onAnimationEnd(Animator animation) {
// Log.d("FFFFFFF", "onAnimationEnd: ");
// }
// }).interpolator(new FastOutSlowInInterpolator());
// exitFragmentTransition.startExitListening(view.findViewById(R.id.rooShowImage));
return inflater.inflate(R.layout.activity_show_image, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (getIntentData(this.getArguments())) {
initComponent(view);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation != lastOrientation) {
lastOrientation = newConfig.orientation;
if (touchImageViewTmp != null && videoController != null && mMediaPlayer != null) {
touchImageViewTmp.setVisibility(View.GONE);
touchImageViewTmp.setVisibility(View.VISIBLE);
if (mMediaPlayer.isPlaying()) {
videoController.show();
}
if (mTextureViewTmp.size() > 0) {
getRealSize(mMediaPlayer, mTextureViewTmp.get(0));
}
}
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (appBarLayout != null) {
appBarLayout.setVisibility(View.VISIBLE);
}
}
@Override
public void onAttach(Context context) {
if (appBarLayout != null) {
appBarLayout.setVisibility(View.GONE);
}
super.onAttach(context);
}
private Realm getRealm() {
if (realmShowImage == null || !realmShowImage.isClosed()) {
realmShowImage = Realm.getDefaultInstance();
}
return realmShowImage;
}
private boolean getIntentData(Bundle bundle) {
if (G.fragmentActivity != null) {
G.fragmentActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
if (bundle != null) {
// get a list of image
mRoomId = bundle.getLong("RoomId");
selectedFileToken = bundle.getLong("SelectedImage");
if (bundle.getString("TYPE") != null) {
// type = bundle.getString("TYPE");
messageType = convertType(bundle.getString("TYPE"));
}
if (mRoomId == null) {
// G.fragmentActivity.getSupportFragmentManager().beginTransaction().remove(FragmentShowImage.this).commit();
popBackStackFragment();
return false;
}
mRealmList = RealmRoomMessage.findSorted(getRealm(), mRoomId, RealmRoomMessageFields.UPDATE_TIME, Sort.ASCENDING);
if (mRealmList.size() < 1) {
popBackStackFragment();
return false;
}
for (RealmRoomMessage roomMessage : mRealmList) {
if (RealmRoomMessage.isImageOrVideo(roomMessage, convertType(type))) {
if ((roomMessage.getForwardMessage() != null ? roomMessage.getForwardMessage().getAttachment() : roomMessage.getAttachment()) != null)
mFList.add(roomMessage);
}
}
if (selectedFileToken != null) {
for (int i = mFList.size() - 1; i >= 0; i--) {
if (selectedFileToken == mFList.get(i).getMessageId()) {
selectedFile = i;
break;
}
}
}
return true;
} else {
if (G.fragmentActivity != null) {
popBackStackFragment();
}
return false;
}
}
private ProtoGlobal.RoomMessageType convertType(String type) {
if (type != null) {
if (type.contains(ProtoGlobal.RoomMessageType.VIDEO.toString())) {
return ProtoGlobal.RoomMessageType.VIDEO;
} else if (type.contains(ProtoGlobal.RoomMessageType.IMAGE.toString())) {
return ProtoGlobal.RoomMessageType.IMAGE;
}
}
return null;
}
private void initComponent(View view) {
downloadedList.clear();
MaterialDesignTextView btnBack = (MaterialDesignTextView) view.findViewById(R.id.asi_btn_back);
RippleView rippleBack = (RippleView) view.findViewById(R.id.asi_ripple_back);
// rippleBack.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
//
// exitFragmentTransition.startButtonExitListening(rooShowImage);
//
// }
// });
rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
G.fragmentActivity.onBackPressed();
}
});
MaterialDesignTextView btnMenu = (MaterialDesignTextView) view.findViewById(R.id.asi_btn_menu);
RippleView rippleMenu = (RippleView) view.findViewById(R.id.asi_ripple_menu);
rippleMenu.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
popUpMenuShowImage();
}
});
// rooShowImage = (ViewGroup) view.findViewById(R.id.rooShowImage);
//
// int colorFrom = getResources().getColor(R.color.transparent);
// int colorTo = getResources().getColor(R.color.black);
// ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
// colorAnimation.setDuration(300); // milliseconds
// colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
//
// @Override
// public void onAnimationUpdate(ValueAnimator animator) {
// rooShowImage.setBackgroundColor((int) animator.getAnimatedValue());
// }
//
// });
//
// colorAnimation.start();
viewPager = (ViewPager) view.findViewById(R.id.asi_view_pager);
txtImageNumber = (TextView) view.findViewById(R.id.asi_txt_image_number);
ltImageName = (ViewGroup) view.findViewById(R.id.asi_layout_image_name);
txtImageName = (TextView) view.findViewById(R.id.asi_txt_image_name);
txtImageDate = (TextView) view.findViewById(R.id.asi_txt_image_date);
txtImageTime = (TextView) view.findViewById(R.id.asi_txt_image_time);
txtImageDesc = (EmojiTextViewE) view.findViewById(R.id.asi_txt_image_desc);
toolbarShowImage = (LinearLayout) view.findViewById(R.id.toolbarShowImage);
initViewPager();
focusAudioListener = new FocusAudioListener() {
@Override
public void audioPlay(boolean isPlay) {
if (isPlay) {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
isLockScreen = true;
isFocusable = true;
}
} else {
if (mMediaPlayer != null && isFocusable) {
int length = mMediaPlayer.getCurrentPosition();
mMediaPlayer.seekTo(length);
mMediaPlayer.start();
isLockScreen = true;
isFocusable = false;
}
}
}
};
}
// ***************************************************************************************
private void initViewPager() {
mAdapter = new AdapterViewPager();
viewPager.setAdapter(mAdapter);
viewPager.setCurrenreplacedem(selectedFile);
txtImageNumber.setText(selectedFile + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
if (HelperCalander.isPersianUnicode) {
txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
}
if (selectedFile >= mFList.size()) {
return;
}
showImageInfo(mFList.get(selectedFile));
viewPager.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
@Override
public void transformPage(View view, float position) {
final float normalizedPosition = Math.abs(Math.abs(position) - 1);
view.setScaleX(normalizedPosition / 2 + 0.5f);
view.setScaleY(normalizedPosition / 2 + 0.5f);
}
});
}
/**
* show image info, time , name , description
*/
private void showImageInfo(RealmRoomMessage realmRoomMessage) {
if (realmRoomMessage == null || G.authorHash == null) {
return;
}
RealmRoomMessage realmRoomMessageFinal = RealmRoomMessage.getFinalMessage(realmRoomMessage);
if (realmRoomMessageFinal.getMessage() != null && !realmRoomMessageFinal.getMessage().isEmpty()) {
txtImageDesc.setText(realmRoomMessageFinal.getMessage());
txtImageDesc.setVisibility(View.VISIBLE);
} else {
txtImageDesc.setVisibility(View.GONE);
}
// +Realm realm = Realm.getDefaultInstance();
RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(getRealm(), realmRoomMessageFinal.getUserId());
if (realmRegisteredInfo != null) {
txtImageName.setText(realmRegisteredInfo.getDisplayName());
} else {
txtImageName.setText("");
}
if (realmRoomMessageFinal.getAuthorHash() != null && G.authorHash.equals(realmRoomMessageFinal.getAuthorHash())) {
txtImageName.setText(R.string.you);
}
if (realmRoomMessageFinal.getUpdateTime() != 0) {
txtImageTime.setText(HelperCalander.getClocktime(realmRoomMessageFinal.getUpdateTime(), true));
txtImageDate.setText(HelperCalander.checkHijriAndReturnTime(realmRoomMessageFinal.getUpdateTime() / 1000));
}
if (HelperCalander.isPersianUnicode) {
txtImageName.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageName.getText().toString()));
txtImageTime.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageTime.getText().toString()));
txtImageDate.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageDate.getText().toString()));
}
// realm.close();
}
public void popUpMenuShowImage() {
final MaterialDialog dialog = new MaterialDialog.Builder(G.fragmentActivity).customView(R.layout.chat_popup_dialog_custom, true).build();
View v = dialog.getCustomView();
DialogAnimation.animationUp(dialog);
dialog.show();
ViewGroup root1 = (ViewGroup) v.findViewById(R.id.dialog_root_item1_notification);
ViewGroup root2 = (ViewGroup) v.findViewById(R.id.dialog_root_item2_notification);
final TextView txtShare = (TextView) v.findViewById(R.id.dialog_text_item1_notification);
TextView txtSaveToGallery = (TextView) v.findViewById(R.id.dialog_text_item2_notification);
TextView iconSaveToGallery = (TextView) v.findViewById(R.id.dialog_icon_item1_notification);
iconSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.md_save));
root1.setVisibility(View.VISIBLE);
root2.setVisibility(View.VISIBLE);
txtShare.setText(getResources().getString(R.string.save_to_gallery));
if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
txtSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.share_video_file_2));
} else {
txtSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.share_image_2));
}
TextView iconShare = (TextView) v.findViewById(R.id.dialog_icon_item2_notification);
iconShare.setText(G.fragmentActivity.getResources().getString(R.string.md_share_button));
root1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
saveToGallery();
}
});
root2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
shareImage();
}
});
}
/**
* share Image and video
*/
private void shareImage() {
RealmRoomMessage roomMessage = mFList.get(viewPager.getCurrenreplacedem());
if (roomMessage != null) {
roomMessage = RealmRoomMessage.getFinalMessage(roomMessage);
String path = getFilePath(viewPager.getCurrenreplacedem());
File file = new File(path);
if (file.exists()) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
// +Realm realm = Realm.getDefaultInstance();
AppUtils.shareItem(intent, StructMessageInfo.convert(getRealm(), roomMessage));
// putExtra(intent, StructMessageInfo.convert(getRealm(), roomMessage));
startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
}
}
}
/**
* share Image and video
*/
private void saveToGallery() {
RealmRoomMessage rm = mFList.get(viewPager.getCurrenreplacedem());
if (rm != null) {
String path = getFilePath(viewPager.getCurrenreplacedem());
ProtoGlobal.RoomMessageType messageType;
if (rm.getForwardMessage() != null) {
messageType = rm.getForwardMessage().getMessageType();
} else {
messageType = rm.getMessageType();
}
File file = new File(path);
if (file.exists()) {
if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
HelperSaveFile.saveFileToDownLoadFolder(path, "VIDEO_" + System.currentTimeMillis() + ".mp4", HelperSaveFile.FolderType.video, R.string.file_save_to_video_folder);
} else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
HelperSaveFile.savePicToGallery(path, true);
}
}
}
}
public String getFilePath(int position) {
String result = "";
RealmAttachment at = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment() : mFList.get(position).getAttachment();
if (at != null) {
if (at.getLocalFilePath() != null)
result = at.getLocalFilePath();
}
ProtoGlobal.RoomMessageType messageType = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getMessageType() : mFList.get(position).getMessageType();
if (result.length() < 1) {
result = AndroidUtils.getFilePathWithCashId(at.getCacheId(), at.getName(), messageType);
}
return result;
}
public String getThumbnailPath(RealmRoomMessage roomMessage) {
String result = "";
if (roomMessage == null) {
return "";
}
if (roomMessage.getAttachment() != null) {
if (roomMessage.getAttachment().getLocalThumbnailPath() != null) {
result = roomMessage.getAttachment().getLocalThumbnailPath();
}
if (result.length() < 1) {
result = AndroidUtils.getFilePathWithCashId(roomMessage.getAttachment().getCacheId(), roomMessage.getAttachment().getName(), G.DIR_TEMP, true);
}
}
return result;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
if (videoController != null) {
videoController.hide();
videoController = null;
}
if (realmShowImage != null && !realmShowImage.isClosed()) {
realmShowImage.close();
}
}
@Override
public void onDetach() {
super.onDetach();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
if (videoController != null) {
videoController.hide();
videoController = null;
}
focusAudioListener = null;
}
@Override
public void onPause() {
super.onPause();
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
isLockScreen = true;
}
if (videoController != null && videoController.isShowing()) {
videoController.hide();
}
}
@Override
public void onResume() {
super.onResume();
if (isLockScreen) {
if (videoController != null) {
videoController.show();
}
}
}
/**
* adapter for view pager
*/
private clreplaced AdapterViewPager extends PagerAdapter implements MediaController.MediaPlayerControl {
private String videoPath;
private int lastPosition;
@Override
public int getCount() {
return mFList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
LayoutInflater inflater = LayoutInflater.from(G.fragmentActivity);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.show_image_sub_layout, (ViewGroup) container, false);
final TextureView mTextureView = (TextureView) layout.findViewById(R.id.textureView);
final ImageView imgPlay = (ImageView) layout.findViewById(R.id.imgPlay);
final TouchImageView touchImageView = (TouchImageView) layout.findViewById(R.id.sisl_touch_image_view);
FrameLayout frameLayout = (FrameLayout) layout.findViewById(R.id.Layout_showImage);
frameLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
touchImageView.performClick();
}
});
final MessageProgress progress = (MessageProgress) layout.findViewById(R.id.progress);
AppUtils.setProgresColor(progress.progressBar);
final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
if (rm != null && rm.isValid()) {
if (HelperDownloadFile.getInstance().isDownLoading(rm.getAttachment().getCacheId())) {
progress.withDrawable(R.drawable.ic_cancel, true);
startDownload(position, progress, touchImageView, imgPlay, mTextureView);
} else {
progress.withDrawable(R.drawable.ic_download, true);
}
path = getFilePath(position);
File file = new File(path);
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
mMediaPlayer.seekTo(0);
if (videoController != null)
videoController.hide();
}
if (file.exists()) {
progress.setVisibility(View.GONE);
G.imageLoader.displayImage(suitablePath(path), touchImageView);
if (rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
touchImageView.setVisibility(View.VISIBLE);
imgPlay.setVisibility(View.GONE);
isFirstPlay = false;
} else {
if (isFirstPlay) {
mTextureView.setVisibility(View.VISIBLE);
G.handler.postDelayed(new Runnable() {
@Override
public void run() {
playVideo(position, mTextureView, imgPlay, touchImageView);
}
}, 100);
isFirstPlay = false;
}
imgPlay.setVisibility(View.VISIBLE);
mTextureView.setVisibility(View.INVISIBLE);
videoPath = path;
}
} else {
imgPlay.setVisibility(View.GONE);
path = getThumbnailPath(rm);
touchImageView.setVisibility(View.VISIBLE);
file = new File(path);
if (file.exists()) {
G.imageLoader.displayImage(suitablePath(path), touchImageView);
} else if (rm.getAttachment() != null) {
// if thumpnail not exist download it
ProtoFileDownload.FileDownload.Selector selector = null;
long fileSize = 0;
if (rm.getAttachment().getSmallThumbnail() != null) {
selector = ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL;
fileSize = rm.getAttachment().getSmallThumbnail().getSize();
} else if (rm.getAttachment().getLargeThumbnail() != null) {
selector = ProtoFileDownload.FileDownload.Selector.LARGE_THUMBNAIL;
fileSize = rm.getAttachment().getLargeThumbnail().getSize();
}
final String filePathTumpnail = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), G.DIR_TEMP, true);
if (selector != null && fileSize > 0) {
HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), fileSize, selector, "", 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, int progress) {
if (progress == 100) {
G.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
G.imageLoader.displayImage(AndroidUtils.suitablePath(path), touchImageView);
}
});
}
}
@Override
public void OnError(String token) {
}
});
}
}
}
}
progress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String _cashID = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment().getCacheId() : mFList.get(position).getAttachment().getCacheId();
if (HelperDownloadFile.getInstance().isDownLoading(_cashID)) {
HelperDownloadFile.getInstance().stopDownLoad(_cashID);
} else {
progress.withDrawable(R.drawable.ic_cancel, true);
startDownload(position, progress, touchImageView, imgPlay, mTextureView);
}
}
});
touchImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isShowToolbar) {
toolbarShowImage.animate().setDuration(150).alpha(0F).start();
ltImageName.setVisibility(View.GONE);
ltImageName.animate().setDuration(150).alpha(0F).start();
toolbarShowImage.setVisibility(View.GONE);
isShowToolbar = false;
} else {
toolbarShowImage.animate().setDuration(150).alpha(1F).start();
toolbarShowImage.setVisibility(View.VISIBLE);
ltImageName.animate().setDuration(150).alpha(1F).start();
ltImageName.setVisibility(View.VISIBLE);
isShowToolbar = true;
}
if (touchImageViewTmp != null && imgPlay.getVisibility() != View.VISIBLE && mMediaPlayer != null && videoController != null) {
if (videoController.isShowing()) {
videoController.hide();
} else {
videoController.show();
}
}
}
});
imgPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTextureView.setVisibility(View.VISIBLE);
playVideo(position, mTextureView, imgPlay, touchImageView);
}
});
mTextureView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
touchImageView.performClick();
}
});
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) {
if (isFirstPlay) {
if (mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
isFirstPlay = false;
}
}
}
@Override
public void onPageSelected(final int position) {
touchImageViewTmp = null;
txtImageNumber.setText(position + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
if (HelperCalander.isPersianUnicode) {
txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
}
showImageInfo(mFList.get(position));
if (mFList.get(position).getForwardMessage() != null) {
messageType = mFList.get(position).getForwardMessage().getMessageType();
} else {
messageType = mFList.get(position).getMessageType();
}
if (mMediaPlayer != null && mMediaPlayer.isPlaying())
mMediaPlayer.stop();
if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
File f = new File(getFilePath(position));
if (f.exists()) {
imgPlay.setVisibility(View.VISIBLE);
touchImageView.setVisibility(View.VISIBLE);
} else {
imgPlay.setVisibility(View.GONE);
}
} else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
imgPlay.setVisibility(View.GONE);
}
if (videoController != null) {
videoController.hide();
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
((ViewGroup) container).addView(layout);
return layout;
}
/**
* start download
*/
private void startDownload(final int position, final MessageProgress progress, final TouchImageView touchImageView, final ImageView imgPlay, final TextureView mTextureView) {
final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
String dirPath = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), rm.getMessageType());
if (downloadedList.indexOf(rm.getAttachment().getToken()) == -1) {
downloadedList.add(rm.getAttachment().getCacheId());
}
progress.withOnProgress(new OnProgress() {
@Override
public void onProgressFinished() {
G.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
progress.withProgress(0);
progress.setVisibility(View.GONE);
if (rm.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO) {
imgPlay.setVisibility(View.VISIBLE);
// if (position == viewPager.getCurrenreplacedem()) playVideo(position, mTextureView, imgPlay, touchImageView);
}
}
});
}
});
HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), rm.getAttachment().getSize(), ProtoFileDownload.FileDownload.Selector.FILE, dirPath, 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, final int progres) {
G.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
progress.withProgress(progres);
if (progres == 100) {
G.imageLoader.displayImage(AndroidUtils.suitablePath(path), touchImageView);
}
}
});
}
@Override
public void OnError(String token) {
G.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
progress.withProgress(0);
progress.withDrawable(R.drawable.ic_download, true);
}
});
}
});
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
/**
* video player
*/
private void playVideo(final int position, final TextureView mTextureView, final ImageView imgPlay, final TouchImageView touchImageView) {
touchImageViewTmp = touchImageView;
if (mMediaPlayer == null)
mMediaPlayer = new MediaPlayer();
if (videoController == null)
videoController = new MediaController(G.fragmentActivity);
mTextureView.setVisibility(View.VISIBLE);
videoPath = getFilePath(position);
ViewCompat.setLayoutDirection(videoController, View.LAYOUT_DIRECTION_LTR);
videoController.setAnchorView(touchImageView);
videoController.setMediaPlayer(this);
imgPlay.setVisibility(View.GONE);
mMediaPlayer.reset();
mTextureViewTmp.clear();
mTextureViewTmp.add(mTextureView);
try {
mMediaPlayer.setDataSource(G.fragmentActivity, Uri.parse(videoPath));
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, touchImageView);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
Log.e("ddd", "width :" + width + " height : " + height);
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
if (mTextureView.getSurfaceTexture() != null) {
setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, touchImageView);
}
} catch (IOException | IllegalArgumentException e) {
e.printStackTrace();
}
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.seekTo(0);
imgPlay.setVisibility(View.VISIBLE);
}
});
// mMediaPlayer.seekTo(100);
}
private void setMediaPlayer(MediaPlayer mMediaPlayer, final TextureView mTextureView, final ImageView imgPlay, final TouchImageView touchImageView) {
if (mTextureView == null) {
return;
}
Surface surfaceTexture = new Surface(mTextureView.getSurfaceTexture());
if (surfaceTexture == null) {
return;
}
try {
if (mMediaPlayer != null) {
mMediaPlayer.setSurface(surfaceTexture);
mMediaPlayer.setLooping(false);
mMediaPlayer.prepareAsync();
}
} catch (IllegalStateException e) {
e.getMessage();
}
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
getRealSize(mp, mTextureView);
imgPlay.setVisibility(View.GONE);
mp.start();
MusicPlayer.pauseSound();
mTextureView.setVisibility(View.VISIBLE);
touchImageView.animate().setDuration(700).alpha(0F).start();
G.handler.postDelayed(new Runnable() {
@Override
public void run() {
touchImageView.setVisibility(View.GONE);
touchImageView.clearAnimation();
}
}, 700);
videoController.setEnabled(true);
videoController.show();
}
});
}
@Override
public void start() {
if (mMediaPlayer != null)
mMediaPlayer.start();
MusicPlayer.pauseSound();
}
@Override
public void pause() {
if (mMediaPlayer != null)
mMediaPlayer.pause();
}
@Override
public int getDuration() {
if (mMediaPlayer != null) {
return mMediaPlayer.getDuration();
}
return 0;
}
@Override
public int getCurrentPosition() {
if (mMediaPlayer != null) {
return mMediaPlayer.getCurrentPosition();
}
return 0;
}
@Override
public void seekTo(int pos) {
if (mMediaPlayer != null)
mMediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mMediaPlayer != null && mMediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
}
/**
* get real width and height video
*/
private void getRealSize(MediaPlayer mp, TextureView mTextureView) {
if (mp == null || mTextureView == null) {
return;
}
// Get the dimensions of the video
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
Display display = G.fragmentActivity.getWindowManager().getDefaultDisplay();
int finalWith, finalHeight;
finalWith = display.getWidth();
finalHeight = (int) (((float) videoHeight / (float) videoWidth) * (float) display.getWidth());
if (finalHeight > display.getHeight()) {
finalWith = (int) (((float) finalWith / (float) finalHeight) * (float) display.getHeight());
finalHeight = display.getHeight();
}
ViewGroup.LayoutParams lp = mTextureView.getLayoutParams();
lp.width = finalWith;
lp.height = finalHeight;
mTextureView.setLayoutParams(lp);
}
public interface FocusAudioListener {
void audioPlay(boolean isPlay);
}
}
16
Source : SpectaculumDemoBaseActivity.java
with Apache License 2.0
from protyposis
with Apache License 2.0
from protyposis
/**
* A base activity implementation for a Spectaculum view that provides all functionality that is
* shared among all Spectaculum demo activities.
*
* Created by Mario on 17.08.2016.
*/
public abstract clreplaced SpectaculumDemoBaseActivity extends Activity {
private static final String TAG = SpectaculumDemoBaseActivity.clreplaced.getSimpleName();
private Uri mMediaUri;
private SpectaculumView mSpectaculumView;
private EffectManager mEffectManager;
private ProgressBar mProgressIndicator;
private MediaController mMediaController;
/**
* Sets up the base activity. This must be called from a subclreplaced AFTER setting the layout.
*/
@SuppressLint("WrongViewCast")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Utils.setActionBarSubreplacedleEllipsizeMiddle(this);
// Get views from the layout
mSpectaculumView = (SpectaculumView) findViewById(R.id.spectaculum);
mProgressIndicator = (ProgressBar) findViewById(R.id.progress);
// Initialize Spectaculum effects
mEffectManager = new EffectManager(this, R.id.parameterlist, mSpectaculumView);
mEffectManager.addEffects();
// Display progress indicator because subclreplacedes will now initialize their stuff
showProgressIndicator();
}
public void showProgressIndicator() {
// Not all layouts contain a progress indicator (e.g. cameraview) so we need to check for null here
if (mProgressIndicator != null) {
mProgressIndicator.setVisibility(View.VISIBLE);
}
}
public void hideProgressIndicator() {
// Not all layouts contain a progress indicator (e.g. cameraview) so we need to check for null here
if (mProgressIndicator != null) {
mProgressIndicator.setVisibility(View.GONE);
}
}
public void setMediaUri(Uri mediaUri) {
mMediaUri = mediaUri;
getActionBar().setSubreplacedle(mMediaUri.toString());
}
/**
* Creates a media controller and attaches it to the activity.
* This method is for activities that contain a video player.
* @param mediaPlayerControl the control interface, e.g. a video view
*/
public void initMediaController(MediaController.MediaPlayerControl mediaPlayerControl) {
mMediaController = new MediaController(this);
mMediaController.setAnchorView(findViewById(R.id.container));
mMediaController.setMediaPlayer(mediaPlayerControl);
mMediaController.setEnabled(false);
}
/**
* Returns the media controller for programmatic control of video playback.
*/
public MediaController getMediaControllerWidget() {
return mMediaController;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Add the common menu items to the action bar
getMenuInflater().inflate(R.menu.common, menu);
// Add the effects submenu to the action bar
mEffectManager.addToMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.gereplacedemId();
// Handle action bar clicks
if (mEffectManager.doMenuActions(item)) {
// An effect has been selected
return true;
} else if (id == R.id.action_save_frame) {
// Request a frame capture; make sure that a OnFrameCapturedCallback is attached
mSpectaculumView.captureFrame();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Try to toggle the media controller
if (event.getAction() == MotionEvent.ACTION_UP && mMediaController != null) {
long durationMs = event.getEventTime() - event.getDownTime();
/*
*If a certain short amount of time preplacedes between DOWN and UP actions, we clreplacedify the
* event as simple tap and toggle the visibility of the media controller.
*/
if (durationMs < 500) {
if (mMediaController.isShowing()) {
mMediaController.hide();
} else {
mMediaController.show();
}
}
}
// Hand the event to the Spectaculum view to process zoom/pan gestures
if (!mSpectaculumView.isTouchEnabled()) {
mSpectaculumView.onTouchEvent(event);
}
return super.onTouchEvent(event);
}
@Override
protected void onPause() {
super.onPause();
mEffectManager.onPause();
// Spectaculum must be paused when activity pauses to suspend the rendering thread
mSpectaculumView.onPause();
}
@Override
protected void onResume() {
super.onResume();
// Log RAM state
ActivityManager activityManager = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
Log.d(TAG, "Memory (available/total/low): " + (memoryInfo.availMem / 1024 / 1024) + "/" + (memoryInfo.totalMem / 1024 / 1024) + "/" + memoryInfo.lowMemory);
mEffectManager.onResume();
// Spectaculum must be resumed when activity resumes to resume the rendering thread
mSpectaculumView.onResume();
}
@Override
protected void onStop() {
// Hide media controller to avoid window leak
if (mMediaController != null) {
mMediaController.hide();
}
super.onStop();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Retain the media uri through a configuration change
if (mMediaUri != null) {
outState.putParcelable("uri", mMediaUri);
}
}
}
16
Source : PictureVideoPlayActivity.java
with Apache License 2.0
from JessYanCoding
with Apache License 2.0
from JessYanCoding
/**
* @author:luck
* @data:2017/8/28 下午11:00
* @描述: 视频播放类
*/
public clreplaced PictureVideoPlayActivity extends PictureBaseActivity implements MediaPlayer.OnErrorListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, View.OnClickListener {
private String videoPath;
private ImageButton ibLeftBack;
private MediaController mMediaController;
private VideoView mVideoView;
private TextView tvConfirm;
private ImageView iv_play;
private int mPositionWhenPaused = -1;
@Override
public boolean isImmersive() {
return false;
}
@Override
public boolean isRequestedOrientation() {
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
super.onCreate(savedInstanceState);
}
@Override
public int getResourceId() {
return R.layout.picture_activity_video_play;
}
@Override
protected void initPictureSelectorStyle() {
if (config.style != null) {
if (config.style.pictureLeftBackIcon != 0) {
ibLeftBack.setImageResource(config.style.pictureLeftBackIcon);
}
}
}
@Override
protected void initWidgets() {
super.initWidgets();
videoPath = getIntent().getStringExtra(PictureConfig.EXTRA_VIDEO_PATH);
boolean isExternalPreview = getIntent().getBooleanExtra(PictureConfig.EXTRA_PREVIEW_VIDEO, false);
if (TextUtils.isEmpty(videoPath)) {
LocalMedia media = getIntent().getParcelableExtra(PictureConfig.EXTRA_MEDIA_KEY);
if (media == null || TextUtils.isEmpty(media.getPath())) {
finish();
return;
}
videoPath = media.getPath();
}
if (TextUtils.isEmpty(videoPath)) {
closeActivity();
return;
}
ibLeftBack = findViewById(R.id.pictureLeftBack);
mVideoView = findViewById(R.id.video_view);
tvConfirm = findViewById(R.id.tv_confirm);
mVideoView.setBackgroundColor(Color.BLACK);
iv_play = findViewById(R.id.iv_play);
mMediaController = new MediaController(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setOnPreparedListener(this);
mVideoView.setMediaController(mMediaController);
ibLeftBack.setOnClickListener(this);
iv_play.setOnClickListener(this);
tvConfirm.setOnClickListener(this);
tvConfirm.setVisibility(config.selectionMode == PictureConfig.SINGLE && config.enPreviewVideo && !isExternalPreview ? View.VISIBLE : View.GONE);
}
@Override
public void onStart() {
// Play Video
if (SdkVersionUtils.checkedAndroid_Q() && PictureMimeType.isContent(videoPath)) {
mVideoView.setVideoURI(Uri.parse(videoPath));
} else {
mVideoView.setVideoPath(videoPath);
}
mVideoView.start();
super.onStart();
}
@Override
public void onPause() {
// Stop video when the activity is pause.
mPositionWhenPaused = mVideoView.getCurrentPosition();
mVideoView.stopPlayback();
super.onPause();
}
@Override
protected void onDestroy() {
mMediaController = null;
mVideoView = null;
iv_play = null;
super.onDestroy();
}
@Override
public void onResume() {
// Resume video player
if (mPositionWhenPaused >= 0) {
mVideoView.seekTo(mPositionWhenPaused);
mPositionWhenPaused = -1;
}
super.onResume();
}
@Override
public boolean onError(MediaPlayer player, int arg1, int arg2) {
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
if (null != iv_play) {
iv_play.setVisibility(View.VISIBLE);
}
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.pictureLeftBack) {
onBackPressed();
} else if (id == R.id.iv_play) {
mVideoView.start();
iv_play.setVisibility(View.INVISIBLE);
} else if (id == R.id.tv_confirm) {
List<LocalMedia> result = new ArrayList<>();
result.add(getIntent().getParcelableExtra(PictureConfig.EXTRA_MEDIA_KEY));
setResult(RESULT_OK, new Intent().putParcelableArrayListExtra(PictureConfig.EXTRA_SELECT_LIST, (ArrayList<? extends Parcelable>) result));
onBackPressed();
}
}
@Override
public void onBackPressed() {
if (config.windowAnimationStyle != null && config.windowAnimationStyle.activityPreviewExitAnimation != 0) {
finish();
overridePendingTransition(0, config.windowAnimationStyle != null && config.windowAnimationStyle.activityPreviewExitAnimation != 0 ? config.windowAnimationStyle.activityPreviewExitAnimation : R.anim.picture_anim_exit);
} else {
closeActivity();
}
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(new ContextWrapper(newBase) {
@Override
public Object getSystemService(String name) {
if (Context.AUDIO_SERVICE.equals(name)) {
return getApplicationContext().getSystemService(name);
}
return super.getSystemService(name);
}
});
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.setOnInfoListener((mp1, what, extra) -> {
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
// video started
mVideoView.setBackgroundColor(Color.TRANSPARENT);
return true;
}
return false;
});
}
}
16
Source : VideoViewTV.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewTV extends SurfaceView implements LetvMediaPlayerControl {
private static final int STATE_ERROR = -1;
private static final int STATE_IDLE = 0;
private static final int STATE_PAUSED = 4;
private static final int STATE_PLAYBACK_COMPLETED = 5;
private static final int STATE_PLAYING = 3;
private static final int STATE_PREPARED = 2;
private static final int STATE_PREPARING = 1;
private final int FORWARD_TIME;
private final int REWIND_TIME;
private int duration;
protected int lastSeekWhenDestoryed;
private final OnBufferingUpdateListener mBufferingUpdateListener;
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private final OnCompletionListener mCompletionListener;
protected Context mContext;
private int mCurrentBufferPercentage;
private int mCurrentState;
private final OnErrorListener mErrorListener;
private Map<String, String> mHeaders;
OnInfoListener mInfoListener;
private MediaPlayer mMediaPlayer;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
OnPreparedListener mPreparedListener;
private int mRatioType;
Callback mSHCallback;
OnSeekCompleteListener mSeekCompleteListener;
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener;
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder;
private int mSurfaceWidth;
private int mTargetState;
private Uri mUri;
private int mVideoHeight;
private int mVideoWidth;
private MediaController mediaController;
public VideoViewTV(Context context) {
super(context);
this.FORWARD_TIME = 20000;
this.REWIND_TIME = 20000;
this.mCurrentState = 0;
this.mTargetState = 0;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.lastSeekWhenDestoryed = 0;
this.mRatioType = -1;
this.mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
VideoViewTV.this.mSurfaceWidth = w;
VideoViewTV.this.mSurfaceHeight = h;
LogTag.i("VideoViewTV", "surfaceChanged(), mSurfaceWidth=" + VideoViewTV.this.mSurfaceWidth + ", mSurfaceHeight=" + VideoViewTV.this.mSurfaceHeight);
boolean isValidState;
if (VideoViewTV.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewTV.this.mVideoWidth == w && VideoViewTV.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewTV.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewTV.this.mSeekWhenPrepared != 0) {
VideoViewTV.this.seekTo(VideoViewTV.this.mSeekWhenPrepared);
}
VideoViewTV.this.start();
}
}
public void surfaceCreated(SurfaceHolder holder) {
LogTag.i("VideoViewTV", "surfaceCreated()");
VideoViewTV.this.mSurfaceHolder = holder;
VideoViewTV.this.openVideo();
}
public void surfaceDestroyed(SurfaceHolder holder) {
LogTag.i("VideoViewTV", "surfaceDestroyed()");
VideoViewTV.this.mSurfaceHolder = null;
if (VideoViewTV.this.mediaController != null) {
VideoViewTV.this.mediaController.hide();
}
VideoViewTV.this.lastSeekWhenDestoryed = VideoViewTV.this.getCurrentPosition();
VideoViewTV.this.release(true);
}
};
this.mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
VideoViewTV.this.mVideoWidth = mp.getVideoWidth();
VideoViewTV.this.mVideoHeight = mp.getVideoHeight();
LogTag.i("VideoViewTV", "onVideoSizeChanged(), mVideoWidth=" + VideoViewTV.this.mVideoWidth + ", mVideoHeight=" + VideoViewTV.this.mVideoHeight);
if (VideoViewTV.this.mVideoWidth != 0 && VideoViewTV.this.mVideoHeight != 0) {
VideoViewTV.this.getHolder().setFixedSize(VideoViewTV.this.mVideoWidth, VideoViewTV.this.mVideoHeight);
}
}
};
this.mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (VideoViewTV.this.mOnInfoListener == null || !VideoViewTV.this.mOnInfoListener.onInfo(mp, what, extra)) {
return false;
}
return true;
}
};
this.mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
if (VideoViewTV.this.mOnSeekCompleteListener != null) {
VideoViewTV.this.mOnSeekCompleteListener.onSeekComplete(mp);
}
}
};
this.mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewTv(乐视电视videoview) onPrepared()");
if (VideoViewTV.this.mOnMediaStateTimeListener != null) {
VideoViewTV.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewTV.this.mCurrentState = 2;
try {
Metadata data = (Metadata) Clreplaced.forName(MediaPlayer.clreplaced.getName()).getMethod("getMetadata", new Clreplaced[] { Boolean.TYPE, Boolean.TYPE }).invoke(mp, new Object[] { Boolean.valueOf(false), Boolean.valueOf(false) });
VideoViewTV videoViewTV;
if (data != null) {
videoViewTV = VideoViewTV.this;
boolean z = !data.has(29) || data.getBoolean(29);
videoViewTV.mCanPause = z;
videoViewTV = VideoViewTV.this;
z = !data.has(30) || data.getBoolean(30);
videoViewTV.mCanSeekBack = z;
videoViewTV = VideoViewTV.this;
z = !data.has(31) || data.getBoolean(31);
videoViewTV.mCanSeekForward = z;
} else {
VideoViewTV videoViewTV2 = VideoViewTV.this;
videoViewTV = VideoViewTV.this;
VideoViewTV.this.mCanSeekForward = true;
videoViewTV.mCanSeekBack = true;
videoViewTV2.mCanPause = true;
}
if (VideoViewTV.this.mOnPreparedListener != null && VideoViewTV.this.isInPlaybackState()) {
VideoViewTV.this.mOnPreparedListener.onPrepared(VideoViewTV.this.mMediaPlayer);
}
if (VideoViewTV.this.mediaController != null) {
VideoViewTV.this.mediaController.setEnabled(true);
}
VideoViewTV.this.mVideoWidth = mp.getVideoWidth();
VideoViewTV.this.mVideoHeight = mp.getVideoHeight();
int seekToPosition = VideoViewTV.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewTV.this.seekTo(seekToPosition);
}
if (VideoViewTV.this.mVideoWidth != 0 && VideoViewTV.this.mVideoHeight != 0) {
VideoViewTV.this.getHolder().setFixedSize(VideoViewTV.this.mVideoWidth, VideoViewTV.this.mVideoHeight);
if (VideoViewTV.this.mSurfaceWidth != VideoViewTV.this.mVideoWidth || VideoViewTV.this.mSurfaceHeight != VideoViewTV.this.mVideoHeight) {
return;
}
if (VideoViewTV.this.mTargetState == 3) {
VideoViewTV.this.start();
if (VideoViewTV.this.mediaController != null) {
VideoViewTV.this.mediaController.show();
}
} else if (!VideoViewTV.this.isPlaying()) {
if ((seekToPosition != 0 || VideoViewTV.this.getCurrentPosition() > 0) && VideoViewTV.this.mediaController != null) {
VideoViewTV.this.mediaController.show(0);
}
}
} else if (VideoViewTV.this.mTargetState == 3) {
VideoViewTV.this.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
this.mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
VideoViewTV.this.mCurrentState = 5;
VideoViewTV.this.mTargetState = 5;
if (VideoViewTV.this.mediaController != null) {
VideoViewTV.this.mediaController.hide();
}
if (VideoViewTV.this.mOnCompletionListener != null) {
VideoViewTV.this.mOnCompletionListener.onCompletion(VideoViewTV.this.mMediaPlayer);
}
}
};
this.mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
VideoViewTV.this.mCurrentState = -1;
VideoViewTV.this.mTargetState = -1;
if (VideoViewTV.this.mediaController != null) {
VideoViewTV.this.mediaController.hide();
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewTV(乐视电视videoview) error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewTV.this.mOnMediaStateTimeListener != null) {
VideoViewTV.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
return (VideoViewTV.this.mOnErrorListener == null || VideoViewTV.this.mOnErrorListener.onError(VideoViewTV.this.mMediaPlayer, framework_err, impl_err)) ? true : true;
}
};
this.mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewTV.this.mCurrentBufferPercentage = percent;
if (VideoViewTV.this.mOnBufferingUpdateListener != null) {
VideoViewTV.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
this.mContext = context;
initVideoView();
setBackgroundColor(Color.argb(101, 99, 22, 0));
}
public VideoViewTV(Context context, AttributeSet attrs) {
this(context, attrs, 0);
this.mContext = context;
initVideoView();
}
public VideoViewTV(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.FORWARD_TIME = 20000;
this.REWIND_TIME = 20000;
this.mCurrentState = 0;
this.mTargetState = 0;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.lastSeekWhenDestoryed = 0;
this.mRatioType = -1;
???;
???;
???;
???;
???;
???;
???;
???;
this.mContext = context;
initVideoView();
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
this.mTargetState = 0;
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
public boolean extIsInPlaybackState() {
return isInPlaybackState();
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public void stopPlayback() {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewTV release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mCurrentState = 0;
this.mTargetState = 0;
}
this.mMediaPlayer = null;
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height <= this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
LogTag.i("VideoViewTV", "onMeasure(), width=" + width + ", height=" + height + ", mVideoWidth=" + this.mVideoWidth + ", mVideoHeight=" + this.mVideoHeight);
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
public void setVideoPath(String path) {
setVideoURI(Uri.parse(path));
}
public void setVideoPath(String path, Map<String, String> headers) {
setVideoURI(Uri.parse(path), headers);
}
public void setVideoURI(Uri uri) {
setVideoURI(uri, null);
}
public void setVideoURI(Uri uri, Map<String, String> headers) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewTV(乐视电视videoview) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mHeaders = headers;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
}
private void initListener() {
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
}
private void deadListener(MediaPlayer mMediaPlayer) {
if (mMediaPlayer != null) {
mMediaPlayer.setOnSeekCompleteListener(null);
mMediaPlayer.setOnInfoListener(null);
mMediaPlayer.setOnPreparedListener(null);
mMediaPlayer.setOnVideoSizeChangedListener(null);
mMediaPlayer.setOnCompletionListener(null);
mMediaPlayer.setOnErrorListener(null);
mMediaPlayer.setOnBufferingUpdateListener(null);
}
}
@SuppressLint({ "NewApi" })
private void openVideo() {
if (this.mUri != null && this.mSurfaceHolder != null) {
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
this.mContext.sendBroadcast(i);
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(乐视电视videoview) 创建MediaPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new MediaPlayer();
initListener();
this.duration = -1;
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource(this.mContext, this.mUri, this.mHeaders);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
attachMediaController();
} catch (IOException e) {
this.mCurrentState = -1;
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException e2) {
this.mCurrentState = -1;
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (Exception e3) {
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
}
public void setMediaController(MediaController controller) {
if (this.mediaController != null) {
this.mediaController.hide();
}
this.mediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mediaController != null) {
View anchorView;
this.mediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mediaController.setAnchorView(anchorView);
this.mediaController.setEnabled(isInPlaybackState());
}
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewTV release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
deadListener(this.mMediaPlayer);
this.mMediaPlayer = null;
this.mCurrentState = 0;
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public void reset() {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 164 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mediaController.show();
return true;
}
start();
this.mediaController.hide();
return true;
} else if (keyCode == TransportMediator.KEYCODE_MEDIA_PLAY) {
if (this.mMediaPlayer.isPlaying()) {
return true;
}
start();
this.mediaController.hide();
return true;
} else if (keyCode != 86 && keyCode != TransportMediator.KEYCODE_MEDIA_PAUSE) {
toggleMediaControlsVisiblity();
} else if (!this.mMediaPlayer.isPlaying()) {
return true;
} else {
pause();
this.mediaController.show();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
private void toggleMediaControlsVisiblity() {
if (this.mediaController.isShowing()) {
this.mediaController.hide();
} else {
this.mediaController.show();
}
}
public void start() {
HttpRequestManager.getInstance(this.mContext).requestCapability();
if (isInPlaybackState()) {
this.mMediaPlayer.start();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewTV(乐视电视videoview) start()");
this.mCurrentState = 3;
}
this.mTargetState = 3;
}
public void start(MediaPlayer mMediaPlayer) {
if (isInPlaybackState()) {
mMediaPlayer.start();
this.mCurrentState = 3;
}
this.mTargetState = 3;
}
public void pause() {
if (isInPlaybackState()) {
try {
if (this.mMediaPlayer != null && this.mMediaPlayer.isPlaying()) {
this.mMediaPlayer.pause();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewTV(乐视电视videoview) pause()");
this.mCurrentState = 4;
}
} catch (Exception e) {
}
}
this.mTargetState = 4;
}
public void suspend() {
release(false);
}
public void resume() {
openVideo();
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.duration = -1;
return this.duration;
} else if (this.duration > 0) {
return this.duration;
} else {
this.duration = this.mMediaPlayer.getDuration();
return this.duration;
}
}
public void seekTo(int msec) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(msec);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = msec;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + 20000);
}
public void rewind() {
seekTo(getCurrentPosition() - 20000);
}
public boolean isPlaying() {
try {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
} catch (Exception e) {
return false;
}
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
protected int[] getVideoSize() {
if (this.mMediaPlayer == null) {
return null;
}
int width = this.mMediaPlayer.getVideoWidth();
int height = this.mMediaPlayer.getVideoHeight();
int[] screenSize = new int[2];
float ratios = Math.max(((float) width) / ((float) this.mSurfaceWidth), ((float) height) / ((float) this.mSurfaceHeight));
screenSize[0] = (int) Math.ceil((double) (((float) width) / ratios));
screenSize[1] = (int) Math.ceil((double) (((float) height) / ratios));
return screenSize;
}
public View getView() {
return this;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public OnSeekCompleteListener getOnSeekCompleteListener() {
return this.mOnSeekCompleteListener;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener mOnSeekCompleteListener) {
this.mOnSeekCompleteListener = mOnSeekCompleteListener;
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewStateChangeListener) {
}
public boolean isEnforcementWait() {
return false;
}
public void setEnforcementWait(boolean enforcementWait) {
}
public boolean isEnforcementPause() {
return false;
}
public void setEnforcementPause(boolean enforcementPause) {
}
public void setVideoPlayUrl(PlayUrl url) {
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
}
public int getAudioSessionId() {
return 0;
}
public void setOnCacheListener(OnCacheListener l) {
}
public void setOnFirstPlayListener(OnFirstPlayLitener l) {
}
public int setSourceType(int sourceType) {
return 0;
}
public int setMachineInfomation(float ScreenResolution) {
return 0;
}
public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
return 0;
}
public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
return 0;
}
public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
return 0;
}
public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
return 0;
}
public int setgravity_yroValidInfomation(boolean gravityValid) {
return 0;
}
public int setAngleInit() {
return 0;
}
public int setTwoFingerZoom(float zoom) {
return 0;
}
public void setInitPosition(int msec) {
}
public void setVolume(int volume) {
}
public void setCacheTime(double start_cache, double block_cache) {
}
public void processSensorEvent(SensorEvent sensorEvent) {
}
}
16
Source : VideoViewH264LeMobile.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264LeMobile extends SurfaceView implements LetvMediaPlayerControl {
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
private final int FORWARD_TIME;
private final int REWIND_TIME;
private String TAG;
private boolean enforcementPause;
private boolean enforcementWait;
protected int lastSeekWhenDestoryed;
private OnBufferingUpdateListener mBufferingUpdateListener;
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener;
private Context mContext;
private int mCurrentBufferPercentage;
private int mCurrentState;
private int mDuration;
private OnErrorListener mErrorListener;
private OnInfoListener mInfoListener;
private MediaController mMediaController;
private MediaPlayer mMediaPlayer;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener;
private int mRatioType;
Callback mSHCallback;
private OnSeekCompleteListener mSeekCompleteListener;
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener;
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder;
private int mSurfaceWidth;
private int mTargetState;
private Uri mUri;
private int mVideoHeight;
private int mVideoWidth;
public VideoViewH264LeMobile(Context context) {
super(context);
this.TAG = "VideoViewLeMobile";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
this.mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
VideoViewH264LeMobile.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264LeMobile.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264LeMobile.this.mVideoWidth == 0 || VideoViewH264LeMobile.this.mVideoHeight == 0)) {
VideoViewH264LeMobile.this.getHolder().setFixedSize(VideoViewH264LeMobile.this.mVideoWidth, VideoViewH264LeMobile.this.mVideoHeight);
}
if (VideoViewH264LeMobile.this.mOnVideoSizeChangedListener != null) {
VideoViewH264LeMobile.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
}
}
};
this.mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobile(乐视手机videoview) onPrepared()");
if (VideoViewH264LeMobile.this.mOnMediaStateTimeListener != null) {
VideoViewH264LeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264LeMobile.this.mCurrentState = 2;
VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
VideoViewH264LeMobile videoViewH264LeMobile = VideoViewH264LeMobile.this;
VideoViewH264LeMobile videoViewH264LeMobile2 = VideoViewH264LeMobile.this;
VideoViewH264LeMobile.this.mCanSeekForward = true;
videoViewH264LeMobile2.mCanSeekBack = true;
videoViewH264LeMobile.mCanPause = true;
if (VideoViewH264LeMobile.this.mMediaController != null) {
VideoViewH264LeMobile.this.mMediaController.setEnabled(true);
}
VideoViewH264LeMobile.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264LeMobile.this.mVideoHeight = mp.getVideoHeight();
int seekToPosition = VideoViewH264LeMobile.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264LeMobile.this.seekTo(seekToPosition);
}
if (VideoViewH264LeMobile.this.mVideoWidth != 0 && VideoViewH264LeMobile.this.mVideoHeight != 0) {
VideoViewH264LeMobile.this.getHolder().setFixedSize(VideoViewH264LeMobile.this.mVideoWidth, VideoViewH264LeMobile.this.mVideoHeight);
if (VideoViewH264LeMobile.this.mSurfaceWidth == VideoViewH264LeMobile.this.mVideoWidth && VideoViewH264LeMobile.this.mSurfaceHeight == VideoViewH264LeMobile.this.mVideoHeight) {
if (VideoViewH264LeMobile.this.mTargetState == 3) {
VideoViewH264LeMobile.this.start();
if (VideoViewH264LeMobile.this.mMediaController != null) {
VideoViewH264LeMobile.this.mMediaController.show();
}
} else if (!VideoViewH264LeMobile.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264LeMobile.this.getCurrentPosition() > 0) && VideoViewH264LeMobile.this.mMediaController != null)) {
VideoViewH264LeMobile.this.mMediaController.show(0);
}
}
} else if (VideoViewH264LeMobile.this.mTargetState == 3) {
VideoViewH264LeMobile.this.start();
}
if (VideoViewH264LeMobile.this.mOnPreparedListener != null) {
VideoViewH264LeMobile.this.mOnPreparedListener.onPrepared(mp);
}
}
};
this.mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
LogTag.i("onCompletion()");
VideoViewH264LeMobile.this.mCurrentState = 5;
VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
VideoViewH264LeMobile.this.mTargetState = 5;
VideoViewH264LeMobile.this.mCurrentState = 6;
VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
if (VideoViewH264LeMobile.this.mMediaController != null) {
VideoViewH264LeMobile.this.mMediaController.hide();
}
if (VideoViewH264LeMobile.this.mOnCompletionListener != null) {
VideoViewH264LeMobile.this.mOnCompletionListener.onCompletion(mp);
}
}
};
this.mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
VideoViewH264LeMobile.this.mCurrentState = -1;
VideoViewH264LeMobile.this.StateChange(VideoViewH264LeMobile.this.mCurrentState);
VideoViewH264LeMobile.this.mTargetState = -1;
if (VideoViewH264LeMobile.this.mMediaController != null) {
VideoViewH264LeMobile.this.mMediaController.hide();
}
if (VideoViewH264LeMobile.this.mOnErrorListener != null) {
VideoViewH264LeMobile.this.mOnErrorListener.onError(mp, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewLeMobile(乐视手机videoview) error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewH264LeMobile.this.mOnMediaStateTimeListener != null) {
VideoViewH264LeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
return true;
}
};
this.mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264LeMobile.this.mCurrentBufferPercentage = percent;
if (VideoViewH264LeMobile.this.mOnBufferingUpdateListener != null) {
VideoViewH264LeMobile.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
this.mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
LogTag.i("onSeekComplete()");
if (VideoViewH264LeMobile.this.mOnSeekCompleteListener != null) {
VideoViewH264LeMobile.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264LeMobile.this.mMediaPlayer);
}
}
};
this.mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (VideoViewH264LeMobile.this.mOnInfoListener != null) {
VideoViewH264LeMobile.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
this.mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
VideoViewH264LeMobile.this.mSurfaceWidth = w;
VideoViewH264LeMobile.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264LeMobile.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264LeMobile.this.mVideoWidth == w && VideoViewH264LeMobile.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264LeMobile.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264LeMobile.this.mSeekWhenPrepared != 0) {
VideoViewH264LeMobile.this.seekTo(VideoViewH264LeMobile.this.mSeekWhenPrepared);
}
VideoViewH264LeMobile.this.start();
if (VideoViewH264LeMobile.this.mMediaController != null) {
VideoViewH264LeMobile.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceCreated()");
VideoViewH264LeMobile.this.mSurfaceHolder = holder;
VideoViewH264LeMobile.this.openVideo();
}
public void surfaceDestroyed(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceDestroyed()");
VideoViewH264LeMobile.this.mSurfaceHolder = null;
if (VideoViewH264LeMobile.this.mMediaController != null) {
VideoViewH264LeMobile.this.mMediaController.hide();
}
VideoViewH264LeMobile.this.lastSeekWhenDestoryed = VideoViewH264LeMobile.this.getCurrentPosition();
VideoViewH264LeMobile.this.release(true);
}
};
this.mContext = context;
initVideoView();
}
public VideoViewH264LeMobile(Context context, AttributeSet attrs) {
this(context, attrs, 0);
this.mContext = context;
initVideoView();
}
public VideoViewH264LeMobile(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.TAG = "VideoViewLeMobile";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
???;
???;
???;
???;
???;
???;
???;
???;
this.mContext = context;
initVideoView();
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height <= this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String path) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(path);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(path));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobile(乐视手机videoview) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null) {
setVisibility(0);
return;
}
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
this.mContext.sendBroadcast(i);
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobile(乐视手机videoview) 创建MediaPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new MediaPlayer();
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
StateChange(this.mCurrentState);
attachMediaController();
} catch (IOException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException ex2) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264LeMobile release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public void start() {
HttpRequestManager.getInstance(this.mContext).requestCapability();
if (this.enforcementWait || this.enforcementPause) {
StateChange(7);
} else if (isInPlaybackState()) {
LogTag.i("start()");
this.mMediaPlayer.start();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + "VideoViewH264LeMobile start()");
this.mCurrentState = 3;
StateChange(this.mCurrentState);
}
this.mTargetState = 3;
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
LogTag.i("pause()");
this.mMediaPlayer.pause();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + "VideoViewH264LeMobile pause()");
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
}
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public void seekTo(int msec) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(msec);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = msec;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public void stopPlayback() {
LogTag.i("stopPlayback()");
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264LeMobile stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264LeMobile release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
if (this.mOnVideoViewStateChangeListener != null) {
this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
this.mOnVideoViewStateChangeListener = videoViewListener;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
}
public int getAudioSessionId() {
return 0;
}
public void setOnCacheListener(OnCacheListener l) {
}
public void setOnFirstPlayListener(OnFirstPlayLitener l) {
}
public int setSourceType(int sourceType) {
return 0;
}
public int setMachineInfomation(float ScreenResolution) {
return 0;
}
public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
return 0;
}
public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
return 0;
}
public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
return 0;
}
public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
return 0;
}
public int setgravity_yroValidInfomation(boolean gravityValid) {
return 0;
}
public int setAngleInit() {
return 0;
}
public int setTwoFingerZoom(float zoom) {
return 0;
}
public void setInitPosition(int msec) {
}
public void setVolume(int volume) {
}
public void setCacheTime(double start_cache, double block_cache) {
}
public void processSensorEvent(SensorEvent sensorEvent) {
}
}
16
Source : VideoViewH264mp4_4D.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264mp4_4D extends SurfaceView implements LetvMediaPlayerControl4D {
public static final int DEFAULT = 0;
private static int FIRST_SYNC_UPDATE_TIME_MS = 200;
private static int HAPTICS_RESYNC_INTERVAL_MS = LeMessageIds.MSG_FLOAT_BALL_REQUEST_DATA;
public static final int HAPTIC_ERROR = -1;
public static final int HAPTIC_INITIALIZED = 1;
public static final int HAPTIC_UNINITIALIZED = 0;
private static final String INACCESSIBLE_URL = "INACCESSIBLE_URL";
private static int INITIAL_RESYNC_INTERVAL_MS = 100;
private static final String INVALID = "INVALID";
private static final String MALFORMED_URL = "MALFORMED_URL";
private static int MEDIA_PREPARE_INTERVAL_MS = 20;
public static final int MUTED = 1;
public static final int PAUSED = 2;
public static final int PAUSED_BUFFERRING_FINISHED = 4;
public static final int PAUSED_DUE_TO_BUFFERING = 3;
private static final String PERMISSION_DENIED = "PERMISSION_DENIED";
public static final int PLAYING = 1;
private static int PLAY_PAUSE_FADEOUT_TIME_MS = 2000;
private static int SEEKBAR_UPDATE_DURATION_MS = 200;
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
public static final int STOPPED = 0;
private static final String SUCCESS = "SUCCESS";
public static final int UNINITIALIZED = -1;
private static final String UNSUPPORTED_PROTOCOL = "UNSUPPORTED_PROTOCOL";
private final int FORWARD_TIME;
private final int REWIND_TIME;
private String TAG;
private Runnable changeResyncInterval;
private boolean downloadHapt;
private boolean enforcementPause;
private boolean enforcementWait;
private String hapt;
protected int lastSeekWhenDestoryed;
private OnBufferingUpdateListener mBufferingUpdateListener;
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener;
private Context mContext;
private int mCurrentBufferPercentage;
private int mCurrentState;
private int mDuration;
private OnErrorListener mErrorListener;
private HashMap<Integer, String> mErrorValues;
private String mHaptFileName;
private int mHapticState;
private HapticContentSDK mHaptics;
private OnInfoListener mInfoListener;
private boolean mIsMediaBuffering;
private boolean mIsMediaPreparing;
private boolean mIsSeeked;
private MediaController mMediaController;
private Handler mMediaControlsHandler;
private boolean mMediaLoaded;
private MediaPlayer mMediaPlayer;
private int mMediaState;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;
private String mPreplacedsword;
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener;
private int mRatioType;
private int mResyncInterval;
Callback mSHCallback;
private int mSavedPos;
private OnSeekCompleteListener mSeekCompleteListener;
private int mSeekToPosition;
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener;
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder;
private int mSurfaceWidth;
private int mTargetState;
private Uri mUri;
private String mUserName;
private int mVideoHeight;
private int mVideoWidth;
private int mVolumeState;
private Runnable resyncHaptics;
private long time;
private clreplaced MediaPreparer implements Runnable {
private boolean mIsPrepared;
private int mProgress;
public MediaPreparer(boolean prepared, int progress) {
this.mIsPrepared = prepared;
this.mProgress = progress;
VideoViewH264mp4_4D.this.mIsMediaPreparing = true;
}
public void run() {
int curProgress = VideoViewH264mp4_4D.this.getCurrentPosition();
int delta = curProgress - this.mProgress;
if (VideoViewH264mp4_4D.this.mMediaState == 3) {
if (VideoViewH264mp4_4D.this.isHapticUsable()) {
VideoViewH264mp4_4D.this.mHaptics.pause();
}
} else if ((this.mIsPrepared || delta != 0) && !(this.mIsPrepared && delta == 0)) {
int returnVal;
if (this.mIsPrepared) {
if (VideoViewH264mp4_4D.this.isHapticUsable()) {
if (VideoViewH264mp4_4D.this.mMediaState != 0) {
returnVal = VideoViewH264mp4_4D.this.mHaptics.seek(curProgress);
if (returnVal != 0) {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics seek failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
}
}
System.out.println("test prepare:resume");
returnVal = VideoViewH264mp4_4D.this.mHaptics.resume();
if (returnVal != 0) {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
}
} else {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics was not initialized yet.");
}
VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.resyncHaptics);
VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.changeResyncInterval);
VideoViewH264mp4_4D.this.mMediaState = 1;
} else {
if (!VideoViewH264mp4_4D.this.isHapticUsable()) {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics was not initialized yet.");
} else if (VideoViewH264mp4_4D.this.mMediaLoaded) {
returnVal = VideoViewH264mp4_4D.this.mHaptics.play();
if (returnVal != 0) {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics play failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
}
} else {
System.out.println("test mediaprepare else: resume");
returnVal = VideoViewH264mp4_4D.this.mHaptics.resume();
if (returnVal != 0) {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
}
VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.resyncHaptics);
VideoViewH264mp4_4D.this.post(VideoViewH264mp4_4D.this.changeResyncInterval);
}
VideoViewH264mp4_4D.this.mMediaState = 1;
}
VideoViewH264mp4_4D.this.mIsSeeked = false;
VideoViewH264mp4_4D.this.mIsMediaPreparing = false;
} else {
VideoViewH264mp4_4D.this.mMediaControlsHandler.postDelayed(this, (long) VideoViewH264mp4_4D.MEDIA_PREPARE_INTERVAL_MS);
}
}
}
public VideoViewH264mp4_4D(Context context) {
super(context);
this.TAG = "VideoViewH264mp4";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
this.mPreplacedsword = "immr@letv23";
this.mHaptFileName = "expendables_3_hapt.hapt";
this.mIsMediaPreparing = false;
this.mIsMediaBuffering = false;
this.time = 0;
this.mIsSeeked = false;
this.mMediaLoaded = true;
this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
this.downloadHapt = true;
this.mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
VideoViewH264mp4_4D.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264mp4_4D.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264mp4_4D.this.mVideoWidth == 0 || VideoViewH264mp4_4D.this.mVideoHeight == 0)) {
VideoViewH264mp4_4D.this.getHolder().setFixedSize(VideoViewH264mp4_4D.this.mVideoWidth, VideoViewH264mp4_4D.this.mVideoHeight);
}
if (VideoViewH264mp4_4D.this.mOnVideoSizeChangedListener != null) {
VideoViewH264mp4_4D.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
}
}
};
this.mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(普通手机videoview) onPrepared()");
if (VideoViewH264mp4_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264mp4_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264mp4_4D.this.mCurrentState = 2;
VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
VideoViewH264mp4_4D videoViewH264mp4_4D = VideoViewH264mp4_4D.this;
VideoViewH264mp4_4D videoViewH264mp4_4D2 = VideoViewH264mp4_4D.this;
VideoViewH264mp4_4D.this.mCanSeekForward = true;
videoViewH264mp4_4D2.mCanSeekBack = true;
videoViewH264mp4_4D.mCanPause = true;
if (VideoViewH264mp4_4D.this.mMediaController != null) {
VideoViewH264mp4_4D.this.mMediaController.setEnabled(true);
}
VideoViewH264mp4_4D.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264mp4_4D.this.mVideoHeight = mp.getVideoHeight();
int seekToPosition = VideoViewH264mp4_4D.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264mp4_4D.this.seekTo(seekToPosition);
}
if (VideoViewH264mp4_4D.this.mVideoWidth != 0 && VideoViewH264mp4_4D.this.mVideoHeight != 0) {
VideoViewH264mp4_4D.this.getHolder().setFixedSize(VideoViewH264mp4_4D.this.mVideoWidth, VideoViewH264mp4_4D.this.mVideoHeight);
if (VideoViewH264mp4_4D.this.mSurfaceWidth == VideoViewH264mp4_4D.this.mVideoWidth && VideoViewH264mp4_4D.this.mSurfaceHeight == VideoViewH264mp4_4D.this.mVideoHeight) {
if (VideoViewH264mp4_4D.this.mTargetState == 3) {
VideoViewH264mp4_4D.this.start();
if (VideoViewH264mp4_4D.this.mMediaController != null) {
VideoViewH264mp4_4D.this.mMediaController.show();
}
} else if (!VideoViewH264mp4_4D.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264mp4_4D.this.getCurrentPosition() > 0) && VideoViewH264mp4_4D.this.mMediaController != null)) {
VideoViewH264mp4_4D.this.mMediaController.show(0);
}
}
} else if (VideoViewH264mp4_4D.this.mTargetState == 3) {
VideoViewH264mp4_4D.this.start();
}
if (VideoViewH264mp4_4D.this.mOnPreparedListener != null) {
VideoViewH264mp4_4D.this.mOnPreparedListener.onPrepared(mp);
}
VideoViewH264mp4_4D.this.palyer4dContrlHandle(seekToPosition);
}
};
this.mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
LogTag.i("onCompletion()");
VideoViewH264mp4_4D.this.mCurrentState = 5;
VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
VideoViewH264mp4_4D.this.mTargetState = 5;
VideoViewH264mp4_4D.this.mCurrentState = 6;
VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
if (VideoViewH264mp4_4D.this.mMediaController != null) {
VideoViewH264mp4_4D.this.mMediaController.hide();
}
if (VideoViewH264mp4_4D.this.mOnCompletionListener != null) {
VideoViewH264mp4_4D.this.mOnCompletionListener.onCompletion(mp);
}
}
};
this.mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
VideoViewH264mp4_4D.this.mCurrentState = -1;
VideoViewH264mp4_4D.this.StateChange(VideoViewH264mp4_4D.this.mCurrentState);
VideoViewH264mp4_4D.this.mTargetState = -1;
if (VideoViewH264mp4_4D.this.mMediaController != null) {
VideoViewH264mp4_4D.this.mMediaController.hide();
}
if (VideoViewH264mp4_4D.this.mOnErrorListener != null) {
VideoViewH264mp4_4D.this.mOnErrorListener.onError(mp, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewH264mp4(普通手机videoview) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewH264mp4_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264mp4_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
return true;
}
};
this.mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264mp4_4D.this.mCurrentBufferPercentage = percent;
if (VideoViewH264mp4_4D.this.mOnBufferingUpdateListener != null) {
VideoViewH264mp4_4D.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
this.mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
LogTag.i("onSeekComplete()");
if (VideoViewH264mp4_4D.this.mOnSeekCompleteListener != null) {
VideoViewH264mp4_4D.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264mp4_4D.this.mMediaPlayer);
}
}
};
this.mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (VideoViewH264mp4_4D.this.mOnInfoListener != null) {
VideoViewH264mp4_4D.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
this.mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
VideoViewH264mp4_4D.this.mSurfaceWidth = w;
VideoViewH264mp4_4D.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264mp4_4D.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264mp4_4D.this.mVideoWidth == w && VideoViewH264mp4_4D.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264mp4_4D.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264mp4_4D.this.mSeekWhenPrepared != 0) {
VideoViewH264mp4_4D.this.seekTo(VideoViewH264mp4_4D.this.mSeekWhenPrepared);
}
VideoViewH264mp4_4D.this.start();
if (VideoViewH264mp4_4D.this.mMediaController != null) {
VideoViewH264mp4_4D.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceCreated()");
VideoViewH264mp4_4D.this.mSurfaceHolder = holder;
VideoViewH264mp4_4D.this.openVideo();
}
public void surfaceDestroyed(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceDestroyed()");
VideoViewH264mp4_4D.this.mSurfaceHolder = null;
if (VideoViewH264mp4_4D.this.mMediaController != null) {
VideoViewH264mp4_4D.this.mMediaController.hide();
}
VideoViewH264mp4_4D.this.lastSeekWhenDestoryed = VideoViewH264mp4_4D.this.getCurrentPosition();
VideoViewH264mp4_4D.this.release(true);
}
};
this.resyncHaptics = new Runnable() {
private int lastPos = 0;
private boolean stalled = false;
public synchronized void run() {
int currPos = VideoViewH264mp4_4D.this.getCurrentPosition();
if (currPos == this.lastPos || currPos == VideoViewH264mp4_4D.this.mSeekToPosition) {
System.out.print("test: haptic sync pausing, currPos=" + currPos + "\n");
VideoViewH264mp4_4D.this.mHaptics.pause();
this.stalled = true;
} else if (this.stalled) {
System.out.print("test: haptics sync resuming, currPos=" + currPos + "\n");
VideoViewH264mp4_4D.this.mHaptics.resume();
this.stalled = false;
}
this.lastPos = currPos;
if (VideoViewH264mp4_4D.this.isHapticUsable()) {
int returnVal = VideoViewH264mp4_4D.this.mHaptics.update((long) currPos);
if (returnVal != 0) {
Log.e(VideoViewH264mp4_4D.this.TAG, "Haptics update failed with value: " + ((String) VideoViewH264mp4_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264mp4_4D.this.mHaptics.getSDKStatus());
}
}
if (VideoViewH264mp4_4D.this.isPlaying()) {
VideoViewH264mp4_4D.this.getHandler().removeCallbacks(VideoViewH264mp4_4D.this.resyncHaptics);
VideoViewH264mp4_4D.this.postDelayed(VideoViewH264mp4_4D.this.resyncHaptics, (long) VideoViewH264mp4_4D.this.mResyncInterval);
} else {
this.stalled = false;
}
}
};
this.changeResyncInterval = new Runnable() {
public void run() {
if (VideoViewH264mp4_4D.this.getCurrentPosition() > VideoViewH264mp4_4D.FIRST_SYNC_UPDATE_TIME_MS) {
VideoViewH264mp4_4D.this.mResyncInterval = VideoViewH264mp4_4D.HAPTICS_RESYNC_INTERVAL_MS;
} else {
VideoViewH264mp4_4D.this.postDelayed(VideoViewH264mp4_4D.this.changeResyncInterval, (long) VideoViewH264mp4_4D.INITIAL_RESYNC_INTERVAL_MS);
}
}
};
this.mContext = context;
initVideoView();
}
public VideoViewH264mp4_4D(Context context, AttributeSet attrs) {
this(context, attrs, 0);
this.mContext = context;
initVideoView();
}
public VideoViewH264mp4_4D(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.TAG = "VideoViewH264mp4";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
this.mPreplacedsword = "immr@letv23";
this.mHaptFileName = "expendables_3_hapt.hapt";
this.mIsMediaPreparing = false;
this.mIsMediaBuffering = false;
this.time = 0;
this.mIsSeeked = false;
this.mMediaLoaded = true;
this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
this.downloadHapt = true;
???;
???;
???;
???;
???;
???;
???;
???;
???;
???;
this.mContext = context;
initVideoView();
}
public void setHaptUrl(String url) {
this.hapt = url;
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height <= this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String path) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(path);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(path));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(普通手机videoview) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null) {
setVisibility(0);
return;
}
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
this.mContext.sendBroadcast(i);
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264mp4(普通手机videoview) 创建MediaPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new MediaPlayer();
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
StateChange(this.mCurrentState);
attachMediaController();
} catch (IOException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException ex2) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264mp4 release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
int returnVal = this.mHaptics.stop();
Log.e(this.TAG, "Haptic dispose " + this.mHaptics.getSDKStatus());
this.mHaptics.dispose();
if (returnVal != 0) {
Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public void start() {
this.mMediaState = -1;
this.mVolumeState = 0;
if (this.mMediaControlsHandler == null) {
this.mMediaControlsHandler = new Handler();
}
if (this.downloadHapt) {
palyer4dInit();
return;
}
if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
this.mMediaPlayer.start();
this.mCurrentState = 3;
StateChange(this.mCurrentState);
init4DMediaPreparer();
}
this.mTargetState = 3;
StateChange(7);
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
LogTag.i("pause()");
this.mMediaPlayer.pause();
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
}
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public void seekTo(int msec) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(msec);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = msec;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public void stopPlayback() {
LogTag.i("stopPlayback()");
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264mp4 stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
int returnVal = this.mHaptics.stop();
this.mHaptics.dispose();
if (returnVal != 0) {
Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264mp4 release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
if (this.mOnVideoViewStateChangeListener != null) {
this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
this.mOnVideoViewStateChangeListener = videoViewListener;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
}
public void initHapticValues() {
this.mErrorValues = new HashMap();
this.mErrorValues.put(Integer.valueOf(0), SUCCESS);
this.mErrorValues.put(Integer.valueOf(-1), INVALID);
this.mErrorValues.put(Integer.valueOf(-2), INACCESSIBLE_URL);
this.mErrorValues.put(Integer.valueOf(-3), PERMISSION_DENIED);
this.mErrorValues.put(Integer.valueOf(-4), MALFORMED_URL);
this.mErrorValues.put(Integer.valueOf(-5), UNSUPPORTED_PROTOCOL);
}
private boolean isHapticUsable() {
return this.mHapticState == 1;
}
public void palyer4dInit() {
this.mMediaState = -1;
this.mVolumeState = 0;
initHapticValues();
this.mHaptics = HapticContentSDKFactory.GetNewSDKInstance(0, this.mContext, this.mUserName, this.mPreplacedsword, HapticContentSDK.DEFAULT_DNS);
if (this.mHaptics == null) {
Log.e(this.TAG, "Could not get new Haptic SDK Instance!");
this.mHapticState = -1;
} else {
this.mHapticState = 0;
}
this.mSavedPos = 0;
this.mMediaControlsHandler = new Handler();
if (this.mHapticState == 0) {
int returnVal = this.mHaptics.openHaptics(this.hapt);
Log.e(this.TAG, "Haptics returnVal=" + returnVal);
if (returnVal == 0) {
this.mHapticState = 1;
this.downloadHapt = false;
} else {
Log.e(this.TAG, "Haptics open failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
this.mMediaPlayer.start();
System.out.println("test is start");
this.mCurrentState = 3;
StateChange(this.mCurrentState);
if (this.mMediaLoaded) {
this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
} else {
this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
}
}
this.mTargetState = 3;
StateChange(7);
}
public void init4DMediaPreparer() {
if (this.mMediaLoaded) {
this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
} else {
this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
}
}
public void palyer4dContrlHandle(int seekToPosition) {
postDelayed(this.resyncHaptics, (long) INITIAL_RESYNC_INTERVAL_MS);
postDelayed(this.changeResyncInterval, (long) INITIAL_RESYNC_INTERVAL_MS);
this.mSavedPos = seekToPosition;
if (this.mSavedPos == 0) {
this.mMediaControlsHandler.post(new MediaPreparer(false, 0));
} else {
this.mMediaState = 2;
}
}
public void setHapticMute(boolean disable) {
int returnVal;
if (disable) {
if (isHapticUsable()) {
returnVal = this.mHaptics.mute();
if (returnVal == 0) {
this.mVolumeState = 1;
} else {
Log.e(this.TAG, "Haptics mute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
} else if (isHapticUsable()) {
returnVal = this.mHaptics.unmute();
if (returnVal == 0) {
this.mVolumeState = 0;
} else {
Log.e(this.TAG, "Haptics unmute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
}
}
16
Source : VideoViewH264LeMobile_4D.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264LeMobile_4D extends SurfaceView implements LetvMediaPlayerControl4D {
public static final int DEFAULT = 0;
private static int FIRST_SYNC_UPDATE_TIME_MS = 200;
private static int HAPTICS_RESYNC_INTERVAL_MS = LeMessageIds.MSG_FLOAT_BALL_REQUEST_DATA;
public static final int HAPTIC_ERROR = -1;
public static final int HAPTIC_INITIALIZED = 1;
public static final int HAPTIC_UNINITIALIZED = 0;
private static final String INACCESSIBLE_URL = "INACCESSIBLE_URL";
private static int INITIAL_RESYNC_INTERVAL_MS = 100;
private static final String INVALID = "INVALID";
private static final String MALFORMED_URL = "MALFORMED_URL";
private static int MEDIA_PREPARE_INTERVAL_MS = 20;
public static final int MUTED = 1;
public static final int PAUSED = 2;
public static final int PAUSED_BUFFERRING_FINISHED = 4;
public static final int PAUSED_DUE_TO_BUFFERING = 3;
private static final String PERMISSION_DENIED = "PERMISSION_DENIED";
public static final int PLAYING = 1;
private static int PLAY_PAUSE_FADEOUT_TIME_MS = 2000;
private static int SEEKBAR_UPDATE_DURATION_MS = 200;
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
public static final int STOPPED = 0;
private static final String SUCCESS = "SUCCESS";
public static final int UNINITIALIZED = -1;
private static final String UNSUPPORTED_PROTOCOL = "UNSUPPORTED_PROTOCOL";
private final int FORWARD_TIME;
private final int REWIND_TIME;
private String TAG;
private Runnable changeResyncInterval;
private boolean downloadHapt;
private boolean enforcementPause;
private boolean enforcementWait;
private String hapt;
protected int lastSeekWhenDestoryed;
private OnBufferingUpdateListener mBufferingUpdateListener;
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener;
private Context mContext;
private int mCurrentBufferPercentage;
private int mCurrentState;
private int mDuration;
private OnErrorListener mErrorListener;
private HashMap<Integer, String> mErrorValues;
private String mHaptFileName;
private int mHapticState;
private HapticContentSDK mHaptics;
private OnInfoListener mInfoListener;
private boolean mIsMediaBuffering;
private boolean mIsMediaPreparing;
private boolean mIsSeeked;
private MediaController mMediaController;
private Handler mMediaControlsHandler;
private boolean mMediaLoaded;
private MediaPlayer mMediaPlayer;
private int mMediaState;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private OnVideoViewStateChangeListener mOnVideoViewStateChangeListener;
private String mPreplacedsword;
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener;
private int mRatioType;
private int mResyncInterval;
Callback mSHCallback;
private int mSavedPos;
private OnSeekCompleteListener mSeekCompleteListener;
private int mSeekToPosition;
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener;
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder;
private int mSurfaceWidth;
private int mTargetState;
private Uri mUri;
private String mUserName;
private int mVideoHeight;
private int mVideoWidth;
private int mVolumeState;
private Runnable resyncHaptics;
private long time;
private clreplaced MediaPreparer implements Runnable {
private boolean mIsPrepared;
private int mProgress;
public MediaPreparer(boolean prepared, int progress) {
this.mIsPrepared = prepared;
this.mProgress = progress;
VideoViewH264LeMobile_4D.this.mIsMediaPreparing = true;
}
public void run() {
int curProgress = VideoViewH264LeMobile_4D.this.getCurrentPosition();
int delta = curProgress - this.mProgress;
if (VideoViewH264LeMobile_4D.this.mMediaState == 3) {
if (VideoViewH264LeMobile_4D.this.isHapticUsable()) {
VideoViewH264LeMobile_4D.this.mHaptics.pause();
}
} else if ((this.mIsPrepared || delta != 0) && !(this.mIsPrepared && delta == 0)) {
int returnVal;
if (this.mIsPrepared) {
if (VideoViewH264LeMobile_4D.this.isHapticUsable()) {
if (VideoViewH264LeMobile_4D.this.mMediaState != 0) {
returnVal = VideoViewH264LeMobile_4D.this.mHaptics.seek(curProgress);
if (returnVal != 0) {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics seek failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
}
}
System.out.println("test prepare:resume");
returnVal = VideoViewH264LeMobile_4D.this.mHaptics.resume();
if (returnVal != 0) {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
}
} else {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics was not initialized yet.");
}
VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.resyncHaptics);
VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.changeResyncInterval);
VideoViewH264LeMobile_4D.this.mMediaState = 1;
} else {
if (!VideoViewH264LeMobile_4D.this.isHapticUsable()) {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics was not initialized yet.");
} else if (VideoViewH264LeMobile_4D.this.mMediaLoaded) {
returnVal = VideoViewH264LeMobile_4D.this.mHaptics.play();
if (returnVal != 0) {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics play failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
}
} else {
System.out.println("test mediaprepare else: resume");
returnVal = VideoViewH264LeMobile_4D.this.mHaptics.resume();
if (returnVal != 0) {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
}
VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.resyncHaptics);
VideoViewH264LeMobile_4D.this.post(VideoViewH264LeMobile_4D.this.changeResyncInterval);
}
VideoViewH264LeMobile_4D.this.mMediaState = 1;
}
VideoViewH264LeMobile_4D.this.mIsSeeked = false;
VideoViewH264LeMobile_4D.this.mIsMediaPreparing = false;
} else {
VideoViewH264LeMobile_4D.this.mMediaControlsHandler.postDelayed(this, (long) VideoViewH264LeMobile_4D.MEDIA_PREPARE_INTERVAL_MS);
}
}
}
public VideoViewH264LeMobile_4D(Context context) {
super(context);
this.TAG = "VideoViewLeMobile";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
this.mPreplacedsword = "immr@letv23";
this.mHaptFileName = "expendables_3_hapt.hapt";
this.mIsMediaPreparing = false;
this.mIsMediaBuffering = false;
this.time = 0;
this.mIsSeeked = false;
this.mMediaLoaded = true;
this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
this.downloadHapt = true;
this.mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
LogTag.i("onVideoSizeChanged(), width=" + width + ", heigth=" + height);
VideoViewH264LeMobile_4D.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264LeMobile_4D.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264LeMobile_4D.this.mVideoWidth == 0 || VideoViewH264LeMobile_4D.this.mVideoHeight == 0)) {
VideoViewH264LeMobile_4D.this.getHolder().setFixedSize(VideoViewH264LeMobile_4D.this.mVideoWidth, VideoViewH264LeMobile_4D.this.mVideoHeight);
}
if (VideoViewH264LeMobile_4D.this.mOnVideoSizeChangedListener != null) {
VideoViewH264LeMobile_4D.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height);
}
}
};
this.mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobile(乐视手机videoview) onPrepared()");
if (VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264LeMobile_4D.this.mCurrentState = 2;
VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
VideoViewH264LeMobile_4D videoViewH264LeMobile_4D = VideoViewH264LeMobile_4D.this;
VideoViewH264LeMobile_4D videoViewH264LeMobile_4D2 = VideoViewH264LeMobile_4D.this;
VideoViewH264LeMobile_4D.this.mCanSeekForward = true;
videoViewH264LeMobile_4D2.mCanSeekBack = true;
videoViewH264LeMobile_4D.mCanPause = true;
if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
VideoViewH264LeMobile_4D.this.mMediaController.setEnabled(true);
}
VideoViewH264LeMobile_4D.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264LeMobile_4D.this.mVideoHeight = mp.getVideoHeight();
int seekToPosition = VideoViewH264LeMobile_4D.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264LeMobile_4D.this.seekTo(seekToPosition);
}
if (VideoViewH264LeMobile_4D.this.mVideoWidth != 0 && VideoViewH264LeMobile_4D.this.mVideoHeight != 0) {
VideoViewH264LeMobile_4D.this.getHolder().setFixedSize(VideoViewH264LeMobile_4D.this.mVideoWidth, VideoViewH264LeMobile_4D.this.mVideoHeight);
if (VideoViewH264LeMobile_4D.this.mSurfaceWidth == VideoViewH264LeMobile_4D.this.mVideoWidth && VideoViewH264LeMobile_4D.this.mSurfaceHeight == VideoViewH264LeMobile_4D.this.mVideoHeight) {
if (VideoViewH264LeMobile_4D.this.mTargetState == 3) {
VideoViewH264LeMobile_4D.this.start();
if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
VideoViewH264LeMobile_4D.this.mMediaController.show();
}
} else if (!VideoViewH264LeMobile_4D.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264LeMobile_4D.this.getCurrentPosition() > 0) && VideoViewH264LeMobile_4D.this.mMediaController != null)) {
VideoViewH264LeMobile_4D.this.mMediaController.show(0);
}
}
} else if (VideoViewH264LeMobile_4D.this.mTargetState == 3) {
VideoViewH264LeMobile_4D.this.start();
}
if (VideoViewH264LeMobile_4D.this.mOnPreparedListener != null) {
VideoViewH264LeMobile_4D.this.mOnPreparedListener.onPrepared(mp);
}
VideoViewH264LeMobile_4D.this.palyer4dContrlHandle(seekToPosition);
}
};
this.mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
LogTag.i("onCompletion()");
VideoViewH264LeMobile_4D.this.mCurrentState = 5;
VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
VideoViewH264LeMobile_4D.this.mTargetState = 5;
VideoViewH264LeMobile_4D.this.mCurrentState = 6;
VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
VideoViewH264LeMobile_4D.this.mMediaController.hide();
}
if (VideoViewH264LeMobile_4D.this.mOnCompletionListener != null) {
VideoViewH264LeMobile_4D.this.mOnCompletionListener.onCompletion(mp);
}
}
};
this.mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
LogTag.i("onError(): framework_err=" + framework_err + ", impl_err=" + impl_err);
VideoViewH264LeMobile_4D.this.mCurrentState = -1;
VideoViewH264LeMobile_4D.this.StateChange(VideoViewH264LeMobile_4D.this.mCurrentState);
VideoViewH264LeMobile_4D.this.mTargetState = -1;
if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
VideoViewH264LeMobile_4D.this.mMediaController.hide();
}
if (VideoViewH264LeMobile_4D.this.mOnErrorListener != null) {
VideoViewH264LeMobile_4D.this.mOnErrorListener.onError(mp, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewLeMobile(乐视手机videoview) error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264LeMobile_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
return true;
}
};
this.mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264LeMobile_4D.this.mCurrentBufferPercentage = percent;
if (VideoViewH264LeMobile_4D.this.mOnBufferingUpdateListener != null) {
VideoViewH264LeMobile_4D.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
this.mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
LogTag.i("onSeekComplete()");
if (VideoViewH264LeMobile_4D.this.mOnSeekCompleteListener != null) {
VideoViewH264LeMobile_4D.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264LeMobile_4D.this.mMediaPlayer);
}
}
};
this.mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (VideoViewH264LeMobile_4D.this.mOnInfoListener != null) {
VideoViewH264LeMobile_4D.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
this.mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
LogTag.i("mSHCallback:surfaceChanged(), w=" + w + ", h=" + h);
VideoViewH264LeMobile_4D.this.mSurfaceWidth = w;
VideoViewH264LeMobile_4D.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264LeMobile_4D.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264LeMobile_4D.this.mVideoWidth == w && VideoViewH264LeMobile_4D.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264LeMobile_4D.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264LeMobile_4D.this.mSeekWhenPrepared != 0) {
VideoViewH264LeMobile_4D.this.seekTo(VideoViewH264LeMobile_4D.this.mSeekWhenPrepared);
}
VideoViewH264LeMobile_4D.this.start();
if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
VideoViewH264LeMobile_4D.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceCreated()");
VideoViewH264LeMobile_4D.this.mSurfaceHolder = holder;
VideoViewH264LeMobile_4D.this.openVideo();
}
public void surfaceDestroyed(SurfaceHolder holder) {
LogTag.i("mSHCallback:surfaceDestroyed()");
VideoViewH264LeMobile_4D.this.mSurfaceHolder = null;
if (VideoViewH264LeMobile_4D.this.mMediaController != null) {
VideoViewH264LeMobile_4D.this.mMediaController.hide();
}
VideoViewH264LeMobile_4D.this.lastSeekWhenDestoryed = VideoViewH264LeMobile_4D.this.getCurrentPosition();
VideoViewH264LeMobile_4D.this.release(true);
}
};
this.resyncHaptics = new Runnable() {
private int lastPos = 0;
private boolean stalled = false;
public synchronized void run() {
int currPos = VideoViewH264LeMobile_4D.this.getCurrentPosition();
if (currPos == this.lastPos || currPos == VideoViewH264LeMobile_4D.this.mSeekToPosition) {
System.out.print("test: haptic sync pausing, currPos=" + currPos + "\n");
VideoViewH264LeMobile_4D.this.mHaptics.pause();
this.stalled = true;
} else if (this.stalled) {
System.out.print("test: haptics sync resuming, currPos=" + currPos + "\n");
VideoViewH264LeMobile_4D.this.mHaptics.resume();
this.stalled = false;
}
this.lastPos = currPos;
if (VideoViewH264LeMobile_4D.this.isHapticUsable()) {
int returnVal = VideoViewH264LeMobile_4D.this.mHaptics.update((long) currPos);
if (returnVal != 0) {
Log.e(VideoViewH264LeMobile_4D.this.TAG, "Haptics update failed with value: " + ((String) VideoViewH264LeMobile_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264LeMobile_4D.this.mHaptics.getSDKStatus());
}
}
if (VideoViewH264LeMobile_4D.this.isPlaying()) {
VideoViewH264LeMobile_4D.this.getHandler().removeCallbacks(VideoViewH264LeMobile_4D.this.resyncHaptics);
VideoViewH264LeMobile_4D.this.postDelayed(VideoViewH264LeMobile_4D.this.resyncHaptics, (long) VideoViewH264LeMobile_4D.this.mResyncInterval);
} else {
this.stalled = false;
}
}
};
this.changeResyncInterval = new Runnable() {
public void run() {
if (VideoViewH264LeMobile_4D.this.getCurrentPosition() > VideoViewH264LeMobile_4D.FIRST_SYNC_UPDATE_TIME_MS) {
VideoViewH264LeMobile_4D.this.mResyncInterval = VideoViewH264LeMobile_4D.HAPTICS_RESYNC_INTERVAL_MS;
} else {
VideoViewH264LeMobile_4D.this.postDelayed(VideoViewH264LeMobile_4D.this.changeResyncInterval, (long) VideoViewH264LeMobile_4D.INITIAL_RESYNC_INTERVAL_MS);
}
}
};
this.mContext = context;
initVideoView();
}
public VideoViewH264LeMobile_4D(Context context, AttributeSet attrs) {
this(context, attrs, 0);
this.mContext = context;
initVideoView();
}
public VideoViewH264LeMobile_4D(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.TAG = "VideoViewLeMobile";
this.mCurrentState = 0;
this.mTargetState = 0;
this.FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
this.mSurfaceHolder = null;
this.mMediaPlayer = null;
this.mRatioType = -1;
this.lastSeekWhenDestoryed = 0;
this.enforcementWait = false;
this.enforcementPause = false;
this.mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
this.mPreplacedsword = "immr@letv23";
this.mHaptFileName = "expendables_3_hapt.hapt";
this.mIsMediaPreparing = false;
this.mIsMediaBuffering = false;
this.time = 0;
this.mIsSeeked = false;
this.mMediaLoaded = true;
this.mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
this.downloadHapt = true;
???;
???;
???;
???;
???;
???;
???;
???;
???;
???;
this.mContext = context;
initVideoView();
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height <= this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String path) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(path);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(path));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobile(乐视手机videoview) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
LogTag.i("setVideoURI(), url=" + (uri != null ? uri.toString() : "null"));
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null) {
setVisibility(0);
return;
}
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
this.mContext.sendBroadcast(i);
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobile(乐视手机videoview) 创建MediaPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new MediaPlayer();
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
StateChange(this.mCurrentState);
attachMediaController();
} catch (IOException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IOException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException ex2) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex2);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
this.mMediaPlayer.reset();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264LeMobile release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
int returnVal = this.mHaptics.stop();
Log.e(this.TAG, "Haptic dispose " + this.mHaptics.getSDKStatus());
this.mHaptics.dispose();
if (returnVal != 0) {
Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public void start() {
HttpRequestManager.getInstance(this.mContext).requestCapability();
this.mMediaState = -1;
this.mVolumeState = 0;
if (this.mMediaControlsHandler == null) {
this.mMediaControlsHandler = new Handler();
}
if (this.downloadHapt) {
palyer4dInit();
return;
}
if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
LogTag.i("start()");
this.mMediaPlayer.start();
this.mCurrentState = 3;
StateChange(this.mCurrentState);
init4DMediaPreparer();
}
this.mTargetState = 3;
StateChange(7);
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
LogTag.i("pause()");
this.mMediaPlayer.pause();
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
LogTag.i("getDuration()=" + this.mDuration);
return this.mDuration;
}
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public void seekTo(int msec) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(msec);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = msec;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public void stopPlayback() {
LogTag.i("stopPlayback()");
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264LeMobile stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
Log.e(this.TAG, "Haptics dispose");
int returnVal = this.mHaptics.stop();
this.mHaptics.dispose();
if (returnVal != 0) {
Log.e(this.TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264LeMobile release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
LogTag.i("StateChange(), mCurrentState=" + mCurrentState);
if (this.mOnVideoViewStateChangeListener != null) {
this.mOnVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener videoViewListener) {
this.mOnVideoViewStateChangeListener = videoViewListener;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picutureSize, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
}
public void setHaptUrl(String url) {
this.hapt = url;
}
public void initHapticValues() {
this.mErrorValues = new HashMap();
this.mErrorValues.put(Integer.valueOf(0), SUCCESS);
this.mErrorValues.put(Integer.valueOf(-1), INVALID);
this.mErrorValues.put(Integer.valueOf(-2), INACCESSIBLE_URL);
this.mErrorValues.put(Integer.valueOf(-3), PERMISSION_DENIED);
this.mErrorValues.put(Integer.valueOf(-4), MALFORMED_URL);
this.mErrorValues.put(Integer.valueOf(-5), UNSUPPORTED_PROTOCOL);
}
private boolean isHapticUsable() {
return this.mHapticState == 1;
}
public void palyer4dInit() {
this.mMediaState = -1;
this.mVolumeState = 0;
initHapticValues();
this.mHaptics = HapticContentSDKFactory.GetNewSDKInstance(0, this.mContext, this.mUserName, this.mPreplacedsword, HapticContentSDK.DEFAULT_DNS);
if (this.mHaptics == null) {
Log.e(this.TAG, "Could not get new Haptic SDK Instance!");
this.mHapticState = -1;
} else {
this.mHapticState = 0;
}
this.mSavedPos = 0;
this.mMediaControlsHandler = new Handler();
if (this.mHapticState == 0) {
int returnVal = this.mHaptics.openHaptics(this.hapt);
if (returnVal == 0) {
this.mHapticState = 1;
this.downloadHapt = false;
} else {
Log.e(this.TAG, "Haptics open failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
this.mMediaPlayer.start();
System.out.println("test is start");
this.mCurrentState = 3;
StateChange(this.mCurrentState);
if (this.mMediaLoaded) {
this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
} else {
this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
}
}
this.mTargetState = 3;
StateChange(7);
}
public void init4DMediaPreparer() {
if (this.mMediaLoaded) {
this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
} else {
this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
}
}
public void palyer4dContrlHandle(int seekToPosition) {
postDelayed(this.resyncHaptics, (long) INITIAL_RESYNC_INTERVAL_MS);
postDelayed(this.changeResyncInterval, (long) INITIAL_RESYNC_INTERVAL_MS);
this.mSavedPos = seekToPosition;
if (this.mSavedPos == 0) {
this.mMediaControlsHandler.post(new MediaPreparer(false, 0));
} else {
this.mMediaState = 2;
}
}
public void setHapticMute(boolean disable) {
int returnVal;
if (disable) {
if (isHapticUsable()) {
returnVal = this.mHaptics.mute();
if (returnVal == 0) {
this.mVolumeState = 1;
} else {
Log.e(this.TAG, "Haptics mute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
} else if (isHapticUsable()) {
returnVal = this.mHaptics.unmute();
if (returnVal == 0) {
this.mVolumeState = 0;
} else {
Log.e(this.TAG, "Haptics unmute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
}
}
16
Source : SampleVideoPlayerActivity.java
with Apache License 2.0
from googlearchive
with Apache License 2.0
from googlearchive
/**
* Unlike most of the rest of this example, this clreplaced is only really guaranteed
* to work well on Froyo devices or above. This clreplaced tries to do the right
* thing with a video player that is constrained to landscape even if its parent
* is not so constrained. This can lead to some interesting state transitions in
* Android.
*/
public clreplaced SampleVideoPlayerActivity extends Activity implements OnPreparedListener {
private Uri mMediaUri;
private String mMediareplacedle;
private VideoView mVideoView;
private View mPlayerLayout;
private Method mSetSystemUiVisibility;
private Method mSetSystemUiVisibilityListener;
private int mSavedPosition;
private boolean mIgnoreSystemUIChange;
private boolean mResumeVideoPlaybackOnResume;
private boolean mStartVideoOnCreate;
private boolean mHasFocus;
private boolean mSystemKeysShowing;
private Handler mHandler;
private MediaController mMediaController;
static final private String SAVE_VIDEO_POSITION = "POS";
static final private String RESUME_VIDEO_ON_RESUME = "RES";
protected static final int MSG_HIDE_SYSTEM_UI = 1;
static final private String LOG_TAG = "SampleVideo";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* We create a handler here so that we can delay hiding the system Ui
* for a fraction of a second.
*/
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_HIDE_SYSTEM_UI:
hideSystemUi();
break;
}
super.handleMessage(msg);
}
};
/**
* We use a combination of getLastNonConfigurationInstance and saved
* instance state to make sure we resume under a variety of cases.
*/
if (null == savedInstanceState) {
savedInstanceState = (Bundle) getLastNonConfigurationInstance();
}
if (null != savedInstanceState) {
mResumeVideoPlaybackOnResume = savedInstanceState.getBoolean(RESUME_VIDEO_ON_RESUME, false);
mStartVideoOnCreate = false;
} else {
mStartVideoOnCreate = true;
mSavedPosition = -1;
}
setContentView(R.layout.videoplayer);
mPlayerLayout = this.findViewById(R.id.PlayerLayout);
mMediaUri = this.getIntent().getData();
mMediareplacedle = this.getIntent().getStringExtra(Intent.EXTRA_replacedLE);
((TextView) findViewById(R.id.NowPlaying)).setText(mMediareplacedle);
mVideoView = (VideoView) findViewById(R.id.VideoView);
/**
* This code will hide the system UI when the Media Controller is hidden
* on ICS devices.
*/
mMediaController = new MediaController(this) {
/**
* Whenever we hide the MediaController, we also hide the system UI
* a fraction of a second later.
*/
@Override
public void hide() {
super.hide();
postHideSystemUi();
}
/**
* If we are on an ICS device, we don't want the back key to just
* dismiss the media controller, because that will also hide the
* system keys, so the user effectively cannot back out of the app
* using the back key. Since the media controller times out (or
* exits when the user taps on a part of the screen that is not the
* media controller) This seems to be a reasonable compromise
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (mSystemKeysShowing && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
finish();
}
return super.dispatchKeyEvent(event);
}
};
/**
* Set up the use of reflection to hide system UI and use a Proxy to get
* notified when the visibility changes. Once we are playing the video,
* we hide the system UI.
*/
try {
mSetSystemUiVisibility = View.clreplaced.getMethod("setSystemUiVisibility", int.clreplaced);
Clreplaced<?> onChangeListener = Clreplaced.forName("android.view.View$OnSystemUiVisibilityChangeListener");
mSetSystemUiVisibilityListener = View.clreplaced.getMethod("setOnSystemUiVisibilityChangeListener", onChangeListener);
ClreplacedLoader cl = onChangeListener.getClreplacedLoader();
InvocationHandler h = new InvocationHandler() {
/**
* This gets called when the view calls the
* OnSystemUiVisibilityChangeListener. Since there is only one
* method in this clreplaced, we don't bother to look at the Method
* parameter.
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (mIgnoreSystemUIChange) {
mIgnoreSystemUIChange = false;
return null;
}
switch(((Integer) args[0]).intValue()) {
case View.SYSTEM_UI_FLAG_LOW_PROFILE:
mMediaController.show();
mSystemKeysShowing = true;
break;
case View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LOW_PROFILE:
case View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:
mSystemKeysShowing = false;
break;
}
return null;
}
};
Object o = Proxy.newProxyInstance(cl, new Clreplaced[] { onChangeListener }, h);
mSetSystemUiVisibilityListener.invoke(mPlayerLayout, o);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClreplacedNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
mVideoView.setVideoURI(mMediaUri);
mVideoView.setMediaController(mMediaController);
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(this);
hideSystemUi();
}
/**
* We both resume and start the video, depending on the state.
*/
private void resumeVideoIfNecessary() {
if (mResumeVideoPlaybackOnResume && mHasFocus) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
mVideoView.resume();
}
if (!mVideoView.isPlaying()) {
mVideoView.start();
}
mResumeVideoPlaybackOnResume = false;
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
mHasFocus = hasFocus;
resumeVideoIfNecessary();
super.onWindowFocusChanged(hasFocus);
}
@Override
protected void onPause() {
if (mHasFocus) {
mResumeVideoPlaybackOnResume = mVideoView.isPlaying();
}
int savedPosition = mVideoView.getCurrentPosition();
// if not active, video view will return 0 for the saved position
if (0 != savedPosition) {
mSavedPosition = savedPosition;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
mVideoView.suspend();
}
super.onPause();
}
@Override
public Object onRetainNonConfigurationInstance() {
Bundle outState = new Bundle();
saveInstance(outState);
return super.onRetainNonConfigurationInstance();
}
private void saveInstance(Bundle outState) {
int videoPosition = mVideoView.getCurrentPosition();
if (-1 == mSavedPosition) {
mSavedPosition = videoPosition;
}
outState.putInt(SAVE_VIDEO_POSITION, mSavedPosition);
outState.putBoolean(RESUME_VIDEO_ON_RESUME, mResumeVideoPlaybackOnResume);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
saveInstance(outState);
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
resumeVideoIfNecessary();
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler = null;
mMediaController = null;
if (null != mSetSystemUiVisibilityListener) {
try {
mSetSystemUiVisibilityListener.invoke(mPlayerLayout, new Object[] { null });
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* We want to avoid a race condition where the system UI doesn't end up
* getting hidden because the touch event gets there before the call to hide
* the UI gets there.
*/
private void postHideSystemUi() {
if (null != mSetSystemUiVisibility && null != mHandler) {
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_UI, 100);
}
}
/**
* Use reflection to hide the system UI.
*/
private void hideSystemUi() {
Log.d(LOG_TAG, "Hiding System Ui");
if (null != mSetSystemUiVisibility) {
try {
mSetSystemUiVisibility.invoke(mPlayerLayout, View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
mIgnoreSystemUIChange = true;
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* If we are being restarted from a paused state, don't start playing.
*/
public void onPrepared(MediaPlayer mp) {
mp.start();
if (!mStartVideoOnCreate) {
mp.pause();
}
if (-1 != mSavedPosition) {
mp.seekTo(mSavedPosition);
mSavedPosition = -1;
}
hideSystemUi();
}
}
16
Source : VideoViewer.java
with MIT License
from GnikDroy
with MIT License
from GnikDroy
public clreplaced VideoViewer extends AppCompatActivity {
private String url = "http://st3.anime1.com/Darling in the FranXX Episode 15.mp4?st=5hjUoXuMBfTplZ49TKn8oQ&e=1529135685";
private VideoView video;
private MediaController ctlr;
private ProgressBar progressBar;
private RequestQueue requestQueue;
private StringRequest stringRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_viewer);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
url = bundle.getString("url");
} else {
// This case causes errors.
}
video = (VideoView) findViewById(R.id.videoView);
video.setVisibility(View.INVISIBLE);
ctlr = new MediaController(this);
ctlr.setVisibility(View.INVISIBLE);
progressBar = findViewById(R.id.progressBar);
progressBar.setVisibility(View.VISIBLE);
requestQueue = Volley.newRequestQueue(this);
stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressBar.setVisibility(View.INVISIBLE);
video.setVisibility(View.VISIBLE);
ctlr.setVisibility(View.VISIBLE);
String videoUrl = SiteTools.getVideoURL(response);
Uri uri = Uri.parse(videoUrl);
video.setVideoURI(uri);
ctlr.setMediaPlayer(video);
video.setMediaController(ctlr);
video.requestFocus();
video.start();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(stringRequest);
}
}
15
Source : JavaVideoActivity.java
with MIT License
from LeslieCorrea
with MIT License
from LeslieCorrea
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java_video);
mVideoView = (VideoView) this.findViewById(R.id.SampleVideoView);
MediaController mediaController = new MediaController(this);
mVideoView.setMediaController(mediaController);
mVideoView.setVideoPath("content://com.example.lesliecorrea.videoapp/big_buck_bunny.mp4");
mVideoView.start();
}
15
Source : FragmentShowImage.java
with GNU Affero General Public License v3.0
from KianIranian-STDG
with GNU Affero General Public License v3.0
from KianIranian-STDG
public clreplaced FragmentShowImage extends BaseFragment {
private static ArrayList<String> downloadedList = new ArrayList<>();
public final String ROOM_ID = "roomId";
public final String TYPE = "type";
public View appBarLayout;
private MediaController videoController;
private TextView txtImageNumber;
private TextView txtImageName;
private TextView txtImageDate;
private TextView txtImageTime;
private TextView txtImageDesc;
private LinearLayout toolbarShowImage;
private boolean isShowToolbar = true;
private ViewGroup ltImageName;
private ViewPager viewPager;
private boolean isFirstPlay = true;
private int selectedFile = 0;
private ArrayList<RealmRoomMessage> mFList = new ArrayList<>();
private MediaPlayer mMediaPlayer;
private boolean isLockScreen = false;
private boolean isFocusable = false;
private PhotoView zoomableImageViewTmp = null;
private int lastOrientation = 0;
public static FocusAudioListener focusAudioListener;
private ProtoGlobal.RoomMessageType messageType;
private ArrayList<TextureView> mTextureViewTmp = new ArrayList<>();
private RealmRoom room;
public static FragmentShowImage newInstance() {
return new FragmentShowImage();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// View view = inflater.inflate(R.layout.activity_show_image, container, false);
// exitFragmentTransition = FragmentTransition.with(this).duration(200).interpolator(new LinearOutSlowInInterpolator()).to(view.findViewById(R.id.asi_view_pager)).start(savedInstanceState);
//
// exitFragmentTransition.exitListener(new AnimatorListenerAdapter() {
// @Override
// public void onAnimationStart(Animator animation) {
//
// }
//
// @Override
// public void onAnimationEnd(Animator animation) {
//
// }
// }).interpolator(new FastOutSlowInInterpolator());
// exitFragmentTransition.startExitListening(view.findViewById(R.id.rooShowImage));
return inflater.inflate(R.layout.activity_show_image, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (getIntentData(this.getArguments())) {
initComponent(view);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation != lastOrientation) {
lastOrientation = newConfig.orientation;
if (zoomableImageViewTmp != null && videoController != null && mMediaPlayer != null) {
zoomableImageViewTmp.setVisibility(View.GONE);
zoomableImageViewTmp.setVisibility(View.VISIBLE);
if (mMediaPlayer.isPlaying()) {
videoController.show();
}
if (mTextureViewTmp.size() > 0) {
getRealSize(mMediaPlayer, mTextureViewTmp.get(0));
}
}
}
}
@Override
public void onAttach(Context context) {
if (appBarLayout != null) {
appBarLayout.setVisibility(View.GONE);
}
super.onAttach(context);
}
private boolean getIntentData(Bundle bundle) {
if (getActivity() != null) {
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
if (bundle != null) {
// get a list of image
Long mRoomId = bundle.getLong("RoomId");
Long selectedFileToken = bundle.getLong("SelectedImage");
if (bundle.getString("TYPE") != null) {
messageType = convertType(bundle.getString("TYPE"));
}
if (mRoomId == null) {
popBackStackFragment();
return false;
}
RealmResults<RealmRoomMessage> mRealmList = DbManager.getInstance().doRealmTask(realm -> {
return RealmRoomMessage.findSorted(realm, mRoomId, "updateTime", Sort.ASCENDING);
});
if (mRealmList.size() < 1) {
popBackStackFragment();
return false;
}
// todo : remove for and handle it with query
for (RealmRoomMessage roomMessage : mRealmList) {
if (RealmRoomMessage.isImageOrVideo(roomMessage, messageType)) {
if ((roomMessage.getForwardMessage() != null ? roomMessage.getForwardMessage().getAttachment() : roomMessage.getAttachment()) != null)
mFList.add(roomMessage);
}
}
if (selectedFileToken != null) {
for (int i = mFList.size() - 1; i >= 0; i--) {
if (selectedFileToken == mFList.get(i).getMessageId()) {
selectedFile = i;
break;
}
}
}
return true;
} else {
if (G.fragmentActivity != null) {
popBackStackFragment();
}
return false;
}
}
private ProtoGlobal.RoomMessageType convertType(String type) {
if (type != null) {
if (type.contains(ProtoGlobal.RoomMessageType.VIDEO.toString())) {
return ProtoGlobal.RoomMessageType.VIDEO;
} else if (type.contains(ProtoGlobal.RoomMessageType.IMAGE.toString())) {
return ProtoGlobal.RoomMessageType.IMAGE;
}
}
return null;
}
private void initComponent(View view) {
downloadedList.clear();
RippleView rippleBack = view.findViewById(R.id.asi_ripple_back);
rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {
@Override
public void onComplete(RippleView rippleView) {
Log.wtf(this.getClreplaced().getName(), "on back");
popBackStackFragment();
}
});
RippleView rippleMenu = view.findViewById(R.id.asi_ripple_menu);
rippleMenu.setOnRippleCompleteListener(rippleView -> popUpMenuShowImage());
TextView btnShare = view.findViewById(R.id.asi_btn_share);
btnShare.setOnClickListener(v -> shareImage());
viewPager = view.findViewById(R.id.asi_view_pager);
txtImageNumber = view.findViewById(R.id.asi_txt_image_number);
ltImageName = view.findViewById(R.id.asi_layout_image_name);
txtImageName = view.findViewById(R.id.asi_txt_image_name);
txtImageDate = view.findViewById(R.id.asi_txt_image_date);
txtImageTime = view.findViewById(R.id.asi_txt_image_time);
txtImageDesc = view.findViewById(R.id.asi_txt_image_desc);
toolbarShowImage = view.findViewById(R.id.toolbarShowImage);
room = DbManager.getInstance().doRealmTask(realm -> {
return realm.where(RealmRoom.clreplaced).equalTo("id", mFList.get(selectedFile).getRoomId()).findFirst();
});
initViewPager();
focusAudioListener = isPlay -> {
if (isPlay) {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
isLockScreen = true;
isFocusable = true;
}
} else {
if (mMediaPlayer != null && isFocusable) {
int length = mMediaPlayer.getCurrentPosition();
mMediaPlayer.seekTo(length);
mMediaPlayer.start();
isLockScreen = true;
isFocusable = false;
}
}
};
}
// ***************************************************************************************
private void initViewPager() {
AdapterViewPager mAdapter = new AdapterViewPager();
viewPager.setAdapter(mAdapter);
viewPager.setCurrenreplacedem(selectedFile);
txtImageNumber.setText(selectedFile + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
if (HelperCalander.isPersianUnicode) {
txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
}
if (selectedFile >= mFList.size()) {
return;
}
showImageInfo(mFList.get(selectedFile));
viewPager.setOnClickListener(view -> {
});
viewPager.setPageTransformer(false, (view, position) -> {
final float normalizedPosition = Math.abs(Math.abs(position) - 1);
view.setScaleX(normalizedPosition / 2 + 0.5f);
view.setScaleY(normalizedPosition / 2 + 0.5f);
});
}
/**
* show image info, time , name , description
*/
private void showImageInfo(RealmRoomMessage realmRoomMessage) {
if (realmRoomMessage == null || RealmUserInfo.getCurrentUserAuthorHash().equals("")) {
return;
}
RealmRoomMessage realmRoomMessageFinal = RealmRoomMessage.getFinalMessage(realmRoomMessage);
if (realmRoomMessageFinal != null && realmRoomMessageFinal.isValid() && realmRoomMessageFinal.getMessage() != null && !realmRoomMessageFinal.getMessage().isEmpty()) {
txtImageDesc.setText(EmojiManager.getInstance().replaceEmoji(realmRoomMessageFinal.getMessage(), txtImageDesc.getPaint().getFontMetricsInt()));
txtImageDesc.setVisibility(View.VISIBLE);
} else {
txtImageDesc.setVisibility(View.GONE);
}
RealmRegisteredInfo realmRegisteredInfo = DbManager.getInstance().doRealmTask(realm -> {
return RealmRegisteredInfo.getRegistrationInfo(realm, realmRoomMessageFinal.getUserId());
});
if (realmRegisteredInfo != null) {
txtImageName.setText(realmRegisteredInfo.getDisplayName());
} else {
txtImageName.setText("");
}
if (realmRoomMessageFinal.getAuthorHash() != null && RealmUserInfo.getCurrentUserAuthorHash().equals(realmRoomMessageFinal.getAuthorHash())) {
txtImageName.setText(R.string.you);
}
if (realmRoomMessageFinal.getUpdateTime() != 0) {
txtImageTime.setText(HelperCalander.getClocktime(realmRoomMessageFinal.getUpdateTime(), true));
txtImageDate.setText(HelperCalander.checkHijriAndReturnTime(realmRoomMessageFinal.getUpdateTime() / 1000));
}
if (HelperCalander.isPersianUnicode) {
txtImageName.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageName.getText().toString()));
txtImageTime.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageTime.getText().toString()));
txtImageDate.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageDate.getText().toString()));
}
}
public void popUpMenuShowImage() {
List<String> items = new ArrayList<>();
items.add(getString(R.string.save_to_gallery));
if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
items.add(getString(R.string.share_video_file_2));
} else {
items.add(getString(R.string.share_image_2));
}
if (RoomObject.isRoomPublic(room)) {
if (MessageObject.canSharePublic(mFList.get(selectedFile))) {
items.add(getString(R.string.share_file_link));
}
}
new TopSheetDialog(getContext()).setListData(items, -1, position -> {
if (items.get(position).equals(getString(R.string.save_to_gallery))) {
saveToGallery();
} else if (items.get(position).equals(getString(R.string.share_file_link))) {
shareMediaLink();
} else {
shareImage();
}
}).show();
}
/**
* share Image and video
*/
private void shareImage() {
RealmRoomMessage roomMessage = null;
if (mFList.size() > viewPager.getCurrenreplacedem())
roomMessage = mFList.get(viewPager.getCurrenreplacedem());
if (roomMessage != null) {
roomMessage = RealmRoomMessage.getFinalMessage(roomMessage);
String path = getFilePath(viewPager.getCurrenreplacedem());
File file = new File(path);
if (file.exists()) {
Intent intent = new Intent(Intent.ACTION_SEND);
AppUtils.shareItem(intent, new StructMessageInfo(roomMessage));
if (roomMessage.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO || roomMessage.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
intent.setType("video/*");
startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_video_from_igap)));
} else {
intent.setType("image/*");
startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
}
} else {
HelperError.showSnackMessage(getString(R.string.file_not_download_yet), false);
}
}
}
private void shareMediaLink() {
RealmRoomMessage roomMessage = null;
if (mFList.size() > viewPager.getCurrenreplacedem())
roomMessage = mFList.get(viewPager.getCurrenreplacedem());
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
if (roomMessage != null) {
intent.putExtra(Intent.EXTRA_TEXT, roomMessage.attachment.url);
}
startActivity(Intent.createChooser(intent, G.context.getString(R.string.share_link_item_dialog)));
}
/**
* share Image and video
*/
private void saveToGallery() {
RealmRoomMessage rm = null;
if (mFList.size() > viewPager.getCurrenreplacedem())
rm = mFList.get(viewPager.getCurrenreplacedem());
if (rm != null) {
String path = getFilePath(viewPager.getCurrenreplacedem());
ProtoGlobal.RoomMessageType messageType;
if (rm.getForwardMessage() != null) {
messageType = rm.getForwardMessage().getMessageType();
} else {
messageType = rm.getMessageType();
}
File file = new File(path);
if (file.exists()) {
if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
HelperSaveFile.saveFileToDownLoadFolder(path, "VIDEO_" + System.currentTimeMillis() + ".mp4", HelperSaveFile.FolderType.video, R.string.file_save_to_video_folder);
} else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
HelperSaveFile.savePicToGallery(path, true);
}
}
}
}
public String getFilePath(int position) {
String result = "";
RealmAttachment at = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment() : mFList.get(position).getAttachment();
if (at != null) {
if (at.getLocalFilePath() != null)
result = at.getLocalFilePath();
}
ProtoGlobal.RoomMessageType messageType = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getMessageType() : mFList.get(position).getMessageType();
if (result.length() < 1) {
result = AndroidUtils.getFilePathWithCashId(at.getCacheId(), at.getName(), messageType);
}
return result;
}
public String getThumbnailPath(RealmRoomMessage roomMessage) {
String result = "";
if (roomMessage == null) {
return "";
}
if (roomMessage.getAttachment() != null) {
if (roomMessage.getAttachment().getLocalThumbnailPath() != null) {
result = roomMessage.getAttachment().getLocalThumbnailPath();
}
if (result.length() < 1) {
result = AndroidUtils.getFilePathWithCashId(roomMessage.getAttachment().getCacheId(), roomMessage.getAttachment().getName(), G.DIR_TEMP, true);
}
}
return result;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
if (videoController != null) {
videoController.hide();
videoController = null;
}
if (getActivity() != null) {
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
@Override
public void onDetach() {
super.onDetach();
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
if (videoController != null) {
videoController.hide();
videoController = null;
}
focusAudioListener = null;
}
@Override
public void onPause() {
super.onPause();
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
isLockScreen = true;
}
if (videoController != null && videoController.isShowing()) {
videoController.hide();
}
}
@Override
public void onResume() {
super.onResume();
if (isLockScreen) {
if (videoController != null && getActivity() != null) {
videoController.show();
}
}
}
/**
* adapter for view pager
*/
private clreplaced AdapterViewPager extends PagerAdapter implements MediaController.MediaPlayerControl {
private String videoPath;
@Override
public int getCount() {
return mFList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
LayoutInflater inflater = LayoutInflater.from(G.fragmentActivity);
ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.show_image_sub_layout, container, false);
final TextureView mTextureView = layout.findViewById(R.id.textureView);
final ImageView imgPlay = layout.findViewById(R.id.imgPlay);
final PhotoView zoomableImageView = layout.findViewById(R.id.sisl_touch_image_view);
zoomableImageView.setZoomable(false);
FrameLayout frameLayout = layout.findViewById(R.id.Layout_showImage);
frameLayout.setOnClickListener(v -> setPageViewState(imgPlay));
final MessageProgress progress = layout.findViewById(R.id.progress);
AppUtils.setProgresColor(progress.progressBar);
final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
if (rm != null && rm.isValid()) {
if (HelperDownloadFile.getInstance().isDownLoading(rm.getAttachment().getCacheId())) {
progress.withDrawable(R.drawable.ic_cancel, true);
startDownload(position, progress, zoomableImageView, imgPlay, mTextureView);
} else {
progress.withDrawable(R.drawable.ic_download, true);
}
String path = getFilePath(position);
File file = new File(path);
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
mMediaPlayer.seekTo(0);
if (videoController != null)
videoController.hide();
}
if (file.exists()) {
progress.setVisibility(View.GONE);
// G.imageLoader.displayImage(suitablePath(path), zoomableImageView);
ImageLoadingServiceInjector.inject().loadImage(zoomableImageView, path, true);
zoomableImageView.setZoomable(true);
if (rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
zoomableImageView.setVisibility(View.VISIBLE);
imgPlay.setVisibility(View.GONE);
isFirstPlay = false;
} else {
if (isFirstPlay) {
mTextureView.setVisibility(View.VISIBLE);
G.handler.postDelayed(() -> playVideo(position, mTextureView, imgPlay, zoomableImageView), 100);
isFirstPlay = false;
}
imgPlay.setVisibility(View.VISIBLE);
mTextureView.setVisibility(View.INVISIBLE);
videoPath = path;
}
} else {
imgPlay.setVisibility(View.GONE);
path = getThumbnailPath(rm);
zoomableImageView.setVisibility(View.VISIBLE);
file = new File(path);
if (file.exists()) {
// G.imageLoader.displayImage(suitablePath(path), zoomableImageView);
ImageLoadingServiceInjector.inject().loadImage(zoomableImageView, path);
} else if (rm.getAttachment() != null) {
// if thumpnail not exist download it
ProtoFileDownload.FileDownload.Selector selector = null;
long fileSize = 0;
if (rm.getAttachment().getSmallThumbnail() != null) {
selector = ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL;
fileSize = rm.getAttachment().getSmallThumbnail().getSize();
} else if (rm.getAttachment().getLargeThumbnail() != null) {
selector = ProtoFileDownload.FileDownload.Selector.LARGE_THUMBNAIL;
fileSize = rm.getAttachment().getLargeThumbnail().getSize();
}
final String filePathTumpnail = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), G.DIR_TEMP, true);
if (selector != null && fileSize > 0) {
HelperDownloadFile.getInstance().startDownload(rm.getMessageType(), System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), fileSize, selector, "", 4, new HelperDownloadFile.UpdateListener() {
@Override
public void OnProgress(final String path, int progress) {
if (progress == 100) {
G.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
// G.imageLoader.displayImage(AndroidUtils.suitablePath(path), zoomableImageView);
ImageLoadingServiceInjector.inject().loadImage(zoomableImageView, path);
}
});
}
}
@Override
public void OnError(String token) {
}
});
}
}
}
}
progress.setOnClickListener(view -> {
String _cashID = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment().getCacheId() : mFList.get(position).getAttachment().getCacheId();
if (HelperDownloadFile.getInstance().isDownLoading(_cashID)) {
HelperDownloadFile.getInstance().stopDownLoad(_cashID);
} else {
progress.withDrawable(R.drawable.ic_cancel, true);
startDownload(position, progress, zoomableImageView, imgPlay, mTextureView);
}
});
zoomableImageView.setOnClickListener(view -> {
setPageViewState(imgPlay);
});
imgPlay.setOnClickListener(v -> {
mTextureView.setVisibility(View.VISIBLE);
playVideo(position, mTextureView, imgPlay, zoomableImageView);
});
mTextureView.setOnClickListener(v -> setPageViewState(imgPlay));
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) {
if (isFirstPlay) {
if (mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
isFirstPlay = false;
}
}
}
@Override
public void onPageSelected(final int position) {
zoomableImageViewTmp = null;
txtImageNumber.setText(position + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
if (HelperCalander.isPersianUnicode) {
txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
}
showImageInfo(mFList.get(position));
if (mFList.get(position).getForwardMessage() != null) {
messageType = mFList.get(position).getForwardMessage().getMessageType();
} else {
messageType = mFList.get(position).getMessageType();
}
if (mMediaPlayer != null && mMediaPlayer.isPlaying())
mMediaPlayer.stop();
if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
File f = new File(getFilePath(position));
if (f.exists()) {
imgPlay.setVisibility(View.VISIBLE);
zoomableImageView.setVisibility(View.VISIBLE);
} else {
imgPlay.setVisibility(View.GONE);
}
} else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
imgPlay.setVisibility(View.GONE);
}
if (videoController != null) {
videoController.hide();
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
container.addView(layout);
return layout;
}
private void setPageViewState(ImageView imgPlay) {
if (isShowToolbar) {
toolbarShowImage.animate().setDuration(150).alpha(0F).start();
ltImageName.setVisibility(View.GONE);
ltImageName.animate().setDuration(150).alpha(0F).start();
toolbarShowImage.setVisibility(View.GONE);
isShowToolbar = false;
} else {
toolbarShowImage.animate().setDuration(150).alpha(1F).start();
toolbarShowImage.setVisibility(View.VISIBLE);
ltImageName.animate().setDuration(150).alpha(1F).start();
ltImageName.setVisibility(View.VISIBLE);
isShowToolbar = true;
}
if (getActivity() != null && zoomableImageViewTmp != null && imgPlay.getVisibility() != View.VISIBLE && mMediaPlayer != null && videoController != null) {
if (videoController.isShowing()) {
videoController.hide();
} else {
videoController.show();
}
}
}
private void startDownload(final int position, final MessageProgress progress, final PhotoView ZoomableImageView, final ImageView imgPlay, final TextureView mTextureView) {
final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));
if (downloadedList.indexOf(rm.getAttachment().getToken()) == -1) {
downloadedList.add(rm.getAttachment().getCacheId());
}
progress.withOnProgress(() -> G.currentActivity.runOnUiThread(() -> {
progress.withProgress(0);
progress.setVisibility(View.GONE);
ZoomableImageView.setZoomable(true);
if (rm.isValid() && rm.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO) {
imgPlay.setVisibility(View.VISIBLE);
}
}));
DownloadObject struct = DownloadObject.createForRoomMessage(rm);
if (struct == null) {
return;
}
ProtoFileDownload.FileDownload.Selector selector = ProtoFileDownload.FileDownload.Selector.FILE;
getDownloader().download(struct, selector, HttpRequest.PRIORITY.PRIORITY_HIGH, arg -> G.runOnUiThread(() -> {
if (arg.data == null) {
return;
}
switch(arg.status) {
case SUCCESS:
ImageLoadingServiceInjector.inject().loadImage(ZoomableImageView, arg.data.getFilePath());
ZoomableImageView.setZoomable(true);
break;
case LOADING:
progress.withProgress(arg.data.getProgress());
break;
case ERROR:
progress.withProgress(0);
progress.withDrawable(R.drawable.ic_download, true);
break;
}
}));
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
/**
* video player
*/
private void playVideo(final int position, final TextureView mTextureView, final ImageView imgPlay, final PhotoView zoomableImageView) {
zoomableImageViewTmp = zoomableImageView;
if (mMediaPlayer == null)
mMediaPlayer = new MediaPlayer();
if (videoController == null)
videoController = new MediaController(G.fragmentActivity);
mTextureView.setVisibility(View.VISIBLE);
videoPath = getFilePath(position);
ViewCompat.setLayoutDirection(videoController, View.LAYOUT_DIRECTION_LTR);
videoController.setAnchorView(zoomableImageView);
videoController.setMediaPlayer(this);
imgPlay.setVisibility(View.GONE);
mMediaPlayer.reset();
mTextureViewTmp.clear();
mTextureViewTmp.add(mTextureView);
try {
mMediaPlayer.setDataSource(G.fragmentActivity, Uri.parse(videoPath));
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, zoomableImageView);
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
/*Log.e("ddd", "width :" + width + " height : " + height);*/
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
if (mTextureView.getSurfaceTexture() != null) {
setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, zoomableImageView);
}
} catch (IOException | IllegalArgumentException e) {
e.printStackTrace();
}
mMediaPlayer.setOnCompletionListener(mp -> {
mp.seekTo(0);
imgPlay.setVisibility(View.VISIBLE);
});
// mMediaPlayer.seekTo(100);
}
private void setMediaPlayer(MediaPlayer mMediaPlayer, final TextureView mTextureView, final ImageView imgPlay, final PhotoView zoomableImageView) {
if (mTextureView == null) {
return;
}
Surface surfaceTexture = new Surface(mTextureView.getSurfaceTexture());
if (surfaceTexture == null) {
return;
}
try {
if (mMediaPlayer != null) {
mMediaPlayer.setSurface(surfaceTexture);
mMediaPlayer.setLooping(false);
mMediaPlayer.prepareAsync();
}
} catch (IllegalStateException e) {
e.getMessage();
}
mMediaPlayer.setOnPreparedListener(mp -> {
getRealSize(mp, mTextureView);
imgPlay.setVisibility(View.GONE);
mp.start();
MusicPlayer.pauseSound();
mTextureView.setVisibility(View.VISIBLE);
zoomableImageView.animate().setDuration(700).alpha(0F).start();
G.handler.postDelayed(() -> {
zoomableImageView.setVisibility(View.GONE);
zoomableImageView.clearAnimation();
}, 700);
videoController.setEnabled(true);
videoController.show();
});
}
@Override
public void start() {
if (mMediaPlayer != null)
mMediaPlayer.start();
MusicPlayer.pauseSound();
}
@Override
public void pause() {
if (mMediaPlayer != null)
mMediaPlayer.pause();
}
@Override
public int getDuration() {
if (mMediaPlayer != null) {
return mMediaPlayer.getDuration();
}
return 0;
}
@Override
public int getCurrentPosition() {
if (mMediaPlayer != null) {
return mMediaPlayer.getCurrentPosition();
}
return 0;
}
@Override
public void seekTo(int pos) {
if (mMediaPlayer != null)
mMediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mMediaPlayer != null && mMediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return 0;
}
}
/**
* get real width and height video
*/
private void getRealSize(MediaPlayer mp, TextureView mTextureView) {
if (mp == null || mTextureView == null) {
return;
}
// Get the dimensions of the video
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
Display display = G.fragmentActivity.getWindowManager().getDefaultDisplay();
int finalWith, finalHeight;
finalWith = display.getWidth();
finalHeight = (int) (((float) videoHeight / (float) videoWidth) * (float) display.getWidth());
if (finalHeight > display.getHeight()) {
finalWith = (int) (((float) finalWith / (float) finalHeight) * (float) display.getHeight());
finalHeight = display.getHeight();
}
ViewGroup.LayoutParams lp = mTextureView.getLayoutParams();
lp.width = finalWith;
lp.height = finalHeight;
mTextureView.setLayoutParams(lp);
}
public interface FocusAudioListener {
void audioPlay(boolean isPlay);
}
}
15
Source : MainActivity.java
with Apache License 2.0
from kevalpatel2106
with Apache License 2.0
from kevalpatel2106
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// set the is tracking indicator
mTrackingStatusIv = (ImageView) findViewById(R.id.eye_tracking);
mTrackingStatusIv.setVisibility(View.GONE);
// set user aware video view
mVideoView = (UserAwareVideoView) findViewById(R.id.video_view);
mVideoView.setUserAwarenessListener(this);
mVideoView.setVideoURI(Uri.parse("http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"));
// attach tge media controller
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(mVideoView);
mediaController.setPrevNextListeners(new View.OnClickListener() {
@Override
public void onClick(View view) {
mVideoView.stopPlayback();
mVideoView.start();
}
}, new View.OnClickListener() {
@Override
public void onClick(View view) {
mVideoView.stopPlayback();
mVideoView.start();
}
});
mVideoView.setMediaController(mediaController);
// Start video playing. This will start the user eye tracking too.
// Do not care about permissions. Permissions will check internally.
// Just handle errors.
mVideoView.start();
}
15
Source : VideoViewH264m3u8Hw.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264m3u8Hw extends SurfaceView implements LetvMediaPlayerControl {
private static final int AUDIO_SIZE = 1600;
private static final int PICTURE_SIZE = 90;
private static final int STARTPIC_SIZE = 20;
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
private static final String TAG = "VideoViewH264m3u8Hw";
private static final int VIDEO_SIZE = 400;
private final int FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
private final int REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
private int bufferTime = 0;
private boolean enforcementPause = false;
private boolean enforcementWait = false;
protected int lastSeekWhenDestoryed = 0;
private OnAdNumberListener mAdNumberListener = new OnAdNumberListener() {
public void onAdNumber(FFMpegPlayer mediaPlayer, int number) {
if (VideoViewH264m3u8Hw.this.mOnAdNumberListener != null) {
VideoViewH264m3u8Hw.this.mOnAdNumberListener.onAdNumber(mediaPlayer, number);
}
}
};
private OnBlockListener mBlockListener = new OnBlockListener() {
public void onBlock(FFMpegPlayer mediaPlayer, int blockinfo) {
if (VideoViewH264m3u8Hw.this.mOnBlockListener != null) {
VideoViewH264m3u8Hw.this.mOnBlockListener.onBlock(mediaPlayer, blockinfo);
}
if (blockinfo == 10001) {
}
}
};
private OnBufferingUpdateListener mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264m3u8Hw.this.mCurrentBufferPercentage = percent;
if (VideoViewH264m3u8Hw.this.mOnBufferingUpdateListener != null) {
VideoViewH264m3u8Hw.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
private OnCacheListener mCacheListener = new OnCacheListener() {
public void onCache(FFMpegPlayer mediaPlayer, int arg, int percent, long cacherate) {
if (VideoViewH264m3u8Hw.this.mOnCacheListener != null) {
VideoViewH264m3u8Hw.this.mOnCacheListener.onCache(mediaPlayer, arg, percent, cacherate);
}
}
};
private CacheTime mCacheTime;
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
VideoViewH264m3u8Hw.this.mCurrentState = 5;
VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
VideoViewH264m3u8Hw.this.mTargetState = 5;
if (VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.hide();
}
if (VideoViewH264m3u8Hw.this.mOnCompletionListener != null) {
VideoViewH264m3u8Hw.this.mOnCompletionListener.onCompletion(VideoViewH264m3u8Hw.this.mMediaPlayer);
}
VideoViewH264m3u8Hw.this.pause();
VideoViewH264m3u8Hw.this.release(true);
}
};
private WeakReference<Context> mContext;
private int mCurrentBufferPercentage;
private int mCurrentState = 0;
private OnDisplayListener mDisplayListener = new OnDisplayListener() {
public void onDisplay(FFMpegPlayer mediaPlayer) {
LogTag.i("硬解onDisplay()");
String currentDate = Tools.getCurrentDate();
if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.DIAPLAY, currentDate);
}
VideoViewH264m3u8Hw.this.mCurrentState = 3;
VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
}
};
private int mDuration;
private OnErrorListener mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
VideoViewH264m3u8Hw.this.mCurrentState = -1;
VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
VideoViewH264m3u8Hw.this.mTargetState = -1;
if (VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.hide();
}
if (VideoViewH264m3u8Hw.this.mOnErrorListener != null) {
VideoViewH264m3u8Hw.this.mOnErrorListener.onError(VideoViewH264m3u8Hw.this.mMediaPlayer, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
LogTag.i("硬解失败");
LogTag.i("framework_err:" + framework_err);
return true;
}
};
private OnFirstPlayLitener mFirstPlayLitener = new OnFirstPlayLitener() {
public void onFirstPlay(FFMpegPlayer mediaPlayer, long startcosttime) {
if (VideoViewH264m3u8Hw.this.mOnFirstPlayLitener != null) {
VideoViewH264m3u8Hw.this.mOnFirstPlayLitener.onFirstPlay(mediaPlayer, startcosttime);
}
}
};
private OnHardDecodeErrorListner mHardDecodeErrorListner = new OnHardDecodeErrorListner() {
public void onError(FFMpegPlayer mediaPlayer, int arg1, int arg2) {
LogTag.i("OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
String currentDate = Tools.getCurrentDate();
if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.HARD_ERROR, currentDate);
}
if (VideoViewH264m3u8Hw.this.mOnHardDecodeErrorListner != null) {
VideoViewH264m3u8Hw.this.mOnHardDecodeErrorListner.onError(mediaPlayer, arg1, arg2);
}
if (VideoViewH264m3u8Hw.this.mOnErrorListener != null) {
VideoViewH264m3u8Hw.this.mOnErrorListener.onError(mediaPlayer, arg1, arg2);
}
if (VideoViewH264m3u8Hw.this.mContext.get() != null) {
HttpRequestManager.getInstance((Context) VideoViewH264m3u8Hw.this.mContext.get()).hardDecodeReport(VideoViewH264m3u8Hw.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw.this.mUri.toString(), 0, arg1, VideoViewH264m3u8Hw.this.mPlayerUrl.mStreamType, 1);
}
}
};
private OnInfoListener mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
LogTag.i("onInfo+++" + what + "extra+++" + extra);
if (VideoViewH264m3u8Hw.this.mOnInfoListener != null) {
VideoViewH264m3u8Hw.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
private int mInitPostion = 0;
private String mLastUrl;
private MediaController mMediaController;
private FFMpegPlayer mMediaPlayer = null;
private OnAdNumberListener mOnAdNumberListener;
private OnBlockListener mOnBlockListener;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCacheListener mOnCacheListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnFirstPlayLitener mOnFirstPlayLitener;
private OnHardDecodeErrorListner mOnHardDecodeErrorListner;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnSuccessListener mOnSuccessListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
if (VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264m3u8Hw.this.mCurrentState = 2;
VideoViewH264m3u8Hw.this.StateChange(VideoViewH264m3u8Hw.this.mCurrentState);
VideoViewH264m3u8Hw videoViewH264m3u8Hw = VideoViewH264m3u8Hw.this;
VideoViewH264m3u8Hw videoViewH264m3u8Hw2 = VideoViewH264m3u8Hw.this;
VideoViewH264m3u8Hw.this.mCanSeekForward = true;
videoViewH264m3u8Hw2.mCanSeekBack = true;
videoViewH264m3u8Hw.mCanPause = true;
if (VideoViewH264m3u8Hw.this.mOnPreparedListener != null) {
VideoViewH264m3u8Hw.this.mOnPreparedListener.onPrepared(VideoViewH264m3u8Hw.this.mMediaPlayer);
}
VideoViewH264m3u8Hw.this.mLastUrl = ((FFMpegPlayer) mp).getLastUrl();
VideoViewH264m3u8Hw.this.mVersion = ((FFMpegPlayer) mp).getVersion();
if (VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.setEnabled(true);
}
int seekToPosition = VideoViewH264m3u8Hw.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264m3u8Hw.this.seekTo(seekToPosition);
}
VideoViewH264m3u8Hw.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264m3u8Hw.this.mVideoHeight = mp.getVideoHeight();
if (VideoViewH264m3u8Hw.this.mVideoWidth == 0 || VideoViewH264m3u8Hw.this.mVideoHeight == 0) {
if (VideoViewH264m3u8Hw.this.mTargetState == 3) {
VideoViewH264m3u8Hw.this.start();
}
} else if (VideoViewH264m3u8Hw.this.mSurfaceWidth != VideoViewH264m3u8Hw.this.mVideoWidth || VideoViewH264m3u8Hw.this.mSurfaceHeight != VideoViewH264m3u8Hw.this.mVideoHeight) {
VideoViewH264m3u8Hw.this.getHolder().setFixedSize(VideoViewH264m3u8Hw.this.mVideoWidth, VideoViewH264m3u8Hw.this.mVideoHeight);
} else if (VideoViewH264m3u8Hw.this.mTargetState == 3) {
VideoViewH264m3u8Hw.this.start();
if (VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.show();
}
} else if (!VideoViewH264m3u8Hw.this.isPlaying()) {
if ((seekToPosition != 0 || VideoViewH264m3u8Hw.this.getCurrentPosition() > 0) && VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.show(0);
}
}
}
};
private int mRatioType = -1;
Callback mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
LogTag.i(VideoViewH264m3u8Hw.TAG, "surfaceChanged(), w=" + w + " h=" + h);
VideoViewH264m3u8Hw.this.mSurfaceWidth = w;
VideoViewH264m3u8Hw.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264m3u8Hw.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264m3u8Hw.this.mVideoWidth == w && VideoViewH264m3u8Hw.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264m3u8Hw.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264m3u8Hw.this.mSeekWhenPrepared != 0) {
VideoViewH264m3u8Hw.this.seekTo(VideoViewH264m3u8Hw.this.mSeekWhenPrepared);
}
VideoViewH264m3u8Hw.this.start();
if (VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
if (VideoViewH264m3u8Hw.this.mSurfaceHolder == null) {
VideoViewH264m3u8Hw.this.mSurfaceHolder = holder;
LogTag.i(VideoViewH264m3u8Hw.TAG, "mSHCallback:surfaceCreated()->openVideo()");
VideoViewH264m3u8Hw.this.openVideo();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
LogTag.i(VideoViewH264m3u8Hw.TAG, "mSHCallback:surfaceDestroyed()");
VideoViewH264m3u8Hw.this.mSurfaceHolder = null;
if (VideoViewH264m3u8Hw.this.mMediaController != null) {
VideoViewH264m3u8Hw.this.mMediaController.hide();
}
VideoViewH264m3u8Hw.this.lastSeekWhenDestoryed = VideoViewH264m3u8Hw.this.getCurrentPosition();
VideoViewH264m3u8Hw.this.release(false);
}
};
private OnSeekCompleteListener mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
if (VideoViewH264m3u8Hw.this.mOnSeekCompleteListener != null) {
VideoViewH264m3u8Hw.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264m3u8Hw.this.mMediaPlayer);
}
}
};
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
VideoViewH264m3u8Hw.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264m3u8Hw.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264m3u8Hw.this.mVideoWidth == 0 || VideoViewH264m3u8Hw.this.mVideoHeight == 0)) {
VideoViewH264m3u8Hw.this.getHolder().setFixedSize(VideoViewH264m3u8Hw.this.mVideoWidth, VideoViewH264m3u8Hw.this.mVideoHeight);
}
if (VideoViewH264m3u8Hw.this.mOnVideoSizeChangedListener != null) {
VideoViewH264m3u8Hw.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, VideoViewH264m3u8Hw.this.mVideoWidth, VideoViewH264m3u8Hw.this.mVideoHeight);
}
}
};
private int mSourceType = 0;
private OnSuccessListener mSuccessListener = new OnSuccessListener() {
public void onSuccess() {
if (VideoViewH264m3u8Hw.this.mOnSuccessListener != null) {
VideoViewH264m3u8Hw.this.mOnSuccessListener.onSuccess();
}
LogTag.i("硬解成功");
if (VideoViewH264m3u8Hw.this.mContext.get() != null) {
HttpRequestManager.getInstance((Context) VideoViewH264m3u8Hw.this.mContext.get()).hardDecodeReport(VideoViewH264m3u8Hw.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw.this.mUri.toString(), 1, -1, VideoViewH264m3u8Hw.this.mPlayerUrl.mStreamType, 1);
}
}
};
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder = null;
private int mSurfaceWidth;
private int mTargetState = 0;
private Uri mUri;
private String mVersion;
private int mVideoHeight;
private OnVideoViewStateChangeListener mVideoViewStateChangeListener;
private int mVideoWidth;
private int mVolumevalue = 1;
private clreplaced CacheTime {
double block_cache;
double start_cache;
public CacheTime(double start_cache, double block_cache) {
this.start_cache = start_cache;
this.block_cache = block_cache;
}
}
public VideoViewH264m3u8Hw(Context context) {
super(context);
this.mContext = new WeakReference(context);
initVideoView();
}
public VideoViewH264m3u8Hw(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = new WeakReference(context);
initVideoView();
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String videoPath) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(videoPath);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(videoPath));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
LogTag.i(TAG, "setVideoURI()->openVideo()");
openVideo();
requestLayout();
invalidate();
LogTag.i(TAG, "uri=" + this.mUri.toString());
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
return this.mDuration;
}
}
public String getSkipLastURL() {
return this.mLastUrl;
}
public String getVersion() {
return this.mVersion;
}
public int getViewWidth() {
return getLayoutParams().width;
}
public int getViewHeight() {
return getLayoutParams().height;
}
public void start() {
if (this.mContext.get() != null) {
HttpRequestManager.getInstance((Context) this.mContext.get()).requestCapability();
if (this.enforcementWait || this.enforcementPause) {
StateChange(7);
} else if (isInPlaybackState()) {
LogTag.i("硬解开始播放");
this.mMediaPlayer.start();
}
this.mTargetState = 3;
}
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
LogTag.i("pause()");
this.mMediaPlayer.pause();
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public void seekTo(int mesc) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(mesc);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = mesc;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public void stopPlayback() {
stopPlayback(false);
}
public void stopPlayback(boolean isRemoveCallBack) {
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
try {
this.mMediaPlayer.stop();
} catch (Exception e) {
LogTag.i(TAG, "hard decode native player has already null");
}
if (isRemoveCallBack) {
getHolder().removeCallback(this.mSHCallback);
}
String currentDateRelease = Tools.getCurrentDate();
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
try {
this.mMediaPlayer.release();
} catch (Exception e2) {
LogTag.i(TAG, "hard decode native player has already null");
}
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height < this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null || this.mContext.get() == null) {
setVisibility(0);
return;
}
LogTag.i(TAG, "openVideo()-> release(false)");
release(false);
try {
String currentDate = Tools.getCurrentDate();
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new FFMpegPlayer((Context) this.mContext.get());
this.mMediaPlayer.setHardwareDecode(1);
this.mMediaPlayer.setHwCapbility(CodecWrapper.getProfile(), CodecWrapper.getAVCLevel());
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSuccessListener(this.mSuccessListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnAdNumberListener(this.mAdNumberListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mMediaPlayer.setOnBlockListener(this.mBlockListener);
this.mMediaPlayer.setOnCacheListener(this.mCacheListener);
this.mMediaPlayer.setOnFirstPlayListener(this.mFirstPlayLitener);
this.mMediaPlayer.setOnDisplayListener(this.mDisplayListener);
this.mMediaPlayer.setOnHardDecoddErrorListener(this.mHardDecodeErrorListner);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource((Context) this.mContext.get(), this.mUri);
this.mMediaPlayer.setVolume(this.mVolumevalue);
this.mMediaPlayer.setInitPosition(this.mInitPostion);
if (this.mCacheTime != null) {
this.mMediaPlayer.setCacheTime(this.mCacheTime.start_cache, this.mCacheTime.block_cache);
}
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
attachMediaController();
} catch (IllegalStateException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException e) {
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IOException e2) {
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void setVideoViewScale(int width, int height) {
LayoutParams lp = (LayoutParams) getLayoutParams();
lp.height = height;
lp.width = width;
setLayoutParams(lp);
}
private void release(boolean cleartargetstate) {
LogTag.i(TAG, "release(boolean)" + (cleartargetstate ? "true" : "false"));
if (this.mMediaPlayer != null) {
LogTag.i(TAG, "release(boolean)" + (cleartargetstate ? "true" : "false") + "(mMediaPlayer != null)");
String currentDateStop = Tools.getCurrentDate();
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
String currentDateRelease = Tools.getCurrentDate();
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public void setOnAdNumberListener(OnAdNumberListener l) {
this.mOnAdNumberListener = l;
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
public int getAudioSessionId() {
return 0;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
if (this.mVideoViewStateChangeListener != null) {
this.mVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener listener) {
this.mVideoViewStateChangeListener = listener;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnSuccessListener(OnSuccessListener l) {
this.mOnSuccessListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setCacheSize(int video_size, int audio_size, int picture_size, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
this.mOnBlockListener = l;
}
public void setOnCacheListener(OnCacheListener l) {
this.mOnCacheListener = l;
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
this.mOnHardDecodeErrorListner = l;
}
public void setOnFirstPlayListener(OnFirstPlayLitener l) {
this.mOnFirstPlayLitener = l;
}
public int setSourceType(int sourceType) {
return 0;
}
public int setMachineInfomation(float ScreenResolution) {
return 0;
}
public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
return 0;
}
public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
return 0;
}
public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
return 0;
}
public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
return 0;
}
public int setgravity_yroValidInfomation(boolean gravityValid) {
return 0;
}
public int setAngleInit() {
return 0;
}
public int setTwoFingerZoom(float zoom) {
return 0;
}
public void setCacheTime(double start_cache, double block_cache) {
if (this.mCacheTime == null) {
this.mCacheTime = new CacheTime(start_cache, block_cache);
}
if (this.mMediaPlayer != null) {
this.mMediaPlayer.setCacheTime(start_cache, block_cache);
}
}
public void setInitPosition(int msec) {
this.mInitPostion = msec;
if (this.mMediaPlayer != null) {
this.mMediaPlayer.setInitPosition(msec);
}
}
public void setVolume(int volume) {
this.mVolumevalue = volume;
if (this.mMediaPlayer != null) {
this.mMediaPlayer.setVolume(volume);
}
}
public void processSensorEvent(SensorEvent sensorEvent) {
}
}
14
Source : Activity_VideoSurveillance.java
with Apache License 2.0
from yangxch
with Apache License 2.0
from yangxch
private void initView() {
pg = new ProgressDialog(Activity_VideoSurveillance.this);
pg.setMessage("缓冲中...");
pg.show();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setreplacedle("");
TextView toolbarText = (TextView) findViewById(R.id.toolbar_text);
toolbarText.setText("视频监控");
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
if (!Util.checkNetwork(this)) {
return;
}
videoViewVideo = (VideoView) findViewById(R.id.videoViewVideo);
try {
// 设置视频控制器
MediaController mediacontroller = new MediaController(Activity_VideoSurveillance.this);
mediacontroller.setAnchorView(videoViewVideo);
videoViewVideo.setMediaController(mediacontroller);
// 视频来源
videoViewVideo.setVideoURI(Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
} catch (Exception e) {
e.printStackTrace();
pg.dismiss();
}
videoViewVideo.requestFocus();
videoViewVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// Close the progress bar and play the video
public void onPrepared(MediaPlayer mp) {
pg.dismiss();
// 开始播放视频
videoViewVideo.start();
}
});
}
14
Source : VRMediaController.java
with Apache License 2.0
from wheat7
with Apache License 2.0
from wheat7
/**
* Created by wheat7 on 26/07/2017.
*/
public clreplaced VRMediaController extends FrameLayout {
MediaController mMediaController = new MediaController(getContext());
private final static String TAG = "VRMediaController";
private static final int FADE_OUT = 1;
private static final int SHOW_PROGRESS = 2;
private static final int sDefaultTimeout = 3000;
private static final int VR_INTERACTIVE_MODE_GYROSCOPE = 4;
private static final int VR_INTERACTIVE_MODE_TOUCH = 3;
private static final int VR_DISPLAY_MODE_GLreplaced = 102;
private static final int VR_DISPLAY_MODE_NORMAL = 101;
private int interactiveMode = VR_INTERACTIVE_MODE_GYROSCOPE;
private int displayMode = VR_DISPLAY_MODE_GLreplaced;
private MediaPlayerControl mPlayer;
private final Context mContext;
private View mAnchor;
private View mRoot;
private PopupWindow mWindow;
private ProgressBar mProgress;
private TextView mEndTime, mCurrentTime;
private boolean mShowing;
private boolean mDragging;
private boolean mFromXml;
StringBuilder mFormatBuilder;
Formatter mFormatter;
private ImageView mPauseButton;
private ImageView mVRInteractiveModeButton;
private ImageView mVRDisplayModeButton;
private int mAnimStyle;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
long pos;
switch(msg.what) {
case FADE_OUT:
hide();
break;
case SHOW_PROGRESS:
pos = setProgress();
if (!mDragging && mShowing) {
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 1000 - (pos % 1000));
updatePausePlay();
}
break;
}
}
};
public VRMediaController(Context context, AttributeSet attrs) {
super(context, attrs);
mRoot = this;
mContext = context;
mFromXml = true;
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
if (mRoot != null)
initControllerView(mRoot);
}
public VRMediaController(Context context, boolean useFastForward) {
super(context);
mContext = context;
initFloatingWindow();
}
public VRMediaController(Context context) {
this(context, true);
}
private void initFloatingWindow() {
mWindow = new PopupWindow(mContext);
mWindow.setFocusable(false);
mWindow.setBackgroundDrawable(null);
mWindow.setOutsideTouchable(true);
mAnimStyle = android.R.style.Animation;
requestFocus();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void setWindowLayoutType() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
try {
mAnchor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
Method setWindowLayoutType = PopupWindow.clreplaced.getMethod("setWindowLayoutType", new Clreplaced[] { int.clreplaced });
setWindowLayoutType.invoke(mWindow, WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG);
} catch (Exception e) {
}
}
}
private final OnTouchListener mTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mShowing) {
hide();
}
}
return false;
}
};
public void setMediaPlayer(MediaPlayerControl player) {
mPlayer = player;
updatePausePlay();
}
/**
* Set the view that acts as the anchor for the control view.
* This can for example be a VideoView, or your Activity's main view.
* When VideoView calls this method, it will use the VideoView's parent
* as the anchor.
*
* @param view The view to which to anchor the controller when it is visible.
*/
public void setAnchorView(View view) {
mAnchor = view;
if (!mFromXml) {
removeAllViews();
mRoot = makeControllerView();
mWindow.setContentView(mRoot);
mWindow.setWidth(LayoutParams.MATCH_PARENT);
mWindow.setHeight(LayoutParams.WRAP_CONTENT);
}
initControllerView(mRoot);
}
/**
* Create the view that holds the widgets that control playback.
* Derived clreplacedes can override this to create their own.
*
* @return The controller view.
* @hide This doesn't work as advertised
*/
protected View makeControllerView() {
return ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(getResources().getIdentifier("media_controller_vr", "layout", mContext.getPackageName()), this);
}
private void initControllerView(View v) {
mPauseButton = (ImageView) v.findViewById(getResources().getIdentifier("mediacontroller_play_pause", "id", mContext.getPackageName()));
if (mPauseButton != null) {
mPauseButton.requestFocus();
mPauseButton.setOnClickListener(mPauseListener);
}
mVRInteractiveModeButton = (ImageView) v.findViewById(getResources().getIdentifier("mediacontroller_interactive", "id", mContext.getPackageName()));
if (mVRInteractiveModeButton != null) {
mVRInteractiveModeButton.requestFocus();
mVRInteractiveModeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mVRControl.onInteractiveClick(interactiveMode);
updateInteractive();
}
});
}
mVRDisplayModeButton = (ImageView) v.findViewById(getResources().getIdentifier("mediacontroller_display", "id", mContext.getPackageName()));
if (mVRDisplayModeButton != null) {
mVRDisplayModeButton.requestFocus();
mVRDisplayModeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mVRControl.onDisplayClick(displayMode);
updateDisplay();
}
});
}
mProgress = (SeekBar) v.findViewById(getResources().getIdentifier("mediacontroller_seekbar", "id", mContext.getPackageName()));
if (mProgress != null) {
if (mProgress instanceof SeekBar) {
SeekBar seeker = (SeekBar) mProgress;
seeker.setOnSeekBarChangeListener(mSeekListener);
}
mProgress.setMax(1000);
}
mEndTime = (TextView) v.findViewById(getResources().getIdentifier("mediacontroller_time_total", "id", mContext.getPackageName()));
mCurrentTime = (TextView) v.findViewById(getResources().getIdentifier("mediacontroller_time_current", "id", mContext.getPackageName()));
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
}
/**
* Show the controller on screen. It will go away
* automatically after 3 seconds of inactivity.
*/
public void show() {
show(sDefaultTimeout);
}
/**
* Show the controller on screen. It will go away
* automatically after 'timeout' milliseconds of inactivity.
*
* @param timeout The timeout in milliseconds. Use 0 to show
* the controller until hide() is called.
*/
public void show(int timeout) {
if (!mShowing && mAnchor != null) {
setProgress();
if (mPauseButton != null) {
mPauseButton.requestFocus();
}
// disableUnsupportedButtons();
// updateFloatingWindowLayout();
// mWindowManager.addView(mDecor, mDecorLayoutParams);
if (mFromXml) {
setVisibility(View.VISIBLE);
} else {
int[] location = new int[2];
mAnchor.getLocationOnScreen(location);
Rect anchorRect = new Rect(location[0], location[1], location[0] + mAnchor.getWidth(), location[1]);
mWindow.setAnimationStyle(mAnimStyle);
// setWindowLayoutType();
// mWindow.showAtLocation(mAnchor, Gravity.TOP, anchorRect.left, anchorRect.bottom);
mWindow.showAsDropDown(mAnchor, 0, -getResources().getDimensionPixelOffset(getResources().getIdentifier("media_control_height", "dimen", mContext.getPackageName())));
}
if (mreplacedleView != null)
mreplacedleView.setVisibility(View.VISIBLE);
mShowing = true;
}
updatePausePlay();
// cause the progress bar to be updated even if mShowing
// was already true. This happens, for example, if we're
// paused with the progress bar showing the user hits play.
// post(mShowProgress);
mHandler.sendEmptyMessage(SHOW_PROGRESS);
if (timeout != 0) {
// removeCallbacks(mFadeOut);
// postDelayed(mFadeOut, timeout);
mHandler.removeMessages(FADE_OUT);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FADE_OUT), timeout);
}
}
public boolean isShowing() {
return mShowing;
}
/**
* Remove the controller from the screen.
*/
public void hide() {
if (mAnchor == null)
return;
if (mShowing) {
try {
if (mFromXml) {
// removeCallbacks(mShowProgress);
mHandler.removeMessages(SHOW_PROGRESS);
setVisibility(View.GONE);
} else {
mWindow.dismiss();
if (mreplacedleView != null)
mreplacedleView.setVisibility(View.GONE);
}
} catch (IllegalArgumentException ex) {
Log.w("MediaController", "already removed");
}
Log.d(TAG, "hide");
mShowing = false;
}
}
// private final Runnable mFadeOut = new Runnable() {
// @Override
// public void run() {
// Log.d(TAG, "fade," + "mShowing=:" + mShowing);
// if (mShowing) hide();
//
// }
// };
//
// private final Runnable mShowProgress = new Runnable() {
// @Override
// public void run() {
// long pos = setProgress();
// if (!mDragging && mShowing && mPlayer.isPlaying()) {
// postDelayed(mShowProgress, 1000 - (pos % 1000));
// }
// }
// };
/**
* Time Format
*
* @param timeMs
* @return
*/
private String stringForTime(long timeMs) {
long totalSeconds = timeMs / 1000;
long seconds = totalSeconds % 60;
long minutes = (totalSeconds / 60) % 60;
long hours = totalSeconds / 3600;
mFormatBuilder.setLength(0);
if (hours > 0) {
return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
} else {
return mFormatter.format("%02d:%02d", minutes, seconds).toString();
}
}
private long setProgress() {
if (mPlayer == null || mDragging) {
return 0;
}
long position = mPlayer.getCurrentPosition();
long duration = mPlayer.getDuration();
if (mProgress != null) {
if (duration > 0) {
// use long to avoid overflow
long pos = 1000L * position / duration;
mProgress.setProgress((int) pos);
}
int percent = mPlayer.getBufferPercentage();
mProgress.setSecondaryProgress(percent * 10);
}
if (mEndTime != null)
mEndTime.setText(stringForTime(duration));
if (mCurrentTime != null)
mCurrentTime.setText(stringForTime(position));
return position;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// showe until hide is called
show(0);
break;
case MotionEvent.ACTION_UP:
// start timeout
show(sDefaultTimeout);
break;
case MotionEvent.ACTION_CANCEL:
hide();
break;
default:
break;
}
return true;
}
@Override
public boolean onTrackballEvent(MotionEvent ev) {
show(sDefaultTimeout);
return false;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
final boolean uniqueDown = event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_DOWN;
if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || keyCode == KeyEvent.KEYCODE_SPACE) {
if (uniqueDown) {
doPauseResume();
show(sDefaultTimeout);
if (mPauseButton != null) {
mPauseButton.requestFocus();
}
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {
if (uniqueDown && !mPlayer.isPlaying()) {
mPlayer.start();
updatePausePlay();
show(sDefaultTimeout);
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {
if (uniqueDown && mPlayer.isPlaying()) {
mPlayer.pause();
updatePausePlay();
show(sDefaultTimeout);
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE || keyCode == KeyEvent.KEYCODE_CAMERA) {
// don't show the controls for volume adjustment
return super.dispatchKeyEvent(event);
} else if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_MENU) {
if (uniqueDown) {
hide();
}
return true;
}
show(sDefaultTimeout);
return super.dispatchKeyEvent(event);
}
private final View.OnClickListener mPauseListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
doPauseResume();
show(sDefaultTimeout);
}
};
private void updatePausePlay() {
if (mRoot == null || mPauseButton == null)
return;
if (mPlayer.isPlaying())
mPauseButton.setImageResource(getResources().getIdentifier("mediacontroller_pause", "drawable", mContext.getPackageName()));
else
mPauseButton.setImageResource(getResources().getIdentifier("mediacontroller_play", "drawable", mContext.getPackageName()));
}
private void doPauseResume() {
if (mPlayer.isPlaying()) {
mPlayer.pause();
} else {
mPlayer.start();
}
updatePausePlay();
}
// There are two scenarios that can trigger the seekbar listener to trigger:
//
// The first is the user using the touchpad to adjust the posireplacedon of the
// seekbar's thumb. In this case onStartTrackingTouch is called followed by
// a number of onProgressChanged notifications, concluded by onStopTrackingTouch.
// We're setting the field "mDragging" to true for the duration of the dragging
// session to avoid jumps in the position in case of ongoing playback.
//
// The second scenario involves the user operating the scroll ball, in this
// case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications,
// we will simply apply the updated position without suspending regular updates.
private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStartTrackingTouch(SeekBar bar) {
show(3600000);
mDragging = true;
// By removing these pending progress messages we make sure
// that a) we won't update the progress while the user adjusts
// the seekbar and b) once the user is done dragging the thumb
// we will post one of these messages to the queue again and
// this ensures that there will be exactly one message queued up.
// removeCallbacks(mShowProgress);
mHandler.removeMessages(SHOW_PROGRESS);
}
@Override
public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
if (!fromuser) {
// We're not interested in programmatically generated changes to
// the progress bar's position.
return;
}
long duration = mPlayer.getDuration();
long newPosition = (duration * progress) / 1000L;
mPlayer.seekTo((int) newPosition);
if (mCurrentTime != null)
mCurrentTime.setText(stringForTime((int) newPosition));
}
@Override
public void onStopTrackingTouch(SeekBar bar) {
mDragging = false;
setProgress();
updatePausePlay();
show(sDefaultTimeout);
// Ensure that progress is properly updated in the future,
// the call to show() does not guarantee this because it is a
// no-op if we are already showing.
// post(mShowProgress);
mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000);
}
};
@Override
public void setEnabled(boolean enabled) {
if (mPauseButton != null) {
mPauseButton.setEnabled(enabled);
if (mProgress != null) {
mProgress.setEnabled(enabled);
}
// disableUnsupportedButtons();
super.setEnabled(enabled);
}
}
public interface MediaPlayerControl {
void start();
void pause();
long getDuration();
long getCurrentPosition();
void seekTo(long pos);
boolean isPlaying();
int getBufferPercentage();
}
/*----------------------------------------Extend VR ------------------------------------------*/
private VRControl mVRControl;
public interface VRControl {
void onInteractiveClick(int currentMode);
void onDisplayClick(int currentMode);
}
public void setOnVRControlListener(VRControl vrControl) {
mVRControl = vrControl;
}
private void updateInteractive() {
if (mRoot == null || mVRInteractiveModeButton == null)
return;
if (interactiveMode == VR_INTERACTIVE_MODE_GYROSCOPE) {
interactiveMode = VR_INTERACTIVE_MODE_TOUCH;
mVRInteractiveModeButton.setImageResource(getResources().getIdentifier("ic_gyroscope", "drawable", mContext.getPackageName()));
} else {
interactiveMode = VR_INTERACTIVE_MODE_GYROSCOPE;
mVRInteractiveModeButton.setImageResource(getResources().getIdentifier("ic_touch_mode", "drawable", mContext.getPackageName()));
}
}
private void updateDisplay() {
if (mRoot == null || mVRDisplayModeButton == null)
return;
if (displayMode == VR_DISPLAY_MODE_GLreplaced) {
displayMode = VR_DISPLAY_MODE_NORMAL;
mVRDisplayModeButton.setImageResource(getResources().getIdentifier("ic_vr_mode", "drawable", mContext.getPackageName()));
} else {
displayMode = VR_DISPLAY_MODE_GLreplaced;
mVRDisplayModeButton.setImageResource(getResources().getIdentifier("ic_eye_mode", "drawable", mContext.getPackageName()));
}
}
/*----------------------------------------Extend replacedle ------------------------------------------*/
private View mreplacedleView;
public void setreplacedleView(View v) {
mreplacedleView = v;
}
}
14
Source : VideoPlayer.java
with MIT License
from praharshjain
with MIT License
from praharshjain
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hideStatusBar();
setContentView(R.layout.video_player);
vw = findViewById(R.id.videoView);
vw.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int i) {
hideStatusBar();
}
});
progressDialog = new ProgressDialog(this);
showProgressBar();
MediaController mc = new MediaController(this);
mc.setAnchorView(vw);
mc.setMediaPlayer(vw);
Uri video = null;
try {
video = Uri.parse(getIntent().getStringExtra("file"));
} catch (Exception e) {
finish();
}
vw.setVideoURI(video);
vw.setMediaController(mc);
vw.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
progressDialog.dismiss();
}
});
vw.requestFocus();
vw.start();
}
14
Source : PreviewActivity.java
with MIT License
from memfis19
with MIT License
from memfis19
/**
* Created by memfis on 7/6/16.
*/
public clreplaced PreviewActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "PreviewActivity";
private final static String MEDIA_ACTION_ARG = "media_action_arg";
private final static String FILE_PATH_ARG = "file_path_arg";
private final static String RESPONSE_CODE_ARG = "response_code_arg";
private final static String VIDEO_POSITION_ARG = "current_video_position";
private final static String VIDEO_IS_PLAYED_ARG = "is_played";
private final static String MIME_TYPE_VIDEO = "video";
private final static String MIME_TYPE_IMAGE = "image";
private int mediaAction;
private String previewFilePath;
private SurfaceView surfaceView;
private FrameLayout photoPreviewContainer;
private ImageView imagePreview;
private ViewGroup buttonPanel;
private AspectFrameLayout videoPreviewContainer;
private View cropMediaAction;
private TextView ratioChanger;
private MediaController mediaController;
private MediaPlayer mediaPlayer;
private int currentPlaybackPosition = 0;
private boolean isVideoPlaying = true;
private int currentRatioIndex = 0;
private float[] ratios;
private String[] ratioLabels;
private SurfaceHolder.Callback surfaceCallbacks = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
showVideoPreview(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
};
private MediaController.MediaPlayerControl MediaPlayerControlImpl = new MediaController.MediaPlayerControl() {
@Override
public void start() {
mediaPlayer.start();
}
@Override
public void pause() {
mediaPlayer.pause();
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return mediaPlayer.getAudioSessionId();
}
};
public static Intent newIntent(Context context, @AnncaConfiguration.MediaAction int mediaAction, String filePath) {
return new Intent(context, PreviewActivity.clreplaced).putExtra(MEDIA_ACTION_ARG, mediaAction).putExtra(FILE_PATH_ARG, filePath);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preview);
String originalRatioLabel = getString(R.string.preview_controls_original_ratio_label);
ratioLabels = new String[] { originalRatioLabel, "1:1", "4:3", "16:9" };
ratios = new float[] { 0f, 1f, 4f / 3f, 16f / 9f };
surfaceView = (SurfaceView) findViewById(R.id.video_preview);
surfaceView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mediaController == null)
return false;
if (mediaController.isShowing()) {
mediaController.hide();
showButtonPanel(true);
} else {
showButtonPanel(false);
mediaController.show();
}
return false;
}
});
videoPreviewContainer = (AspectFrameLayout) findViewById(R.id.previewAspectFrameLayout);
photoPreviewContainer = (FrameLayout) findViewById(R.id.photo_preview_container);
buttonPanel = (ViewGroup) findViewById(R.id.preview_control_panel);
View confirmMediaResult = findViewById(R.id.confirm_media_result);
View reTakeMedia = findViewById(R.id.re_take_media);
View cancelMediaAction = findViewById(R.id.cancel_media_action);
cropMediaAction = findViewById(R.id.crop_image);
ratioChanger = (TextView) findViewById(R.id.ratio_image);
ratioChanger.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentRatioIndex = (currentRatioIndex + 1) % ratios.length;
ratioChanger.setText(ratioLabels[currentRatioIndex]);
}
});
cropMediaAction.setVisibility(View.GONE);
ratioChanger.setVisibility(View.GONE);
if (cropMediaAction != null)
cropMediaAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
if (confirmMediaResult != null)
confirmMediaResult.setOnClickListener(this);
if (reTakeMedia != null)
reTakeMedia.setOnClickListener(this);
if (cancelMediaAction != null)
cancelMediaAction.setOnClickListener(this);
Bundle args = getIntent().getExtras();
mediaAction = args.getInt(MEDIA_ACTION_ARG);
previewFilePath = args.getString(FILE_PATH_ARG);
if (mediaAction == AnncaConfiguration.MEDIA_ACTION_VIDEO) {
displayVideo(savedInstanceState);
} else if (mediaAction == AnncaConfiguration.MEDIA_ACTION_PHOTO) {
displayImage();
} else {
String mimeType = Utils.getMimeType(previewFilePath);
if (mimeType.contains(MIME_TYPE_VIDEO)) {
displayVideo(savedInstanceState);
} else if (mimeType.contains(MIME_TYPE_IMAGE)) {
displayImage();
} else
finish();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveVideoParams(outState);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
if (mediaController != null) {
mediaController.hide();
mediaController = null;
}
}
private void displayImage() {
videoPreviewContainer.setVisibility(View.GONE);
surfaceView.setVisibility(View.GONE);
showImagePreview();
ratioChanger.setText(ratioLabels[currentRatioIndex]);
}
private void showImagePreview() {
imagePreview = new ImageView(this);
AnncaImageLoader.Builder builder = new AnncaImageLoader.Builder(this);
builder.load(previewFilePath).build().into(imagePreview);
photoPreviewContainer.removeAllViews();
photoPreviewContainer.addView(imagePreview);
}
private void displayVideo(Bundle savedInstanceState) {
cropMediaAction.setVisibility(View.GONE);
ratioChanger.setVisibility(View.GONE);
if (savedInstanceState != null) {
loadVideoParams(savedInstanceState);
}
photoPreviewContainer.setVisibility(View.GONE);
surfaceView.getHolder().addCallback(surfaceCallbacks);
}
private void showVideoPreview(SurfaceHolder holder) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(previewFilePath);
mediaPlayer.setDisplay(holder);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaController = new MediaController(PreviewActivity.this);
mediaController.setAnchorView(surfaceView);
mediaController.setMediaPlayer(MediaPlayerControlImpl);
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
videoPreviewContainer.setAspectRatio((double) videoWidth / videoHeight);
mediaPlayer.start();
mediaPlayer.seekTo(currentPlaybackPosition);
if (!isVideoPlaying)
mediaPlayer.pause();
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
finish();
return true;
}
});
mediaPlayer.prepareAsync();
} catch (Exception e) {
Log.e(TAG, "Error media player playing video.");
finish();
}
}
private void saveVideoParams(Bundle outState) {
if (mediaPlayer != null) {
outState.putInt(VIDEO_POSITION_ARG, mediaPlayer.getCurrentPosition());
outState.putBoolean(VIDEO_IS_PLAYED_ARG, mediaPlayer.isPlaying());
}
}
private void loadVideoParams(Bundle savedInstanceState) {
currentPlaybackPosition = savedInstanceState.getInt(VIDEO_POSITION_ARG, 0);
isVideoPlaying = savedInstanceState.getBoolean(VIDEO_IS_PLAYED_ARG, true);
}
private void showButtonPanel(boolean show) {
if (show) {
buttonPanel.setVisibility(View.VISIBLE);
} else {
buttonPanel.setVisibility(View.GONE);
}
}
@Override
public void onClick(View view) {
Intent resultIntent = new Intent();
if (view.getId() == R.id.confirm_media_result) {
resultIntent.putExtra(RESPONSE_CODE_ARG, BaseAnncaActivity.ACTION_CONFIRM).putExtra(FILE_PATH_ARG, previewFilePath);
} else if (view.getId() == R.id.re_take_media) {
deleteMediaFile();
resultIntent.putExtra(RESPONSE_CODE_ARG, BaseAnncaActivity.ACTION_RETAKE);
} else if (view.getId() == R.id.cancel_media_action) {
deleteMediaFile();
resultIntent.putExtra(RESPONSE_CODE_ARG, BaseAnncaActivity.ACTION_CANCEL);
}
setResult(RESULT_OK, resultIntent);
finish();
}
@Override
public void onBackPressed() {
super.onBackPressed();
deleteMediaFile();
}
private boolean deleteMediaFile() {
File mediaFile = new File(previewFilePath);
return mediaFile.delete();
}
public static boolean isResultConfirm(@NonNull Intent resultIntent) {
return BaseAnncaActivity.ACTION_CONFIRM == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
}
public static String getMediaFilePatch(@NonNull Intent resultIntent) {
return resultIntent.getStringExtra(FILE_PATH_ARG);
}
public static boolean isResultRetake(@NonNull Intent resultIntent) {
return BaseAnncaActivity.ACTION_RETAKE == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
}
public static boolean isResultCancel(@NonNull Intent resultIntent) {
return BaseAnncaActivity.ACTION_CANCEL == resultIntent.getIntExtra(RESPONSE_CODE_ARG, -1);
}
}
14
Source : VideoViewH264m3u8HwLeMobile.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264m3u8HwLeMobile extends SurfaceView implements LetvMediaPlayerControl {
private static final int AUDIO_SIZE = 1600;
private static final int PICTURE_SIZE = 90;
private static final int STARTPIC_SIZE = 20;
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
private static final String TAG = "VideoViewH264LeMobileHw";
private static final int VIDEO_SIZE = 400;
private final int FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
private final int REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
private int bufferTime = 0;
private boolean enforcementPause = false;
private boolean enforcementWait = false;
protected int lastSeekWhenDestoryed = 0;
private OnBlockListener mBlockListener = new OnBlockListener() {
public void onBlock(FFMpegPlayer mediaPlayer, int blockinfo) {
if (VideoViewH264m3u8HwLeMobile.this.mOnBlockListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnBlockListener.onBlock(mediaPlayer, blockinfo);
}
if (blockinfo == 10001) {
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8) 出现卡顿");
} else if (blockinfo == 10002) {
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8) 结束卡顿");
}
}
};
private OnBufferingUpdateListener mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264m3u8HwLeMobile.this.mCurrentBufferPercentage = percent;
if (VideoViewH264m3u8HwLeMobile.this.mOnBufferingUpdateListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
private OnCacheListener mCacheListener = new OnCacheListener() {
public void onCache(FFMpegPlayer mediaPlayer, int arg, int percent, long cacherate) {
if (VideoViewH264m3u8HwLeMobile.this.mOnCacheListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnCacheListener.onCache(mediaPlayer, arg, percent, cacherate);
}
if (arg == 10003) {
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264m3u8Hw(软解m3u8) 开始缓存 ");
}
if (arg == FFMpegPlayer.MEDIA_CACHE_END) {
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264m3u8Hw(软解m3u8) 缓存结束 ");
}
}
};
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
VideoViewH264m3u8HwLeMobile.this.mCurrentState = 5;
VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
VideoViewH264m3u8HwLeMobile.this.mTargetState = 5;
VideoViewH264m3u8HwLeMobile.this.mCurrentState = 6;
VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.hide();
}
if (VideoViewH264m3u8HwLeMobile.this.mOnCompletionListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnCompletionListener.onCompletion(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer);
}
VideoViewH264m3u8HwLeMobile.this.pause();
VideoViewH264m3u8HwLeMobile.this.release(true);
}
};
private Context mContext;
private int mCurrentBufferPercentage;
private int mCurrentState = 0;
private OnDisplayListener mDisplayListener = new OnDisplayListener() {
public void onDisplay(FFMpegPlayer mediaPlayer) {
LogTag.i("硬解onDisplay()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8) 第一帧画面时间 onDisplay()");
if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.DIAPLAY, currentDate);
}
VideoViewH264m3u8HwLeMobile.this.mCurrentState = 3;
VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
}
};
private int mDuration;
private OnErrorListener mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
VideoViewH264m3u8HwLeMobile.this.mCurrentState = -1;
VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
VideoViewH264m3u8HwLeMobile.this.mTargetState = -1;
if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.hide();
}
if (VideoViewH264m3u8HwLeMobile.this.mOnErrorListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnErrorListener.onError(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewH264LeMobileHw(硬解m3u8) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
LogTag.i("硬解失败");
LogTag.i("framework_err:" + framework_err);
return true;
}
};
private OnFirstPlayLitener mFirstPlayLitener = new OnFirstPlayLitener() {
public void onFirstPlay(FFMpegPlayer mediaPlayer, long startcosttime) {
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + "第一次播放 ");
if (VideoViewH264m3u8HwLeMobile.this.mOnFirstPlayLitener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnFirstPlayLitener.onFirstPlay(mediaPlayer, startcosttime);
}
}
};
private OnHardDecodeErrorListner mHardDecodeErrorListner = new OnHardDecodeErrorListner() {
public void onError(FFMpegPlayer mediaPlayer, int arg1, int arg2) {
LogTag.i("OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewH264LeMobileHw(硬解m3u8) OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.HARD_ERROR, currentDate);
}
if (VideoViewH264m3u8HwLeMobile.this.mOnHardDecodeErrorListner != null) {
VideoViewH264m3u8HwLeMobile.this.mOnHardDecodeErrorListner.onError(mediaPlayer, arg1, arg2);
}
if (VideoViewH264m3u8HwLeMobile.this.mOnErrorListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnErrorListener.onError(mediaPlayer, arg1, arg2);
}
}
};
private OnInfoListener mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
LogTag.i("onInfo+++" + what + "extra+++" + extra);
if (VideoViewH264m3u8HwLeMobile.this.mOnInfoListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
private String mLastUrl;
private MediaController mMediaController;
private FFMpegPlayer mMediaPlayer = null;
private OnBlockListener mOnBlockListener;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCacheListener mOnCacheListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnFirstPlayLitener mOnFirstPlayLitener;
private OnHardDecodeErrorListner mOnHardDecodeErrorListner;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnSuccessListener mOnSuccessListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8) onPrepared()");
if (VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264m3u8HwLeMobile.this.mCurrentState = 2;
VideoViewH264m3u8HwLeMobile.this.StateChange(VideoViewH264m3u8HwLeMobile.this.mCurrentState);
VideoViewH264m3u8HwLeMobile videoViewH264m3u8HwLeMobile = VideoViewH264m3u8HwLeMobile.this;
VideoViewH264m3u8HwLeMobile videoViewH264m3u8HwLeMobile2 = VideoViewH264m3u8HwLeMobile.this;
VideoViewH264m3u8HwLeMobile.this.mCanSeekForward = true;
videoViewH264m3u8HwLeMobile2.mCanSeekBack = true;
videoViewH264m3u8HwLeMobile.mCanPause = true;
if (VideoViewH264m3u8HwLeMobile.this.mOnPreparedListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnPreparedListener.onPrepared(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer);
}
VideoViewH264m3u8HwLeMobile.this.mLastUrl = ((FFMpegPlayer) mp).getLastUrl();
VideoViewH264m3u8HwLeMobile.this.mVersion = ((FFMpegPlayer) mp).getVersion();
if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.setEnabled(true);
}
int seekToPosition = VideoViewH264m3u8HwLeMobile.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264m3u8HwLeMobile.this.seekTo(seekToPosition);
}
VideoViewH264m3u8HwLeMobile.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264m3u8HwLeMobile.this.mVideoHeight = mp.getVideoHeight();
if (VideoViewH264m3u8HwLeMobile.this.mVideoWidth == 0 || VideoViewH264m3u8HwLeMobile.this.mVideoHeight == 0) {
if (VideoViewH264m3u8HwLeMobile.this.mTargetState == 3) {
VideoViewH264m3u8HwLeMobile.this.start();
}
} else if (VideoViewH264m3u8HwLeMobile.this.mSurfaceWidth != VideoViewH264m3u8HwLeMobile.this.mVideoWidth || VideoViewH264m3u8HwLeMobile.this.mSurfaceHeight != VideoViewH264m3u8HwLeMobile.this.mVideoHeight) {
VideoViewH264m3u8HwLeMobile.this.getHolder().setFixedSize(VideoViewH264m3u8HwLeMobile.this.mVideoWidth, VideoViewH264m3u8HwLeMobile.this.mVideoHeight);
} else if (VideoViewH264m3u8HwLeMobile.this.mTargetState == 3) {
VideoViewH264m3u8HwLeMobile.this.start();
if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.show();
}
} else if (!VideoViewH264m3u8HwLeMobile.this.isPlaying()) {
if ((seekToPosition != 0 || VideoViewH264m3u8HwLeMobile.this.getCurrentPosition() > 0) && VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.show(0);
}
}
}
};
private int mRatioType = -1;
Callback mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
VideoViewH264m3u8HwLeMobile.this.mSurfaceWidth = w;
VideoViewH264m3u8HwLeMobile.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264m3u8HwLeMobile.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264m3u8HwLeMobile.this.mVideoWidth == w && VideoViewH264m3u8HwLeMobile.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264m3u8HwLeMobile.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264m3u8HwLeMobile.this.mSeekWhenPrepared != 0) {
VideoViewH264m3u8HwLeMobile.this.seekTo(VideoViewH264m3u8HwLeMobile.this.mSeekWhenPrepared);
}
VideoViewH264m3u8HwLeMobile.this.start();
if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
if (VideoViewH264m3u8HwLeMobile.this.mSurfaceHolder == null) {
VideoViewH264m3u8HwLeMobile.this.mSurfaceHolder = holder;
VideoViewH264m3u8HwLeMobile.this.openVideo();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
VideoViewH264m3u8HwLeMobile.this.mSurfaceHolder = null;
if (VideoViewH264m3u8HwLeMobile.this.mMediaController != null) {
VideoViewH264m3u8HwLeMobile.this.mMediaController.hide();
}
VideoViewH264m3u8HwLeMobile.this.lastSeekWhenDestoryed = VideoViewH264m3u8HwLeMobile.this.getCurrentPosition();
VideoViewH264m3u8HwLeMobile.this.release(true);
}
};
private OnSeekCompleteListener mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
if (VideoViewH264m3u8HwLeMobile.this.mOnSeekCompleteListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264m3u8HwLeMobile.this.mMediaPlayer);
}
}
};
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
VideoViewH264m3u8HwLeMobile.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264m3u8HwLeMobile.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264m3u8HwLeMobile.this.mVideoWidth == 0 || VideoViewH264m3u8HwLeMobile.this.mVideoHeight == 0)) {
VideoViewH264m3u8HwLeMobile.this.getHolder().setFixedSize(VideoViewH264m3u8HwLeMobile.this.mVideoWidth, VideoViewH264m3u8HwLeMobile.this.mVideoHeight);
}
if (VideoViewH264m3u8HwLeMobile.this.mOnVideoSizeChangedListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, VideoViewH264m3u8HwLeMobile.this.mVideoWidth, VideoViewH264m3u8HwLeMobile.this.mVideoHeight);
}
}
};
private OnSuccessListener mSuccessListener = new OnSuccessListener() {
public void onSuccess() {
if (VideoViewH264m3u8HwLeMobile.this.mOnSuccessListener != null) {
VideoViewH264m3u8HwLeMobile.this.mOnSuccessListener.onSuccess();
}
LogTag.i("硬解成功");
}
};
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder = null;
private int mSurfaceWidth;
private int mTargetState = 0;
private Uri mUri;
private String mVersion;
private int mVideoHeight;
private OnVideoViewStateChangeListener mVideoViewStateChangeListener;
private int mVideoWidth;
public VideoViewH264m3u8HwLeMobile(Context context) {
super(context);
this.mContext = context;
initVideoView();
}
public VideoViewH264m3u8HwLeMobile(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initVideoView();
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String videoPath) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(videoPath);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(videoPath));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
LogTag.i(TAG, "uri=" + this.mUri.toString());
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
return this.mDuration;
}
}
public String getSkipLastURL() {
return this.mLastUrl;
}
public String getVersion() {
return this.mVersion;
}
public int getViewWidth() {
return getLayoutParams().width;
}
public int getViewHeight() {
return getLayoutParams().height;
}
public void start() {
if (this.enforcementWait || this.enforcementPause) {
StateChange(7);
} else if (isInPlaybackState()) {
LogTag.i("硬解开始播放");
this.mMediaPlayer.start();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8) start()");
}
this.mTargetState = 3;
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
LogTag.i("pause()");
this.mMediaPlayer.pause();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + Tools.getCurrentDate() + " VideoViewH264LeMobileHw(硬解m3u8) pause()");
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public void seekTo(int mesc) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(mesc);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = mesc;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public void stopPlayback() {
stopPlayback(false);
}
public void stopPlayback(boolean isRemoveCallBack) {
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264LeMobileHw stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
try {
this.mMediaPlayer.stop();
} catch (Exception e) {
LogTag.i(TAG, "hard decode native player has already null");
}
if (isRemoveCallBack) {
getHolder().removeCallback(this.mSHCallback);
}
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264LeMobileHw release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
try {
this.mMediaPlayer.release();
} catch (Exception e2) {
LogTag.i(TAG, "hard decode native player has already null");
}
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height <= this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null) {
setVisibility(0);
return;
}
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264LeMobileHw(硬解m3u8) 创建FFMpegPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new FFMpegPlayer(this.mContext);
this.mMediaPlayer.setHardwareDecode(1);
this.mMediaPlayer.setHwCapbility(CodecWrapper.getProfile(), CodecWrapper.getAVCLevel());
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSuccessListener(this.mSuccessListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mMediaPlayer.setOnBlockListener(this.mBlockListener);
this.mMediaPlayer.setOnCacheListener(this.mCacheListener);
this.mMediaPlayer.setOnFirstPlayListener(this.mFirstPlayLitener);
this.mMediaPlayer.setOnDisplayListener(this.mDisplayListener);
this.mMediaPlayer.setOnHardDecoddErrorListener(this.mHardDecodeErrorListner);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
attachMediaController();
} catch (IllegalStateException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException e) {
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IOException e2) {
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void setVideoViewScale(int width, int height) {
LayoutParams lp = (LayoutParams) getLayoutParams();
lp.height = height;
lp.width = width;
setLayoutParams(lp);
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264LeMobileHw stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264LeMobileHw release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
public int getAudioSessionId() {
return 0;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
if (this.mVideoViewStateChangeListener != null) {
this.mVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener listener) {
this.mVideoViewStateChangeListener = listener;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnSuccessListener(OnSuccessListener l) {
this.mOnSuccessListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picture_size, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
this.mOnBlockListener = l;
}
public void setOnCacheListener(OnCacheListener l) {
this.mOnCacheListener = l;
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
this.mOnHardDecodeErrorListner = l;
}
public void setOnFirstPlayListener(OnFirstPlayLitener l) {
this.mOnFirstPlayLitener = l;
}
public int setSourceType(int sourceType) {
return 0;
}
public int setMachineInfomation(float ScreenResolution) {
return 0;
}
public int setOneFingertouchInfomation(float begin_x, float begin_y, float end_x, float end_y) {
return 0;
}
public int setTwoFingertouchInfomation(float begin_x0, float begin_y0, float begin_x1, float begin_y1, float end_x0, float end_y0, float end_x1, float end_y1) {
return 0;
}
public int setgravity_yroInfomation(float gravity_yro_x, float gravity_yro_y, float gravity_yro_z) {
return 0;
}
public int setGravityInfomation(float gravity_x, float gravity_y, float gravity_z) {
return 0;
}
public int setgravity_yroValidInfomation(boolean gravityValid) {
return 0;
}
public int setAngleInit() {
return 0;
}
public int setTwoFingerZoom(float zoom) {
return 0;
}
public void setInitPosition(int msec) {
}
public void setVolume(int volume) {
}
public void setCacheTime(double start_cache, double block_cache) {
}
public void processSensorEvent(SensorEvent sensorEvent) {
}
}
14
Source : VideoViewH264m3u8Hw_4D.java
with Apache License 2.0
from JackChan1999
with Apache License 2.0
from JackChan1999
public clreplaced VideoViewH264m3u8Hw_4D extends SurfaceView implements LetvMediaPlayerControl4D {
private static final int AUDIO_SIZE = 1600;
public static final int DEFAULT = 0;
private static int FIRST_SYNC_UPDATE_TIME_MS = 200;
private static int HAPTICS_RESYNC_INTERVAL_MS = LeMessageIds.MSG_FLOAT_BALL_REQUEST_DATA;
public static final int HAPTIC_ERROR = -1;
public static final int HAPTIC_INITIALIZED = 1;
public static final int HAPTIC_UNINITIALIZED = 0;
private static final String INACCESSIBLE_URL = "INACCESSIBLE_URL";
private static int INITIAL_RESYNC_INTERVAL_MS = 100;
private static final String INVALID = "INVALID";
private static final String MALFORMED_URL = "MALFORMED_URL";
private static int MEDIA_PREPARE_INTERVAL_MS = 20;
public static final int MUTED = 1;
public static final int PAUSED = 2;
public static final int PAUSED_BUFFERRING_FINISHED = 4;
public static final int PAUSED_DUE_TO_BUFFERING = 3;
private static final String PERMISSION_DENIED = "PERMISSION_DENIED";
private static final int PICTURE_SIZE = 90;
public static final int PLAYING = 1;
private static int PLAY_PAUSE_FADEOUT_TIME_MS = 2000;
private static int SEEKBAR_UPDATE_DURATION_MS = 200;
private static final int STARTPIC_SIZE = 20;
public static final int STATE_ENFORCEMENT = 7;
public static final int STATE_ERROR = -1;
public static final int STATE_IDLE = 0;
public static final int STATE_PAUSED = 4;
public static final int STATE_PLAYBACK_COMPLETED = 5;
public static final int STATE_PLAYING = 3;
public static final int STATE_PREPARED = 2;
public static final int STATE_PREPARING = 1;
public static final int STATE_STOPBACK = 6;
public static final int STOPPED = 0;
private static final String SUCCESS = "SUCCESS";
private static final String TAG = "VideoViewH264m3u8Hw";
public static final int UNINITIALIZED = -1;
private static final String UNSUPPORTED_PROTOCOL = "UNSUPPORTED_PROTOCOL";
private static final int VIDEO_SIZE = 400;
private final int FORWARD_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
private final int REWIND_TIME = LetvConstant.WIDGET_UPDATE_UI_TIME;
private int bufferTime = 0;
private Runnable changeResyncInterval = new Runnable() {
public void run() {
if (VideoViewH264m3u8Hw_4D.this.getCurrentPosition() > VideoViewH264m3u8Hw_4D.FIRST_SYNC_UPDATE_TIME_MS) {
VideoViewH264m3u8Hw_4D.this.mResyncInterval = VideoViewH264m3u8Hw_4D.HAPTICS_RESYNC_INTERVAL_MS;
} else {
VideoViewH264m3u8Hw_4D.this.postDelayed(VideoViewH264m3u8Hw_4D.this.changeResyncInterval, (long) VideoViewH264m3u8Hw_4D.INITIAL_RESYNC_INTERVAL_MS);
}
}
};
private boolean downloadHapt = true;
private boolean enforcementPause = false;
private boolean enforcementWait = false;
private String hapt;
protected int lastSeekWhenDestoryed = 0;
private OnBlockListener mBlockListener = new OnBlockListener() {
public void onBlock(FFMpegPlayer mediaPlayer, int blockinfo) {
if (VideoViewH264m3u8Hw_4D.this.mOnBlockListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnBlockListener.onBlock(mediaPlayer, blockinfo);
}
}
};
private OnBufferingUpdateListener mBufferingUpdateListener = new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
VideoViewH264m3u8Hw_4D.this.mCurrentBufferPercentage = percent;
if (VideoViewH264m3u8Hw_4D.this.mOnBufferingUpdateListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnBufferingUpdateListener.onBufferingUpdate(mp, percent);
}
}
};
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
private OnCompletionListener mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
VideoViewH264m3u8Hw_4D.this.mCurrentState = 5;
VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
VideoViewH264m3u8Hw_4D.this.mTargetState = 5;
VideoViewH264m3u8Hw_4D.this.mCurrentState = 6;
VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
VideoViewH264m3u8Hw_4D.this.mMediaController.hide();
}
if (VideoViewH264m3u8Hw_4D.this.mOnCompletionListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnCompletionListener.onCompletion(VideoViewH264m3u8Hw_4D.this.mMediaPlayer);
}
VideoViewH264m3u8Hw_4D.this.pause();
VideoViewH264m3u8Hw_4D.this.release(true);
}
};
private Context mContext;
private int mCurrentBufferPercentage;
private int mCurrentState = 0;
private OnDisplayListener mDisplayListener = new OnDisplayListener() {
public void onDisplay(FFMpegPlayer mediaPlayer) {
LogTag.i("硬解onDisplay()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8) 第一帧画面时间 onDisplay()");
if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.DIAPLAY, currentDate);
}
VideoViewH264m3u8Hw_4D.this.mCurrentState = 3;
VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
}
};
private int mDuration;
private OnErrorListener mErrorListener = new OnErrorListener() {
public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {
VideoViewH264m3u8Hw_4D.this.mCurrentState = -1;
VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
VideoViewH264m3u8Hw_4D.this.mTargetState = -1;
if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
VideoViewH264m3u8Hw_4D.this.mMediaController.hide();
}
if (VideoViewH264m3u8Hw_4D.this.mOnErrorListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnErrorListener.onError(VideoViewH264m3u8Hw_4D.this.mMediaPlayer, framework_err, impl_err);
}
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewH264m3u8Hw(硬解m3u8) 播放出错error, framework_err=" + framework_err + ", impl_err=" + impl_err);
if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.ERROR, currentDate);
}
LogTag.i("硬解失败");
LogTag.i("framework_err:" + framework_err);
return true;
}
};
private HashMap<Integer, String> mErrorValues;
private String mHaptFileName = "expendables_3_hapt.hapt";
private int mHapticState;
private HapticContentSDK mHaptics;
private OnHardDecodeErrorListner mHardDecodeErrorListner = new OnHardDecodeErrorListner() {
public void onError(FFMpegPlayer mediaPlayer, int arg1, int arg2) {
LogTag.i("OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + "VideoViewH264m3u8Hw(硬解m3u8) OnHardDecodeErrorListner.onError(): framework_err=" + arg1 + ", impl_err=" + arg2);
if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.HARD_ERROR, currentDate);
}
if (VideoViewH264m3u8Hw_4D.this.mOnHardDecodeErrorListner != null) {
VideoViewH264m3u8Hw_4D.this.mOnHardDecodeErrorListner.onError(mediaPlayer, arg1, arg2);
}
if (VideoViewH264m3u8Hw_4D.this.mOnErrorListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnErrorListener.onError(mediaPlayer, arg1, arg2);
}
HttpRequestManager.getInstance(VideoViewH264m3u8Hw_4D.this.mContext).hardDecodeReport(VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw_4D.this.mUri.toString(), 0, arg1, VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mStreamType, 1);
}
};
private OnInfoListener mInfoListener = new OnInfoListener() {
public boolean onInfo(MediaPlayer mp, int what, int extra) {
LogTag.i("onInfo+++" + what + "extra+++" + extra);
if (VideoViewH264m3u8Hw_4D.this.mOnInfoListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnInfoListener.onInfo(mp, what, extra);
}
return false;
}
};
private boolean mIsMediaBuffering = false;
private boolean mIsMediaPreparing = false;
private boolean mIsSeeked = false;
private String mLastUrl;
private MediaController mMediaController;
private Handler mMediaControlsHandler;
private boolean mMediaLoaded = true;
private FFMpegPlayer mMediaPlayer = null;
private int mMediaState;
private OnBlockListener mOnBlockListener;
private OnBufferingUpdateListener mOnBufferingUpdateListener;
private OnCompletionListener mOnCompletionListener;
private OnErrorListener mOnErrorListener;
private OnHardDecodeErrorListner mOnHardDecodeErrorListner;
private OnInfoListener mOnInfoListener;
private OnMediaStateTimeListener mOnMediaStateTimeListener;
private OnPreparedListener mOnPreparedListener;
private OnSeekCompleteListener mOnSeekCompleteListener;
private OnSuccessListener mOnSuccessListener;
private OnVideoSizeChangedListener mOnVideoSizeChangedListener;
private String mPreplacedsword = "immr@letv23";
private PlayUrl mPlayerUrl;
OnPreparedListener mPreparedListener = new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
LogTag.i("onPrepared()");
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8) onPrepared()");
if (VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.PREPARED, currentDate);
}
VideoViewH264m3u8Hw_4D.this.mCurrentState = 2;
VideoViewH264m3u8Hw_4D.this.StateChange(VideoViewH264m3u8Hw_4D.this.mCurrentState);
VideoViewH264m3u8Hw_4D videoViewH264m3u8Hw_4D = VideoViewH264m3u8Hw_4D.this;
VideoViewH264m3u8Hw_4D videoViewH264m3u8Hw_4D2 = VideoViewH264m3u8Hw_4D.this;
VideoViewH264m3u8Hw_4D.this.mCanSeekForward = true;
videoViewH264m3u8Hw_4D2.mCanSeekBack = true;
videoViewH264m3u8Hw_4D.mCanPause = true;
if (VideoViewH264m3u8Hw_4D.this.mOnPreparedListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnPreparedListener.onPrepared(VideoViewH264m3u8Hw_4D.this.mMediaPlayer);
}
VideoViewH264m3u8Hw_4D.this.mLastUrl = ((FFMpegPlayer) mp).getLastUrl();
VideoViewH264m3u8Hw_4D.this.mVersion = ((FFMpegPlayer) mp).getVersion();
if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
VideoViewH264m3u8Hw_4D.this.mMediaController.setEnabled(true);
}
int seekToPosition = VideoViewH264m3u8Hw_4D.this.mSeekWhenPrepared;
if (seekToPosition != 0) {
VideoViewH264m3u8Hw_4D.this.seekTo(seekToPosition);
}
VideoViewH264m3u8Hw_4D.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264m3u8Hw_4D.this.mVideoHeight = mp.getVideoHeight();
if (VideoViewH264m3u8Hw_4D.this.mVideoWidth == 0 || VideoViewH264m3u8Hw_4D.this.mVideoHeight == 0) {
if (VideoViewH264m3u8Hw_4D.this.mTargetState == 3) {
VideoViewH264m3u8Hw_4D.this.start();
}
} else if (VideoViewH264m3u8Hw_4D.this.mSurfaceWidth != VideoViewH264m3u8Hw_4D.this.mVideoWidth || VideoViewH264m3u8Hw_4D.this.mSurfaceHeight != VideoViewH264m3u8Hw_4D.this.mVideoHeight) {
VideoViewH264m3u8Hw_4D.this.getHolder().setFixedSize(VideoViewH264m3u8Hw_4D.this.mVideoWidth, VideoViewH264m3u8Hw_4D.this.mVideoHeight);
} else if (VideoViewH264m3u8Hw_4D.this.mTargetState == 3) {
VideoViewH264m3u8Hw_4D.this.start();
if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
VideoViewH264m3u8Hw_4D.this.mMediaController.show();
}
} else if (!VideoViewH264m3u8Hw_4D.this.isPlaying() && ((seekToPosition != 0 || VideoViewH264m3u8Hw_4D.this.getCurrentPosition() > 0) && VideoViewH264m3u8Hw_4D.this.mMediaController != null)) {
VideoViewH264m3u8Hw_4D.this.mMediaController.show(0);
}
VideoViewH264m3u8Hw_4D.this.palyer4dContrlHandle(seekToPosition);
}
};
private int mRatioType = -1;
private int mResyncInterval = INITIAL_RESYNC_INTERVAL_MS;
Callback mSHCallback = new Callback() {
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
VideoViewH264m3u8Hw_4D.this.mSurfaceWidth = w;
VideoViewH264m3u8Hw_4D.this.mSurfaceHeight = h;
boolean isValidState;
if (VideoViewH264m3u8Hw_4D.this.mTargetState == 3) {
isValidState = true;
} else {
isValidState = false;
}
boolean hasValidSize;
if (VideoViewH264m3u8Hw_4D.this.mVideoWidth == w && VideoViewH264m3u8Hw_4D.this.mVideoHeight == h) {
hasValidSize = true;
} else {
hasValidSize = false;
}
if (VideoViewH264m3u8Hw_4D.this.mMediaPlayer != null && isValidState && hasValidSize) {
if (VideoViewH264m3u8Hw_4D.this.mSeekWhenPrepared != 0) {
VideoViewH264m3u8Hw_4D.this.seekTo(VideoViewH264m3u8Hw_4D.this.mSeekWhenPrepared);
}
VideoViewH264m3u8Hw_4D.this.start();
if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
VideoViewH264m3u8Hw_4D.this.mMediaController.show();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
if (VideoViewH264m3u8Hw_4D.this.mSurfaceHolder == null) {
VideoViewH264m3u8Hw_4D.this.mSurfaceHolder = holder;
VideoViewH264m3u8Hw_4D.this.openVideo();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
VideoViewH264m3u8Hw_4D.this.mSurfaceHolder = null;
if (VideoViewH264m3u8Hw_4D.this.mMediaController != null) {
VideoViewH264m3u8Hw_4D.this.mMediaController.hide();
}
VideoViewH264m3u8Hw_4D.this.lastSeekWhenDestoryed = VideoViewH264m3u8Hw_4D.this.getCurrentPosition();
VideoViewH264m3u8Hw_4D.this.release(true);
}
};
private int mSavedPos;
private OnSeekCompleteListener mSeekCompleteListener = new OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
if (VideoViewH264m3u8Hw_4D.this.mOnSeekCompleteListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnSeekCompleteListener.onSeekComplete(VideoViewH264m3u8Hw_4D.this.mMediaPlayer);
}
}
};
private int mSeekToPosition;
private int mSeekWhenPrepared;
OnVideoSizeChangedListener mSizeChangedListener = new OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
VideoViewH264m3u8Hw_4D.this.mVideoWidth = mp.getVideoWidth();
VideoViewH264m3u8Hw_4D.this.mVideoHeight = mp.getVideoHeight();
if (!(VideoViewH264m3u8Hw_4D.this.mVideoWidth == 0 || VideoViewH264m3u8Hw_4D.this.mVideoHeight == 0)) {
VideoViewH264m3u8Hw_4D.this.getHolder().setFixedSize(VideoViewH264m3u8Hw_4D.this.mVideoWidth, VideoViewH264m3u8Hw_4D.this.mVideoHeight);
}
if (VideoViewH264m3u8Hw_4D.this.mOnVideoSizeChangedListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnVideoSizeChangedListener.onVideoSizeChanged(mp, VideoViewH264m3u8Hw_4D.this.mVideoWidth, VideoViewH264m3u8Hw_4D.this.mVideoHeight);
}
}
};
private OnSuccessListener mSuccessListener = new OnSuccessListener() {
public void onSuccess() {
if (VideoViewH264m3u8Hw_4D.this.mOnSuccessListener != null) {
VideoViewH264m3u8Hw_4D.this.mOnSuccessListener.onSuccess();
}
LogTag.i("硬解成功");
HttpRequestManager.getInstance(VideoViewH264m3u8Hw_4D.this.mContext).hardDecodeReport(VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mVid, VideoViewH264m3u8Hw_4D.this.mUri.toString(), 1, -1, VideoViewH264m3u8Hw_4D.this.mPlayerUrl.mStreamType, 1);
}
};
private int mSurfaceHeight;
private SurfaceHolder mSurfaceHolder = null;
private int mSurfaceWidth;
private int mTargetState = 0;
private Uri mUri;
private String mUserName = "0f3b69678cce96c0ee8f6c57e31e1273aa0f280ad5519464f52ef3b874a16b6f";
private String mVersion;
private int mVideoHeight;
private OnVideoViewStateChangeListener mVideoViewStateChangeListener;
private int mVideoWidth;
private int mVolumeState;
private Runnable resyncHaptics = new Runnable() {
private int lastPos = 0;
private boolean stalled = false;
public synchronized void run() {
int currPos = VideoViewH264m3u8Hw_4D.this.getCurrentPosition();
if (currPos == this.lastPos || currPos == VideoViewH264m3u8Hw_4D.this.mSeekToPosition) {
System.out.print("test: haptic sync pausing, currPos=" + currPos + "\n");
VideoViewH264m3u8Hw_4D.this.mHaptics.pause();
this.stalled = true;
} else if (this.stalled) {
System.out.print("test: haptics sync resuming, currPos=" + currPos + "\n");
VideoViewH264m3u8Hw_4D.this.mHaptics.resume();
this.stalled = false;
}
this.lastPos = currPos;
if (VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
int returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.update((long) currPos);
if (returnVal != 0) {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics update failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
}
}
if (VideoViewH264m3u8Hw_4D.this.isPlaying()) {
VideoViewH264m3u8Hw_4D.this.getHandler().removeCallbacks(VideoViewH264m3u8Hw_4D.this.resyncHaptics);
VideoViewH264m3u8Hw_4D.this.postDelayed(VideoViewH264m3u8Hw_4D.this.resyncHaptics, (long) VideoViewH264m3u8Hw_4D.this.mResyncInterval);
} else {
this.stalled = false;
}
}
};
private long time = 0;
private clreplaced MediaPreparer implements Runnable {
private boolean mIsPrepared;
private int mProgress;
public MediaPreparer(boolean prepared, int progress) {
this.mIsPrepared = prepared;
this.mProgress = progress;
VideoViewH264m3u8Hw_4D.this.mIsMediaPreparing = true;
}
public void run() {
int curProgress = VideoViewH264m3u8Hw_4D.this.getCurrentPosition();
int delta = curProgress - this.mProgress;
if (VideoViewH264m3u8Hw_4D.this.mMediaState == 3) {
if (VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
VideoViewH264m3u8Hw_4D.this.mHaptics.pause();
}
} else if ((this.mIsPrepared || delta != 0) && !(this.mIsPrepared && delta == 0)) {
int returnVal;
if (this.mIsPrepared) {
if (VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
if (VideoViewH264m3u8Hw_4D.this.mMediaState != 0) {
returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.seek(curProgress);
if (returnVal != 0) {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics seek failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
}
}
System.out.println("test prepare:resume");
returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.resume();
if (returnVal != 0) {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
}
} else {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics was not initialized yet.");
}
VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.resyncHaptics);
VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.changeResyncInterval);
VideoViewH264m3u8Hw_4D.this.mMediaState = 1;
} else {
if (!VideoViewH264m3u8Hw_4D.this.isHapticUsable()) {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics was not initialized yet.");
} else if (VideoViewH264m3u8Hw_4D.this.mMediaLoaded) {
returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.play();
if (returnVal != 0) {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics play failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
}
} else {
System.out.println("test mediaprepare else: resume");
returnVal = VideoViewH264m3u8Hw_4D.this.mHaptics.resume();
if (returnVal != 0) {
Log.e(VideoViewH264m3u8Hw_4D.TAG, "Haptics resume failed with value: " + ((String) VideoViewH264m3u8Hw_4D.this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + VideoViewH264m3u8Hw_4D.this.mHaptics.getSDKStatus());
}
VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.resyncHaptics);
VideoViewH264m3u8Hw_4D.this.post(VideoViewH264m3u8Hw_4D.this.changeResyncInterval);
}
VideoViewH264m3u8Hw_4D.this.mMediaState = 1;
}
VideoViewH264m3u8Hw_4D.this.mIsSeeked = false;
VideoViewH264m3u8Hw_4D.this.mIsMediaPreparing = false;
} else {
VideoViewH264m3u8Hw_4D.this.mMediaControlsHandler.postDelayed(this, (long) VideoViewH264m3u8Hw_4D.MEDIA_PREPARE_INTERVAL_MS);
}
}
}
public VideoViewH264m3u8Hw_4D(Context context) {
super(context);
this.mContext = context;
initVideoView();
}
public VideoViewH264m3u8Hw_4D(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initVideoView();
}
public void setHaptUrl(String url) {
this.hapt = url;
}
private void initVideoView() {
this.mVideoWidth = 0;
this.mVideoHeight = 0;
getHolder().addCallback(this.mSHCallback);
getHolder().setType(3);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
}
public void setVideoPath(String videoPath) {
this.mPlayerUrl = new PlayUrl();
this.mPlayerUrl.setVid(-1);
this.mPlayerUrl.setUrl(videoPath);
this.mPlayerUrl.setStreamType(StreamType.STREAM_TYPE_UNKNOWN);
setVideoURI(Uri.parse(videoPath));
}
public void setVideoPath(String path, Map<String, String> map) {
}
public void setVideoURI(Uri uri) {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8) setVideoURI(), url=" + (uri != null ? uri.toString() : "null"), true);
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.INITPATH, currentDate);
}
this.mUri = uri;
this.mSeekWhenPrepared = 0;
openVideo();
requestLayout();
invalidate();
LogTag.i(TAG, "uri=" + this.mUri.toString());
}
public boolean canPause() {
return this.mCanPause;
}
public boolean canSeekBackward() {
return this.mCanSeekBack;
}
public boolean canSeekForward() {
return this.mCanSeekForward;
}
public int getBufferPercentage() {
if (this.mMediaPlayer != null) {
return this.mCurrentBufferPercentage;
}
return 0;
}
public int getCurrentPosition() {
if (isInPlaybackState()) {
return this.mMediaPlayer.getCurrentPosition();
}
return 0;
}
public int getDuration() {
if (!isInPlaybackState()) {
this.mDuration = -1;
return this.mDuration;
} else if (this.mDuration > 0) {
return this.mDuration;
} else {
this.mDuration = this.mMediaPlayer.getDuration();
return this.mDuration;
}
}
public String getSkipLastURL() {
return this.mLastUrl;
}
public String getVersion() {
return this.mVersion;
}
public int getViewWidth() {
return getLayoutParams().width;
}
public int getViewHeight() {
return getLayoutParams().height;
}
public void start() {
HttpRequestManager.getInstance(this.mContext).requestCapability();
this.mMediaState = -1;
this.mVolumeState = 0;
if (this.mMediaControlsHandler == null) {
this.mMediaControlsHandler = new Handler();
}
if (this.downloadHapt) {
palyer4dInit();
return;
}
if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
LogTag.i("硬解开始播放");
this.mMediaPlayer.start();
init4DMediaPreparer();
}
this.mTargetState = 3;
StateChange(7);
}
public void pause() {
if (isInPlaybackState() && this.mMediaPlayer.isPlaying()) {
this.mMediaPlayer.pause();
this.mCurrentState = 4;
StateChange(this.mCurrentState);
}
this.mTargetState = 4;
}
public void seekTo(int mesc) {
if (isInPlaybackState()) {
this.mMediaPlayer.seekTo(mesc);
this.mSeekWhenPrepared = 0;
this.lastSeekWhenDestoryed = 0;
return;
}
this.mSeekWhenPrepared = mesc;
this.lastSeekWhenDestoryed = 0;
}
public void forward() {
seekTo(getCurrentPosition() + LetvConstant.WIDGET_UPDATE_UI_TIME);
}
public void rewind() {
seekTo(getCurrentPosition() - 15000);
}
public void stopPlayback() {
stopPlayback(false);
}
public void stopPlayback(boolean isRemoveCallBack) {
StateChange(6);
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264m3u8Hw stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
try {
this.mMediaPlayer.stop();
} catch (Exception e) {
LogTag.i(TAG, "hard decode native player has already null");
}
int returnVal = this.mHaptics.stop();
this.mHaptics.dispose();
if (returnVal != 0) {
Log.e(TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
if (isRemoveCallBack) {
getHolder().removeCallback(this.mSHCallback);
}
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264m3u8Hw release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
try {
this.mMediaPlayer.release();
} catch (Exception e2) {
LogTag.i(TAG, "hard decode native player has already null");
}
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
this.mTargetState = 0;
setVisibility(4);
}
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(this.mVideoWidth, widthMeasureSpec);
int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
if (this.mVideoWidth > 0 && this.mVideoHeight > 0) {
switch(this.mRatioType) {
case -1:
if (this.mVideoWidth * height <= this.mVideoHeight * width) {
if (this.mVideoWidth * height < this.mVideoHeight * width) {
width = (this.mVideoWidth * height) / this.mVideoHeight;
break;
}
}
height = (this.mVideoHeight * width) / this.mVideoWidth;
break;
break;
case 1:
if (height * 4 <= width * 3) {
if (height * 4 < width * 3) {
width = (height * 4) / 3;
break;
}
}
height = (width * 3) / 4;
break;
break;
case 2:
if (height * 16 <= width * 9) {
if (height * 16 < width * 9) {
width = (height * 16) / 9;
break;
}
}
height = (width * 9) / 16;
break;
break;
}
}
setMeasuredDimension(width, height);
}
public void adjust(int type) {
this.mRatioType = type;
invalateScreenSize();
}
private void invalateScreenSize() {
setLayoutParams((LayoutParams) getLayoutParams());
}
public int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch(specMode) {
case Integer.MIN_VALUE:
return Math.min(desiredSize, specSize);
case 0:
return desiredSize;
case 1073741824:
return specSize;
default:
return result;
}
}
public boolean isInPlaybackState() {
return (this.mMediaPlayer == null || this.mCurrentState == -1 || this.mCurrentState == 0 || this.mCurrentState == 1) ? false : true;
}
private void openVideo() {
if (this.mUri == null || this.mSurfaceHolder == null) {
setVisibility(0);
return;
}
release(false);
try {
String currentDate = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDate + " VideoViewH264m3u8Hw(硬解m3u8) 创建FFMpegPlayer对象");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.CREATE, currentDate);
}
this.mMediaPlayer = new FFMpegPlayer(this.mContext);
this.mMediaPlayer.setHardwareDecode(1);
this.mMediaPlayer.setHwCapbility(CodecWrapper.getProfile(), CodecWrapper.getAVCLevel());
this.mMediaPlayer.setOnPreparedListener(this.mPreparedListener);
this.mMediaPlayer.setOnVideoSizeChangedListener(this.mSizeChangedListener);
this.mDuration = -1;
this.mMediaPlayer.setOnCompletionListener(this.mCompletionListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnSuccessListener(this.mSuccessListener);
this.mMediaPlayer.setOnErrorListener(this.mErrorListener);
this.mMediaPlayer.setOnSeekCompleteListener(this.mSeekCompleteListener);
this.mMediaPlayer.setOnBufferingUpdateListener(this.mBufferingUpdateListener);
this.mMediaPlayer.setOnInfoListener(this.mInfoListener);
this.mMediaPlayer.setOnBlockListener(this.mBlockListener);
this.mMediaPlayer.setOnDisplayListener(this.mDisplayListener);
this.mMediaPlayer.setOnHardDecoddErrorListener(this.mHardDecodeErrorListner);
this.mCurrentBufferPercentage = 0;
this.mMediaPlayer.setDataSource(this.mContext, this.mUri);
this.mMediaPlayer.setDisplay(this.mSurfaceHolder);
this.mMediaPlayer.setAudioStreamType(3);
this.mMediaPlayer.setScreenOnWhilePlaying(true);
this.mMediaPlayer.prepareAsync();
this.mCurrentState = 1;
attachMediaController();
} catch (IllegalStateException ex) {
LogTag.i("Unable to open content: " + this.mUri + " ,IllegalArgumentException=" + ex);
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IllegalArgumentException e) {
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
} catch (IOException e2) {
this.mCurrentState = -1;
StateChange(this.mCurrentState);
this.mTargetState = -1;
this.mErrorListener.onError(this.mMediaPlayer, 1, 0);
}
}
public void setMediaController(MediaController controller) {
if (this.mMediaController != null) {
this.mMediaController.hide();
}
this.mMediaController = controller;
attachMediaController();
}
private void attachMediaController() {
if (this.mMediaPlayer != null && this.mMediaController != null) {
View anchorView;
this.mMediaController.setMediaPlayer(this);
if (getParent() instanceof View) {
anchorView = (View) getParent();
} else {
anchorView = this;
}
this.mMediaController.setAnchorView(anchorView);
this.mMediaController.setEnabled(isInPlaybackState());
}
}
private void setVideoViewScale(int width, int height) {
LayoutParams lp = (LayoutParams) getLayoutParams();
lp.height = height;
lp.width = width;
setLayoutParams(lp);
}
private void release(boolean cleartargetstate) {
if (this.mMediaPlayer != null) {
String currentDateStop = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateStop + "VideoViewH264m3u8Hw stop()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.STOP, currentDateStop);
}
this.mMediaPlayer.stop();
int returnVal = this.mHaptics.stop();
Log.e(TAG, "Haptic dispose " + this.mHaptics.getSDKStatus());
this.mHaptics.dispose();
if (returnVal != 0) {
Log.e(TAG, "Haptics stop failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
String currentDateRelease = Tools.getCurrentDate();
LetvMediaPlayerManager.getInstance().writePlayLog("系统当前时间: " + currentDateRelease + "VideoViewH264m3u8Hw release()");
if (this.mOnMediaStateTimeListener != null) {
this.mOnMediaStateTimeListener.onMediaStateTime(MeidaStateType.RELEASE, currentDateRelease);
}
this.mMediaPlayer.release();
this.mMediaPlayer = null;
this.mCurrentState = 0;
StateChange(this.mCurrentState);
if (cleartargetstate) {
this.mTargetState = 0;
}
}
}
public boolean onTouchEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onTrackballEvent(MotionEvent ev) {
if (isInPlaybackState() && this.mMediaController != null) {
toggleMediaControlsVisiblity();
}
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean isKeyCodeSupported;
if (keyCode == 4 || keyCode == 24 || keyCode == 25 || keyCode == 82 || keyCode == 5 || keyCode == 6) {
isKeyCodeSupported = false;
} else {
isKeyCodeSupported = true;
}
if (isInPlaybackState() && isKeyCodeSupported && this.mMediaController != null) {
if (keyCode == 79 || keyCode == 85) {
if (this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
return true;
}
start();
this.mMediaController.hide();
return true;
} else if (keyCode == 86 && this.mMediaPlayer.isPlaying()) {
pause();
this.mMediaController.show();
} else {
toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
private void toggleMediaControlsVisiblity() {
if (this.mMediaController.isShowing()) {
this.mMediaController.hide();
} else {
this.mMediaController.show();
}
}
public boolean isPlaying() {
return isInPlaybackState() && this.mMediaPlayer.isPlaying();
}
public boolean isPaused() {
return this.mCurrentState == 4;
}
public void setOnSeekCompleteListener(OnSeekCompleteListener l) {
this.mOnSeekCompleteListener = l;
}
public int getLastSeekWhenDestoryed() {
return this.lastSeekWhenDestoryed;
}
public int getAudioSessionId() {
return 0;
}
public boolean isEnforcementWait() {
return this.enforcementWait;
}
public void setEnforcementWait(boolean enforcementWait) {
this.enforcementWait = enforcementWait;
}
public boolean isEnforcementPause() {
return this.enforcementPause;
}
public void setEnforcementPause(boolean enforcementPause) {
this.enforcementPause = enforcementPause;
}
public View getView() {
return this;
}
private void StateChange(int mCurrentState) {
if (this.mVideoViewStateChangeListener != null) {
this.mVideoViewStateChangeListener.onChange(mCurrentState);
}
}
public void setVideoViewStateChangeListener(OnVideoViewStateChangeListener listener) {
this.mVideoViewStateChangeListener = listener;
}
public void setOnInfoListener(OnInfoListener l) {
this.mOnInfoListener = l;
}
public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) {
this.mOnVideoSizeChangedListener = l;
}
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l) {
this.mOnBufferingUpdateListener = l;
}
public void setOnPreparedListener(OnPreparedListener l) {
this.mOnPreparedListener = l;
}
public void setOnCompletionListener(OnCompletionListener l) {
this.mOnCompletionListener = l;
}
public void setOnErrorListener(OnErrorListener l) {
this.mOnErrorListener = l;
}
public void setOnSuccessListener(OnSuccessListener l) {
this.mOnSuccessListener = l;
}
public void setVideoPlayUrl(PlayUrl url) {
this.mPlayerUrl = url;
setVideoURI(Uri.parse(this.mPlayerUrl.getUrl()));
}
public void setOnAdNumberListener(OnAdNumberListener l) {
}
public void setCacheSize(int video_size, int audio_size, int picture_size, int startpic_size) {
}
public void setOnBlockListener(OnBlockListener l) {
this.mOnBlockListener = l;
}
public void setOnMediaStateTimeListener(OnMediaStateTimeListener l) {
this.mOnMediaStateTimeListener = l;
}
public void setOnHardDecodeErrorListener(OnHardDecodeErrorListner l) {
this.mOnHardDecodeErrorListner = l;
}
public void initHapticValues() {
this.mErrorValues = new HashMap();
this.mErrorValues.put(Integer.valueOf(0), SUCCESS);
this.mErrorValues.put(Integer.valueOf(-1), INVALID);
this.mErrorValues.put(Integer.valueOf(-2), INACCESSIBLE_URL);
this.mErrorValues.put(Integer.valueOf(-3), PERMISSION_DENIED);
this.mErrorValues.put(Integer.valueOf(-4), MALFORMED_URL);
this.mErrorValues.put(Integer.valueOf(-5), UNSUPPORTED_PROTOCOL);
}
private boolean isHapticUsable() {
return this.mHapticState == 1;
}
public void palyer4dInit() {
this.mMediaState = -1;
this.mVolumeState = 0;
initHapticValues();
this.mHaptics = HapticContentSDKFactory.GetNewSDKInstance(0, this.mContext, this.mUserName, this.mPreplacedsword, HapticContentSDK.DEFAULT_DNS);
if (this.mHaptics == null) {
Log.e(TAG, "Could not get new Haptic SDK Instance!");
this.mHapticState = -1;
} else {
this.mHapticState = 0;
}
this.mSavedPos = 0;
this.mMediaControlsHandler = new Handler();
if (this.mHapticState == 0) {
int returnVal = this.mHaptics.openHaptics(this.hapt);
if (returnVal == 0) {
this.mHapticState = 1;
this.downloadHapt = false;
} else {
Log.e(TAG, "Haptics open failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
if (!(this.enforcementWait || this.enforcementPause || !isInPlaybackState())) {
this.mMediaPlayer.start();
System.out.println("test is start");
this.mCurrentState = 3;
StateChange(this.mCurrentState);
if (this.mMediaLoaded) {
this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
} else {
this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
}
}
this.mTargetState = 3;
StateChange(7);
}
public void init4DMediaPreparer() {
if (this.mMediaLoaded) {
this.mMediaControlsHandler.post(new MediaPreparer(true, getCurrentPosition()));
} else {
this.mMediaControlsHandler.post(new MediaPreparer(false, getCurrentPosition()));
}
}
public void palyer4dContrlHandle(int seekToPosition) {
postDelayed(this.resyncHaptics, (long) INITIAL_RESYNC_INTERVAL_MS);
postDelayed(this.changeResyncInterval, (long) INITIAL_RESYNC_INTERVAL_MS);
this.mSavedPos = seekToPosition;
if (this.mSavedPos == 0) {
this.mMediaControlsHandler.post(new MediaPreparer(false, 0));
} else {
this.mMediaState = 2;
}
}
public void setHapticMute(boolean disable) {
int returnVal;
if (disable) {
if (isHapticUsable()) {
returnVal = this.mHaptics.mute();
if (returnVal == 0) {
this.mVolumeState = 1;
} else {
Log.e(TAG, "Haptics mute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
} else if (isHapticUsable()) {
returnVal = this.mHaptics.unmute();
if (returnVal == 0) {
this.mVolumeState = 0;
} else {
Log.e(TAG, "Haptics unmute failed with value: " + ((String) this.mErrorValues.get(Integer.valueOf(returnVal))) + ". Current Haptic SDK state: " + this.mHaptics.getSDKStatus());
}
}
}
}
14
Source : VideoActivity.java
with MIT License
from crm416
with MIT License
from crm416
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
// Load the appropriate URL in the VideoView.
final String youtubeId = getIntent().getStringExtra(Keys.YOUTUBE_ID);
final String videoUrl = UrlBuilder.forYoutubeId(youtubeId);
final VideoView videoView = (VideoView) findViewById(R.id.video_view);
videoView.setVideoPath(videoUrl);
videoView.start();
// Add a MediaController, which gives us play/pause, etc.
final MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
}
13
Source : VideoPlayerActivity.java
with MIT License
from CommonsLab
with MIT License
from CommonsLab
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_player);
videoView = (VideoView) findViewById(R.id.videoView);
loadingScreen = (FrameLayout) findViewById(R.id.progressBarContainer);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
loadingScreen.setVisibility(View.GONE);
}
});
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
int playerLocation = -1;
if (savedInstanceState != null) {
if (localVideoURI == null) {
contribution = savedInstanceState.getParcelable("Contribution");
thumbnailURL = savedInstanceState.getString("ThumbnailURL");
} else {
localVideoURI = savedInstanceState.getString("VideoURI");
}
playerLocation = savedInstanceState.getInt("Location");
} else {
contribution = getIntent().getExtras().getParcelable("Contribution");
thumbnailURL = getIntent().getExtras().getString("ThumbnailURL");
localVideoURI = getIntent().getExtras().getString("LocalVideoURI");
}
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
if (localVideoURI == null) {
if (contribution != null) {
Uri uri = Uri.parse(contribution.getUrl());
videoView.setMediaController(mediaController);
videoView.setVideoURI(uri);
if (playerLocation != -1)
videoView.seekTo(playerLocation);
videoView.start();
} else
Toast.makeText(this, R.string.an_error_accourred, Toast.LENGTH_SHORT).show();
} else {
// Playing local video
Uri uri = Uri.parse(localVideoURI);
videoView.setMediaController(mediaController);
videoView.setVideoURI(uri);
if (playerLocation != -1)
videoView.seekTo(playerLocation);
videoView.start();
}
}
See More Examples