}
}
Runnable mPlayRun = new Runnable() {
@Override
public void run() {
Log.d(MainActivity.class.getSimpleName(), "run: ");
mCurrentMediaPlayer.pause();
mNextMediaPlayer.pause();
mNextMediaPlayer.reset();
try {
if (mIndex == 0) {
String path = paths[mIndex % paths.length];
Log.d(MainActivity.class.getSimpleName(), "path1: " + path);
mIndex++;
mCurrentMediaPlayer.setDataSource(MainActivity.this, Uri.parse(path));
mCurrentMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer player) {
Log.d(MainActivity.class.getSimpleName(), “start 1”);
mCurrentMediaPlayer.start();
mVideoSurface.setVisibility(View.GONE);
}
});
mCurrentMediaPlayer.prepareAsync();
mNextMediaPlayer.setDataSource(MainActivity.this, Uri.parse(path));
mNextMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mNextMediaPlayer.start();
}
});
mNextMediaPlayer.prepareAsync();
} else {
String path = paths[mIndex % paths.length];
mIndex++;
Log.d(MainActivity.class.getSimpleName(), "path2: " + path);
mNextMediaPlayer.setDataSource(MainActivity.this, Uri.parse(path));
mNextMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
mNextMediaPlayer.start();
Log.d(MainActivity.class.getSimpleName(), “start 2”);
}
});
mNextMediaPlayer.prepareAsync();
}
} catch (Exception e) {
e.printStackTrace();
}
mHandler.postDelayed(mPlayRun, 10000); // 第一个视频10s钟
}
};
class VideoSurfaceHodlerCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(
SurfaceHolder holder,
int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCurrentMediaPlayer.setDisplay(mVideoSurface.getHolder());
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
class NextVideoSurfaceHodlerCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(
SurfaceHolder holder,
int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mNextMediaPlayer.setDisplay(mNextSurface.getHolder());
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
private static final int PERMISSION_REQUEST_CODE = 200;
private boolean checkPermission() {
return ContextCompat.checkSelfPermission(this, WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
;
}
private void requestPermissionAndContinue() {
if (ContextCompat.checkSelfPermission(this, WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, WRITE_EXTERNAL_STORAGE)
&& ActivityCompat.shouldShowRequestPermissionRationale(this, READ_EXTERNAL_STORAGE)) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setCancelable(true);
alertBuilder.setTitle(“权限申请”);
alertBuilder.setMessage(“获取对应权限”);
alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{WRITE_EXTERNAL_STORAGE
, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
Log.e(“”, “permission denied, show dialog”);
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{WRITE_EXTERNAL_STORAGE,
READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}
} else {
startAction();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (permissions.length > 0 && grantResults.length > 0) {
boolean flag = true;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
flag = false;
}
}
if (flag) {
startAction();
} else {
finish();
}
} else {
finish();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
private void startAction() {
mFrame = new FrameLayout(this);
setContentView(mFrame);
mHandler = new Handler();
mCurrentMediaPlayer = new MediaPlayer();
mNextMediaPlayer = new MediaPlayer();
mVideoSurface = new SurfaceView(this);
mVideoSurface.getHolder().addCallback(new VideoSurfaceHodlerCallback());
mNextSurface = new SurfaceView(this);
mNextSurface.getHolder().addCallback(new NextVideoSurfaceHodlerCallback());
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
1080,
面试宝典
面试必问知识点、BATJ历年历年面试真题+解析
学习经验总结
(一)调整好心态
心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。
(二)时间挤一挤,制定好计划
一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。另外,制定好学习计划也是很有必要的,有逻辑有条理的复习,先查漏补缺,然后再系统复习,这样才能够做到事半功倍,效果才会立竿见影。
(三)不断学习技术知识,更新自己的知识储备
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。**要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。**对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
更新自己的知识储备**
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。**要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。**对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!