bugfixes:修复不能下载视频
update:修改下载列表样式,文件位置统一
This commit is contained in:
2026-02-06 15:39:11 +08:00
parent 3eb281f930
commit d5ba38e04e
13 changed files with 223 additions and 45 deletions

View File

@@ -1,6 +1,5 @@
package com.hainaos.vc.activity.category.local;
import android.os.Environment;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
@@ -44,7 +43,7 @@ public class LocalCategoryViewModel extends BaseViewModel<ActivityCategoryLocalB
public MutableLiveData<ArrayList<LocalVideoInfo>> mLocalVideoInfosData = new MutableLiveData<>();
public void getViedoList(String dir) {
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "haina" + File.separator + dir);
File file = new File(FileUtils.getHainaVideoPath(getCtx()) + dir);
Observable
.fromCallable(new Callable<List<String>>() {
@Override

View File

@@ -3,8 +3,11 @@ package com.hainaos.vc.activity.category.online;
import android.content.Intent;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.hainaos.vc.R;
@@ -20,7 +23,6 @@ import com.hainaos.vc.utils.FileUtils;
import com.hainaos.vc.utils.ScreenUtils;
import com.hainaos.vc.view.CustomDialog;
import com.hainaos.vc.view.EquallyDividedItemDecoration;
import com.hainaos.vc.view.RecycleGridLayoutManager;
import com.hjq.toast.Toaster;
import java.io.File;
@@ -50,7 +52,9 @@ public class CategoryVideoActivity extends BaseMvvmActivity<CategoryVideoViewMod
@Override
protected void initView() {
RecycleGridLayoutManager manager = new RecycleGridLayoutManager(CategoryVideoActivity.this, SPAN_COUNT);
// RecycleGridLayoutManager manager = new RecycleGridLayoutManager(CategoryVideoActivity.this, SPAN_COUNT);
LinearLayoutManager manager = new LinearLayoutManager(CategoryVideoActivity.this);
manager.setOrientation(RecyclerView.VERTICAL);
mViewDataBinding.rvVideo.setLayoutManager(manager);
EquallyDividedItemDecoration equallyDividedItemDecoration = new EquallyDividedItemDecoration(SPAN_COUNT, ScreenUtils.dip2px(CategoryVideoActivity.this, 1));
@@ -68,6 +72,16 @@ public class CategoryVideoActivity extends BaseMvvmActivity<CategoryVideoViewMod
mViewModel.getVideoList(mCategoryInfo.getUuid(), mPasswd);
}
});
mViewDataBinding.rvVideo.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// canScrollVertically(-1) 检查是否可以往下拉(即是否不在顶部)
// 如果返回 true说明不在顶部此时禁用 SwipeRefreshLayout 的下拉手势
mViewDataBinding.swipeRefreshLayout.setEnabled(!recyclerView.canScrollVertically(-1));
}
});
}
@Override
@@ -106,6 +120,7 @@ public class CategoryVideoActivity extends BaseMvvmActivity<CategoryVideoViewMod
} else {
mViewDataBinding.clNodata.setVisibility(View.GONE);
mViewDataBinding.rvVideo.setVisibility(View.VISIBLE);
mViewDataBinding.tvTotal.setText(String.format(getString(R.string.video_total), categoryVideoInfos.size()));
}
} else {
Toaster.show(baseResponse.msg);

View File

@@ -1,6 +1,5 @@
package com.hainaos.vc.activity.category.online;
import android.os.Environment;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
@@ -45,7 +44,7 @@ public class CategoryVideoViewModel extends BaseViewModel<ActivityCategoryVideoB
@Deprecated
public void getViedoList(String dir) {
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "haina" + File.separator + dir);
File file = new File(FileUtils.getHainaVideoPath(getCtx()) + dir);
if (file.exists()) {
String[] strings = file.list();
Log.e(TAG, "getViedoList: " + Arrays.toString(strings));

View File

@@ -27,6 +27,7 @@ import com.hainaos.vc.base.BaseFragmentPagerAdapter;
import com.hainaos.vc.base.mvvm.BaseMvvmActivity;
import com.hainaos.vc.bean.uiuios.AppUpdateInfo;
import com.hainaos.vc.config.CommonConfig;
import com.hainaos.vc.config.Permissions;
import com.hainaos.vc.databinding.ActivityMainBinding;
import com.hainaos.vc.dialog.PermissionsDialog;
import com.hainaos.vc.dialog.PrivacyPolicyDialog;
@@ -61,11 +62,6 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
private static final int REQUEST_PERMISSION_CODE = 200;
String[] permissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
@Override
public boolean setNightMode() {
return true;
@@ -205,7 +201,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
}
private void checkSelfPermission() {
if (XXPermissions.isGranted(MainActivity.this, permissions)) {
if (XXPermissions.isGranted(MainActivity.this, Permissions.STORAGE_PERMISSIONS)) {
initDatas();
} else {
showPermissionsDialog();
@@ -226,7 +222,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
public void onGranted() {
mPermissionsDialog.dismiss();
XXPermissions.with(MainActivity.this)
.permission(permissions)
.permission(Permissions.STORAGE_PERMISSIONS)
.request(new OnPermissionCallback() {
@Override
public void onGranted(@androidx.annotation.NonNull List<String> permissions, boolean allGranted) {

View File

@@ -1,6 +1,7 @@
package com.hainaos.vc.adapter;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
@@ -11,6 +12,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
@@ -23,9 +25,16 @@ import com.arialyy.aria.core.task.DownloadTask;
import com.hainaos.vc.R;
import com.hainaos.vc.activity.preview.VideoPreviewActivity;
import com.hainaos.vc.bean.CategoryVideoInfo;
import com.hainaos.vc.config.Permissions;
import com.hainaos.vc.dialog.PermissionsDialog;
import com.hainaos.vc.utils.FileUtils;
import com.hainaos.vc.utils.GlideLoadUtils;
import com.hainaos.vc.utils.TimeUtils;
import com.hainaos.vc.utils.ToastUtil;
import com.hainaos.vc.view.CustomDialog;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.XXPermissions;
import com.hjq.toast.Toaster;
import com.shehuan.niv.NiceImageView;
import java.io.File;
@@ -75,15 +84,31 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
String fileName = FileUtils.getFileNamefromURL(url);
File file = new File(FileUtils.getHainaVideoPath(mContext) + mDirName + File.separator + fileName);
if (file.exists()) {
holder.iv_status.setVisibility(View.GONE);
holder.tv_download.setText("删除");
holder.tv_download.setBackground(mContext.getDrawable(R.drawable.bg_delete_button));
} else {
holder.iv_status.setVisibility(View.VISIBLE);
holder.tv_download.setText("下载");
holder.tv_download.setBackground(mContext.getDrawable(R.drawable.bg_download_button));
}
String cover = categoryVideoInfo.getCover();
GlideLoadUtils.getInstance().glideLoad(mContext, cover, holder.video_image);
holder.duration.setText(TimeUtils.TimeFormat(categoryVideoInfo.getDuration() * 1000));
holder.tv_download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (file.exists()) {
showDialog(file.getAbsolutePath(), position);
} else {
if (XXPermissions.isGranted(mContext, Permissions.STORAGE_PERMISSIONS)) {
FileUtils.ariaDownload(mContext, mDirName, url, md5);
} else {
showPermissionsDialog(mContext);
}
}
}
});
holder.video_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -93,12 +118,86 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
intent.putExtra("url", file.getAbsolutePath());
mContext.startActivity(intent);
} else {
FileUtils.ariaDownload(mContext, mDirName, url, md5);
Toaster.show("请先下载视频");
}
}
});
}
private PermissionsDialog mPermissionsDialog;
private void showPermissionsDialog(Context context) {
if (mPermissionsDialog != null) {
mPermissionsDialog.dismiss();
mPermissionsDialog = null;
}
mPermissionsDialog = new PermissionsDialog(context);
mPermissionsDialog.setPermissionsCallback(new PermissionsDialog.PermissionsCallback() {
@Override
public void onGranted() {
mPermissionsDialog.dismiss();
XXPermissions.with(context)
.permission(Permissions.STORAGE_PERMISSIONS)
.request(new OnPermissionCallback() {
@Override
public void onGranted(@androidx.annotation.NonNull List<String> permissions, boolean allGranted) {
Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted);
if (!allGranted) {
Toast.makeText(context, "存储权限未正常授予", Toast.LENGTH_SHORT).show();
return;
}
Log.e(TAG, "onGranted: 获取存储权限成功");
}
@Override
public void onDenied(@androidx.annotation.NonNull List<String> permissions, boolean doNotAskAgain) {
Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain);
if (doNotAskAgain) {
Toast.makeText(context, "被永久拒绝授权,请手动授予存储权限", Toast.LENGTH_SHORT).show();
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(context, permissions);
} else {
Log.e(TAG, "onGranted: 获取存储权限失败");
}
}
});
}
@Override
public void onDenied() {
mPermissionsDialog.dismiss();
}
});
mPermissionsDialog.setContent("本软件需要获取存储权限保存照片和视频,授权之后才可以正常使用");
mPermissionsDialog.show();
}
private void showDialog(String path, int position) {
CustomDialog dialog = new CustomDialog(mContext);
dialog.setTitle("删除文件")
.setMessage("确定要删除文件 " + FileUtils.getFileName(path) + "")
.setPositive("确定")
.setNegtive("取消")
.setOnClickBottomListener(new CustomDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
dialog.dismiss();
File file = new File(path);
if (file.delete()) {
removeItem(position);
ToastUtil.show("删除成功");
} else {
ToastUtil.show("删除失败,检查权限是否开启");
}
}
@Override
public void onNegtiveClick() {
dialog.dismiss();
}
});
dialog.show();
}
public void removeItem(int position) {
if (null != mLocalVideoInfos.get(position)) {
@@ -123,16 +222,16 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
}
static class VideoHolder extends RecyclerView.ViewHolder {
NiceImageView video_image, iv_status;
TextView title, duration;
NiceImageView video_image;
TextView title, duration, tv_download;
ConstraintLayout root;
public VideoHolder(@NonNull View itemView) {
super(itemView);
video_image = itemView.findViewById(R.id.video_image);
iv_status = itemView.findViewById(R.id.iv_status);
title = itemView.findViewById(R.id.title_text);
duration = itemView.findViewById(R.id.duration);
tv_download = itemView.findViewById(R.id.tv_download);
root = itemView.findViewById(R.id.root);
}
@@ -180,7 +279,7 @@ public class CategoryVideoAdapter extends RecyclerView.Adapter<CategoryVideoAdap
try {
Log.e(TAG, "taskFail: e " + e.getMessage());
} catch (Exception ex) {
Log.e(TAG, "taskFail: ex " + e.getMessage());
Log.e(TAG, "taskFail: ex " + ex.getMessage());
}
notifyDataSetChanged();

View File

@@ -0,0 +1,10 @@
package com.hainaos.vc.config;
import android.Manifest;
public class Permissions {
public static final String[] STORAGE_PERMISSIONS = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
}

View File

@@ -6,6 +6,8 @@ import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.ContextCompat;
import com.arialyy.aria.core.Aria;
import com.hainaos.vc.bean.AppInfo;
import com.hainaos.vc.bean.uiuios.AppUpdateInfo;
@@ -76,7 +78,8 @@ public class FileUtils {
}
public static String getHainaVideoPath(Context context) {
String path = Environment.getExternalStorageDirectory() + File.separator + "haina";
// String path = Environment.getExternalStorageDirectory() + File.separator + "haina";
String path = ContextCompat.getExternalFilesDirs(context, Environment.DIRECTORY_DOWNLOADS)[0].getAbsolutePath() + File.separator + "haina";
return path + File.separator;
}
@@ -90,7 +93,7 @@ public class FileUtils {
String downLoadPath = getHainaVideoPath(context) + dirName + File.separator;
File dirFile = new File(downLoadPath);
if (!dirFile.exists()) {
dirFile.mkdirs();
Log.e(TAG, "ariaDownload: mkdirs = " + dirFile.mkdirs());
}
String fileName = getFileNamefromURL(url);
File file = new File(downLoadPath + fileName);

View File

@@ -79,9 +79,9 @@ public class LenovoCsdkUtil {
}
public String getSerial() {
if (BuildConfig.DEBUG) {
return "T98005H1024GB32GB";
}
// if (BuildConfig.DEBUG) {
// return "T98005H1024GB32GB";
// }
String sn = mCSDKManager.getDeviceInfo(2);
return sn;

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/red" />
<corners android:radius="16dp" />
<padding
android:bottom="4dp"
android:left="12dp"
android:right="12dp"
android:top="4dp" />
</shape>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#0084FF" />
<corners android:radius="16dp" />
<padding
android:bottom="4dp"
android:left="12dp"
android:right="12dp"
android:top="4dp" />
</shape>

View File

@@ -28,6 +28,7 @@
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:onClick="@{click::exit}"
@@ -51,18 +52,34 @@
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:text="@{title}"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/tv_total"
app:layout_constraintStart_toEndOf="@+id/constraintLayout2"
app:layout_constraintTop_toTopOf="parent"
tools:text="海纳美业学习机" />
<TextView
android:id="@+id/tv_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="视频:0个"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/video_total" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
@@ -87,9 +104,9 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_nodata"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"

View File

@@ -10,41 +10,50 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_height="88dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.shehuan.niv.NiceImageView
android:id="@+id/video_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="8dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:is_cover_src="true" />
app:is_cover_src="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.shehuan.niv.NiceImageView
android:id="@+id/iv_status"
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/status_download"
<TextView
android:id="@+id/tv_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:background="@drawable/bg_download_button"
android:text="下载"
android:textColor="@color/white"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/title_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="4dp"
android:layout_marginTop="4dp"
android:layout_marginHorizontal="8dp"
android:maxLines="3"
android:textColor="@color/white"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/tv_download"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/video_image"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.15"
tools:text="标题" />
<TextView

View File

@@ -11,4 +11,5 @@
<string name="privacy_agreement_content">\t\t\t\t请你务必审慎阅读、充分理解“用户协议”包括但不限于为了向你提供即时通讯内容分享等服务
我们需要收集你的设备信息、操作日志等个人信息。
\n\t\t\t\t你可阅读《用户协议》了解详细信息。如你同意请点击“同意”开始接受我们的服务</string>
<string name="video_total">视频:%d个</string>
</resources>