This commit is contained in:
2021-02-26 18:29:46 +08:00
commit a35d7977d5
62 changed files with 2170 additions and 0 deletions

View File

@@ -0,0 +1,137 @@
package com.uiui.videoplayer.activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.uiui.videoplayer.CustomJzvd.JzvdStdAssert;
import com.uiui.videoplayer.CustomJzvd.JzvdStdTikTok;
import com.uiui.videoplayer.R;
import com.uiui.videoplayer.adapter.TikTokRecyclerViewAdapter;
import com.uiui.videoplayer.base.ViewPagerLayoutManager;
import com.uiui.videoplayer.listener.OnViewPagerListener;
import java.util.ArrayList;
import java.util.List;
import cn.jzvd.Jzvd;
public class ActivityTikTok extends AppCompatActivity {
private RecyclerView rvTiktok;
private TikTokRecyclerViewAdapter mAdapter;
private ViewPagerLayoutManager mViewPagerLayoutManager;
private int mCurrentPosition = -1;
private int position = 0;
private List<String> videoPath = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_tiktok);
Intent intent = getIntent();
if (null != intent) {
position = intent.getIntExtra("position", 0);
videoPath = intent.getStringArrayListExtra("list");
}
rvTiktok = findViewById(R.id.rv_tiktok);
mAdapter = new TikTokRecyclerViewAdapter(this,videoPath );
mViewPagerLayoutManager = new ViewPagerLayoutManager(this, OrientationHelper.VERTICAL);
rvTiktok.setLayoutManager(mViewPagerLayoutManager);
rvTiktok.setAdapter(mAdapter);
rvTiktok.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
}
});
mViewPagerLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
@Override
public void onInitComplete() {
//自动播放第一条
autoPlayVideo(position);
}
@Override
public void onPageRelease(boolean isNext, int position) {
if (mCurrentPosition == position) {
Jzvd.releaseAllVideos();
}
}
@Override
public void onPageSelected(int position, boolean isBottom) {
if (mCurrentPosition == position) {
return;
}
autoPlayVideo(position);
mCurrentPosition = position;
}
});
rvTiktok.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
}
@Override
public void onChildViewDetachedFromWindow(View view) {
Jzvd jzvd = view.findViewById(R.id.videoplayer);
if (jzvd != null && Jzvd.CURRENT_JZVD != null && jzvd.jzDataSource != null &&
jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.getCurrentUrl())) {
if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) {
Jzvd.releaseAllVideos();
}
}
}
});
}
private void autoPlayVideo(int postion) {
if (rvTiktok == null || rvTiktok.getChildAt(0) == null) {
return;
}
JzvdStdAssert player = rvTiktok.getChildAt(0).findViewById(R.id.videoplayer);
if (player != null) {
player.startVideoAfterPreloading();
}
}
@Override
public void onBackPressed() {
if (Jzvd.backPress()) {
return;
}
super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
Jzvd.releaseAllVideos();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}

View File

@@ -0,0 +1,195 @@
package com.uiui.videoplayer.activity;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import com.uiui.videoplayer.R;
import com.uiui.videoplayer.base.RecycleGridLayoutManager;
import com.uiui.videoplayer.base.SpacesItemDecoration;
import com.uiui.videoplayer.adapter.VideoAdapter;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_PERMISSION_CODE = 200;
String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
private RecyclerView recyclerView;
private VideoAdapter adapter;
private RecycleGridLayoutManager mManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkSelfPermission();
initView();
// String rootPath = Environment.getExternalStorageDirectory().getPath() + File.separator;
// traverseFolder(rootPath);
ScanTask scanTask = new ScanTask();
scanTask.execute();
}
private void initView() {
recyclerView = findViewById(R.id.recyclerView);
}
// private String[] getFolder(String folderPath) {
//
// }
public void traverseFolder(String path) {
int fileNum = 0, folderNum = 0;
File file = new File(path);
if (file.exists()) {
LinkedList<File> list = new LinkedList<File>();
File[] files = file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {
Log.e("traverseFolder1", "文件夹:" + file2.getAbsolutePath());
list.add(file2);
folderNum++;
} else {
Log.e("traverseFolder1", "文件:" + file2.getAbsolutePath());
fileNum++;
}
}
File temp_file;
while (!list.isEmpty()) {
temp_file = list.removeFirst();
files = temp_file.listFiles();
for (File file2 : files) {
if (file2.isDirectory()) {
Log.e("traverseFolder2", "文件夹:" + file2.getAbsolutePath());
list.add(file2);
folderNum++;
} else {
Log.e("traverseFolder2", "文件:" + file2.getAbsolutePath());
fileNum++;
}
}
}
} else {
Log.e("traverseFolder1", "文件不存在!");
}
Log.e("traverseFolder1", "文件夹共有:" + folderNum + ",文件共有:" + fileNum);
}
private static final String[] extension = new String[]{
".3gp", ".flv", ".mkv", ".mov", ".mp4", ".webm"
};
private static boolean isVideoFormat(String filePath) {
for (String s : extension) {
if (filePath.endsWith(s)) {
return true;
}
}
return false;
}
public class ScanTask extends AsyncTask<Void, String, List<String>> {
@Override
protected List<String> doInBackground(Void... voids) {
List<String> fileList = new ArrayList<>();
String rootPath = Environment.getExternalStorageDirectory().getPath() + File.separator;
File file = new File(rootPath);
if (file.exists()) {
LinkedList<File> list = new LinkedList<File>();
File[] files = file.listFiles();
for (File file2 : files) {
publishProgress(file2.getAbsolutePath());
if (file2.isDirectory()) {
list.add(file2);
} else {
if (isVideoFormat(file2.getAbsolutePath())) {
fileList.add(file2.getAbsolutePath());
}
}
}
File temp_file;
while (!list.isEmpty()) {
temp_file = list.removeFirst();
files = temp_file.listFiles();
for (File file2 : files) {
publishProgress(file2.getAbsolutePath());
if (file2.isDirectory()) {
list.add(file2);
} else {
if (isVideoFormat(file2.getAbsolutePath())) {
fileList.add(file2.getAbsolutePath());
}
}
}
}
} else {
Log.e("traverseFolder1", "文件不存在!");
}
return fileList;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
// Log.e("ScanTask", "onProgressUpdate: " + values[0]);
}
@Override
protected void onPostExecute(List<String> strings) {
super.onPostExecute(strings);
Log.e("ScanTask", "onPostExecute: " + strings);
adapter = new VideoAdapter(MainActivity.this, strings);
mManager = new RecycleGridLayoutManager(MainActivity.this, 2);
recyclerView.setLayoutManager(mManager);
recyclerView.setNestedScrollingEnabled(false);
recyclerView.addItemDecoration(new SpacesItemDecoration(getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x),
getResources().getDimensionPixelSize(R.dimen.PX1x), getResources().getDimensionPixelSize(R.dimen.PX1x)));
((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
// recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
recyclerView.setAdapter(adapter);
}
}
private void checkSelfPermission() {
List<String> mPermissionList = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (String s : permissions) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
mPermissionList.add(s);
}
}
if (mPermissionList.size() > 0) {//有权限没有通过,需要申请
ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
//当然权限多了建议使用Switch不必纠结于此
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
}
}
}
}

View File

@@ -0,0 +1,16 @@
package com.uiui.videoplayer.activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.uiui.videoplayer.R;
public class PlayActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play);
}
}