From ad67fef3fd658ad472b2df077947a4abbd92744e Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Sat, 13 Mar 2021 14:00:57 +0800 Subject: [PATCH] =?UTF-8?q?version:=20update:=20fix=20bug:=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../videoplayer/activity/ActivityTikTok.java | 12 +- .../videoplayer/activity/MainActivity.java | 67 +++++- .../adapter/TikTokRecyclerViewAdapter.java | 6 +- .../uiui/videoplayer/base/CustomDialog.java | 6 +- .../com/uiui/videoplayer/utils/SPUtils.java | 194 ++++++++++++++++++ .../main/res/drawable-hdpi/menu_selected.png | Bin 0 -> 1621 bytes .../main/res/drawable-hdpi/menu_settings.png | Bin 0 -> 2250 bytes .../main/res/layout-land/custom_dialog.xml | 6 +- app/src/main/res/menu/main.xml | 23 ++- 9 files changed, 296 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/uiui/videoplayer/utils/SPUtils.java create mode 100644 app/src/main/res/drawable-hdpi/menu_selected.png create mode 100644 app/src/main/res/drawable-hdpi/menu_settings.png diff --git a/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java b/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java index 991c9c0..bd85164 100644 --- a/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java +++ b/app/src/main/java/com/uiui/videoplayer/activity/ActivityTikTok.java @@ -21,6 +21,7 @@ import com.uiui.videoplayer.R; import com.uiui.videoplayer.adapter.TikTokRecyclerViewAdapter; import com.uiui.videoplayer.base.ViewPagerLayoutManager; import com.uiui.videoplayer.listener.OnViewPagerListener; +import com.uiui.videoplayer.utils.SPUtils; import com.uiui.videoplayer.utils.ToastUtil; import java.util.ArrayList; @@ -63,8 +64,15 @@ public class ActivityTikTok extends AppCompatActivity { if (mCurrentPosition + 1 < videoPath.size()) { rvTiktok.smoothScrollToPosition(mCurrentPosition + 1); } else { - ToastUtil.show("播放完成"); - finish(); + int singleLoop = (int) SPUtils.get(ActivityTikTok.this, "loop", 0); + if (singleLoop == 0) { + ToastUtil.show("播放完成"); + finish(); + } else { + rvTiktok.scrollToPosition(0); + mCurrentPosition = 0; + ToastUtil.show("列表结束,开始播放第一个视频"); + } } }); mAdapter.setOrientationChangeListener(new TikTokRecyclerViewAdapter.onOrientationChangeListener() { diff --git a/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java b/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java index 9f91b8a..adf9f51 100644 --- a/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java +++ b/app/src/main/java/com/uiui/videoplayer/activity/MainActivity.java @@ -35,6 +35,7 @@ import com.uiui.videoplayer.adapter.VideoAdapter; import com.uiui.videoplayer.base.CustomDialog; import com.uiui.videoplayer.base.RecycleGridLayoutManager; import com.uiui.videoplayer.base.SpacesItemDecoration; +import com.uiui.videoplayer.utils.SPUtils; import com.uiui.videoplayer.utils.ToastUtil; import java.io.File; @@ -321,7 +322,7 @@ public class MainActivity extends AppCompatActivity { for (String s : permissions) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { mPermissionList.add(s); - }else { + } else { ScanTask scanTask = new ScanTask(); scanTask.execute(); } @@ -341,10 +342,10 @@ public class MainActivity extends AppCompatActivity { ScanTask scanTask = new ScanTask(); scanTask.execute(); } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) { - if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)){ + if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { ToastUtil.show("需要存储空间权限才能正常使用软件"); checkSelfPermission(); - }else { + } else { ToastUtil.show("请打开存储空间权限后使用软件"); Intent intent = new Intent(); intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); @@ -356,11 +357,15 @@ public class MainActivity extends AppCompatActivity { } } - + private MenuItem refresh, single_loop, loop; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); + refresh = menu.findItem(R.id.refresh); + single_loop = menu.findItem(R.id.single_loop); + loop = menu.findItem(R.id.loop); + updateMenuIcon(); return super.onCreateOptionsMenu(menu); } @@ -375,6 +380,9 @@ public class MainActivity extends AppCompatActivity { public boolean onOptionsItemSelected(MenuItem item) { //返回按钮点击事件 switch (item.getItemId()) { + case R.id.setting: + + break; case android.R.id.home: if (System.currentTimeMillis() - mPreClickTime > 1000) { ToastUtil.show("再按一次,退出"); @@ -388,12 +396,61 @@ public class MainActivity extends AppCompatActivity { ScanTask scanTask = new ScanTask(); scanTask.execute(); break; + case R.id.single_loop: + if (null != single_loop) { + int singleLoop = (int) SPUtils.get(MainActivity.this, "single_loop", 0); + if (singleLoop == 0) { + SPUtils.put(MainActivity.this, "single_loop", 1); + SPUtils.put(MainActivity.this, "loop", 0); + single_loop.setIcon(R.drawable.menu_selected); + } else { + SPUtils.put(MainActivity.this, "single_loop", 0); + single_loop.setIcon(null); + } + } + break; + case R.id.loop: + if (null != loop) { + int singleLoop = (int) SPUtils.get(MainActivity.this, "loop", 0); + if (singleLoop == 0) { + SPUtils.put(MainActivity.this, "single_loop", 0); + SPUtils.put(MainActivity.this, "loop", 1); + loop.setIcon(R.drawable.menu_selected); + } else { + SPUtils.put(MainActivity.this, "loop", 0); + loop.setIcon(null); + } + } + break; + default: + break; } - + updateMenuIcon(); return super.onOptionsItemSelected(item); } private long mPreClickTime; + private void updateMenuIcon() { + if (null != refresh) { + + } + if (null != single_loop) { + int singleLoop = (int) SPUtils.get(MainActivity.this, "single_loop", 0); + if (singleLoop == 0) { + single_loop.setIcon(null); + } else { + single_loop.setIcon(R.drawable.menu_selected); + } + } + if (null != loop) { + int singleLoop = (int) SPUtils.get(MainActivity.this, "loop", 0); + if (singleLoop == 0) { + loop.setIcon(null); + } else { + loop.setIcon(R.drawable.menu_selected); + } + } + } } diff --git a/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java b/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java index e184bcb..4942d0f 100644 --- a/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java +++ b/app/src/main/java/com/uiui/videoplayer/adapter/TikTokRecyclerViewAdapter.java @@ -15,6 +15,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.uiui.videoplayer.CustomJzvd.JzvdStdAssert; import com.uiui.videoplayer.R; +import com.uiui.videoplayer.activity.MainActivity; +import com.uiui.videoplayer.utils.SPUtils; import com.uiui.videoplayer.utils.Utils; @@ -68,6 +70,7 @@ public class TikTokRecyclerViewAdapter extends RecyclerView.Adapter) emitter -> { diff --git a/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java b/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java index 5b3c34f..fc9ec61 100644 --- a/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java +++ b/app/src/main/java/com/uiui/videoplayer/base/CustomDialog.java @@ -252,8 +252,8 @@ public class CustomDialog extends Dialog { @Override public void dismiss() { super.dismiss(); - Intent intent = new Intent(mContext, MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); +// Intent intent = new Intent(mContext, MainActivity.class); +// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// mContext.startActivity(intent); } } diff --git a/app/src/main/java/com/uiui/videoplayer/utils/SPUtils.java b/app/src/main/java/com/uiui/videoplayer/utils/SPUtils.java new file mode 100644 index 0000000..cb2626c --- /dev/null +++ b/app/src/main/java/com/uiui/videoplayer/utils/SPUtils.java @@ -0,0 +1,194 @@ +package com.uiui.videoplayer.utils; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.util.Base64; +import android.widget.ImageView; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; + +/** + * 作者 mjsheng + * 日期 2018/10/9 18:41 + * 邮箱 501802639@qq.com + * 来自: + */ + +public class SPUtils { + /** + * 保存在手机里面的文件名 + */ + public static final String FILE_NAME = "share_data"; + + /** + * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 + */ + public static void put(Context context, String key, Object object) { + + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + + if (object instanceof String) { + editor.putString(key, (String) object); + } else if (object instanceof Integer) { + editor.putInt(key, (Integer) object); + } else if (object instanceof Boolean) { + editor.putBoolean(key, (Boolean) object); + } else if (object instanceof Float) { + editor.putFloat(key, (Float) object); + } else if (object instanceof Long) { + editor.putLong(key, (Long) object); + } else { + editor.putString(key, object.toString()); + } + + SharedPreferencesCompat.apply(editor); + } + + /** + * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 + */ + public static Object get(Context context, String key, Object defaultObject) { + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, + Context.MODE_PRIVATE); + + if (defaultObject instanceof String) { + return sp.getString(key, (String) defaultObject); + } else if (defaultObject instanceof Integer) { + return sp.getInt(key, (Integer) defaultObject); + } else if (defaultObject instanceof Boolean) { + return sp.getBoolean(key, (Boolean) defaultObject); + } else if (defaultObject instanceof Float) { + return sp.getFloat(key, (Float) defaultObject); + } else if (defaultObject instanceof Long) { + return sp.getLong(key, (Long) defaultObject); + } + + return null; + } + + /** + * 移除某个key值已经对应的值 + */ + public static void remove(Context context, String key) { + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.remove(key); + SharedPreferencesCompat.apply(editor); + } + + /** + * 清除所有数据 + */ + public static void clear(Context context) { + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.clear(); + SharedPreferencesCompat.apply(editor); + } + + + + /** + * 查询某个key是否已经存在 + */ + public static boolean contains(Context context, String key) { + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, + Context.MODE_PRIVATE); + return sp.contains(key); + } + + /** + * 返回所有的键值对 + */ + public static Map getAll(Context context) { + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, + Context.MODE_PRIVATE); + return sp.getAll(); + } + + + /** + * 保存图片到SharedPreferences + * + * @param mContext + * @param imageView + */ + public static void putImage(Context mContext, String key, ImageView imageView) { + BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); + Bitmap bitmap = drawable.getBitmap(); + // 将Bitmap压缩成字节数组输出流 + ByteArrayOutputStream byStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 80, byStream); + // 利用Base64将我们的字节数组输出流转换成String + byte[] byteArray = byStream.toByteArray(); + String imgString = new String(Base64.encodeToString(byteArray, Base64.DEFAULT)); + // 将String保存shareUtils + SPUtils.put(mContext, key, imgString); + } + + /** + * 从SharedPreferences读取图片 + * + * @param mContext + * @param imageView + */ + public static Bitmap getImage(Context mContext, String key, ImageView imageView) { + String imgString = (String) SPUtils.get(mContext, key, ""); + if (!imgString.equals("")) { + // 利用Base64将我们string转换 + byte[] byteArray = Base64.decode(imgString, Base64.DEFAULT); + ByteArrayInputStream byStream = new ByteArrayInputStream(byteArray); + // 生成bitmap + return BitmapFactory.decodeStream(byStream); + } + return null; + } + + /** + * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 + */ + private static class SharedPreferencesCompat { + private static final Method sApplyMethod = findApplyMethod(); + + /** + * 反射查找apply的方法 + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + private static Method findApplyMethod() { + try { + Class clz = SharedPreferences.Editor.class; + return clz.getMethod("apply"); + } catch (NoSuchMethodException e) { + } + + return null; + } + + /** + * 如果找到则使用apply执行,否则使用commit + */ + public static void apply(SharedPreferences.Editor editor) { + try { + if (sApplyMethod != null) { + sApplyMethod.invoke(editor); + return; + } + } catch (IllegalArgumentException e) { + } catch (IllegalAccessException e) { + } catch (InvocationTargetException e) { + } + editor.commit(); + } + } +} diff --git a/app/src/main/res/drawable-hdpi/menu_selected.png b/app/src/main/res/drawable-hdpi/menu_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..4090146957f6cc3d02449533f3841ac4779e1c76 GIT binary patch literal 1621 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 @@ -76,7 +76,7 @@