大家好,我希望您一切都好。我被困在这里约2,3天。我建立了一个应用程序,我们可以从内部和外部存储中删除重复的文件。我能够从电话和外部存储中获取所有图像,视频,歌曲和文件。但是现在我希望获得的每个图像的大小从storage.so列表中,所以我无法解决这些问题。请帮助我,我被困在这里约2,3天。预先感谢。
MainActivity
package com.deitel.duplicatefileremoverapp.VideoContent;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.deitel.duplicatefileremoverapp.R;
import java.io.File;
import java.util.ArrayList;
public class VideoMainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private VideoRecyclerViewAdapter videoRecyclerViewAdapter;
File video_storage;
File video_size;
String[] allpath;
String[] allpathsize;
ArrayList<Long> videomodelclassArrayList=new ArrayList<Long>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_main);
recyclerView = findViewById(R.id.video_recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
videoRecyclerViewAdapter = new VideoRecyclerViewAdapter(this);
recyclerView.setAdapter(videoRecyclerViewAdapter);
videoRecyclerViewAdapter.notifyDataSetChanged();
//Load video data here
allpath = VideoStorageUtil.getStorageDirectories(this);
for (String path : allpath) {
video_storage = new File(path);
VideoMethod.load_Directory_files(video_storage);
}
}
}
VideoMethod.class
package com.deitel.duplicatefileremoverapp.VideoContent;
import android.util.Log;
import java.io.File;
import static androidx.constraintlayout.widget.Constraints.TAG;
public class VideoMethod {
public static void load_Directory_files(File file) {
File[] filelist = file.listFiles();
if (filelist != null && filelist.length > 0) {
for (int i = 0; i < filelist.length; i++) {
if (filelist[i].isDirectory()) {
load_Directory_files(filelist[i]);
} else {
String name = filelist[i].getName().toLowerCase();
long size = filelist[i].length()/1024;
Log.d(TAG, "load_Directory_files:"+size);
for (String extension : VideoConstant.videoextention) {
// Check the type of file
if (name.endsWith(extension)) {
VideoConstant.allmedialist.add(filelist[i]);
//when we found file
break;
}
}
}
}
}
}
}
VideoRecyclerAdapter.Class
package com.deitel.duplicatefileremoverapp.VideoContent;
import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.deitel.duplicatefileremoverapp.R;
import java.io.File;
public class VideoRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
// Constructore
VideoRecyclerViewAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_file_list, parent, false);
return new FileLayoutHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
((FileLayoutHolder) holder).title.setText(VideoConstant.allmedialist.get(position).getName());**(Here is error)**
**Line No.39**(FileLayoutHolder) holder).size.setText(VideoConstant.allmedialist.get(position).length);
Uri uri = Uri.fromFile(VideoConstant.allmedialist.get(position));
Glide.with(context).load(uri).thumbnail(0.1f).into(((FileLayoutHolder) holder).thumbnail);
}
@Override
public int getItemCount() {
return VideoConstant.allmedialist.size();
}
class FileLayoutHolder extends RecyclerView.ViewHolder {
ImageView thumbnail;
TextView title;
TextView size;
public FileLayoutHolder(@NonNull View itemView) {
super(itemView);
thumbnail = itemView.findViewById(R.id.video_thumbnail);
title = itemView.findViewById(R.id.video_name);
size = itemView.findViewById(R.id.video_size);
}
}
}
VideoStorageUtil.Class
package com.deitel.duplicatefileremoverapp.VideoContent;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.text.TextUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Helper class for getting all storages directories in an Android device
* <a href="https://stackoverflow.com/a/40582634/3940133">Solution of this problem</a>
* Consider to use
* <a href="https://developer.android.com/guide/topics/providers/document-provider">StorageAccessFramework(SAF)</>
* if your min SDK version is 19 and your requirement is just for browse and open documents, images, and other files
*
* @author Dmitriy Lozenko, HendraWD
*/
public class VideoStorageUtil {
// Primary physical SD-CARD (not emulated)
private static final String EXTERNAL_STORAGE = System.getenv("EXTERNAL_STORAGE");
// All Secondary SD-CARDs (all exclude primary) separated by File.pathSeparator, i.e: ":", ";"
private static final String SECONDARY_STORAGES = System.getenv("SECONDARY_STORAGE");
// Primary emulated SD-CARD
private static final String EMULATED_STORAGE_TARGET = System.getenv("EMULATED_STORAGE_TARGET");
// PhysicalPaths based on phone model
@SuppressLint("SdCardPath")
@SuppressWarnings("SpellCheckingInspection")
private static final String[] KNOWN_PHYSICAL_PATHS = new String[]{
"/storage/sdcard0",
"/storage/sdcard1", //Motorola Xoom
"/storage/extsdcard", //Samsung SGS3
"/storage/sdcard0/external_sdcard", //User request
"/mnt/extsdcard",
"/mnt/sdcard/external_sd", //Samsung galaxy family
"/mnt/sdcard/ext_sd",
"/mnt/external_sd",
"/mnt/media_rw/sdcard1", //4.4.2 on CyanogenMod S3
"/removable/microsd", //Asus transformer prime
"/mnt/emmc",
"/storage/external_SD", //LG
"/storage/ext_sd", //HTC One Max
"/storage/removable/sdcard1", //Sony Xperia Z1
"/data/sdext",
"/data/sdext2",
"/data/sdext3",
"/data/sdext4",
"/sdcard1", //Sony Xperia Z
"/sdcard2", //HTC One M8s
"/storage/microsd" //ASUS ZenFone 2
};
public static String[] getStorageDirectories(Context context) {
// Final set of paths
final Set<String> availableDirectoriesSet = new HashSet<>();
if (!TextUtils.isEmpty(EMULATED_STORAGE_TARGET)) {
// Device has an emulated storage
availableDirectoriesSet.add(getEmulatedStorageTarget());
} else {
// Device doesn't have an emulated storage
availableDirectoriesSet.addAll(getExternalStorage(context));
}
// Add all secondary storages
Collections.addAll(availableDirectoriesSet, getAllSecondaryStorages());
String[] storagesArray = new String[availableDirectoriesSet.size()];
return availableDirectoriesSet.toArray(storagesArray);
}
private static Set<String> getExternalStorage(Context context) {
final Set<String> availableDirectoriesSet = new HashSet<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Solution of empty raw emulated storage for android version >= marshmallow
// because the EXTERNAL_STORAGE become something like: "/Storage/A5F9-15F4",
// so we can't access it directly
File[] files = getExternalFilesDirs(context, null);
for (File file : files) {
if (file != null) {
String applicationSpecificAbsolutePath = file.getAbsolutePath();
String rootPath = applicationSpecificAbsolutePath.substring(
0,
applicationSpecificAbsolutePath.indexOf("Android/data")
);
availableDirectoriesSet.add(rootPath);
}
}
} else {
if (TextUtils.isEmpty(EXTERNAL_STORAGE)) {
availableDirectoriesSet.addAll(getAvailablePhysicalPaths());
} else {
// Device has physical external storage; use plain paths.
availableDirectoriesSet.add(EXTERNAL_STORAGE);
}
}
return availableDirectoriesSet;
}
private static String getEmulatedStorageTarget() {
String rawStorageId = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
// External storage paths should have storageId in the last segment
// i.e: "/storage/emulated/storageId" where storageId is 0, 1, 2, ...
final String path = Environment.getExternalStorageDirectory().getAbsolutePath();
final String[] folders = path.split(File.separator);
final String lastSegment = folders[folders.length - 1];
if (!TextUtils.isEmpty(lastSegment) && TextUtils.isDigitsOnly(lastSegment)) {
rawStorageId = lastSegment;
}
}
if (TextUtils.isEmpty(rawStorageId)) {
return EMULATED_STORAGE_TARGET;
} else {
return EMULATED_STORAGE_TARGET + File.separator + rawStorageId;
}
}
private static String[] getAllSecondaryStorages() {
if (!TextUtils.isEmpty(SECONDARY_STORAGES)) {
// All Secondary SD-CARDs split into array
return SECONDARY_STORAGES.split(File.pathSeparator);
}
return new String[0];
}
private static List<String> getAvailablePhysicalPaths() {
List<String> availablePhysicalPaths = new ArrayList<>();
for (String physicalPath : KNOWN_PHYSICAL_PATHS) {
File file = new File(physicalPath);
if (file.exists()) {
availablePhysicalPaths.add(physicalPath);
}
}
return availablePhysicalPaths;
}
private static File[] getExternalFilesDirs(Context context, String type) {
if (Build.VERSION.SDK_INT >= 19) {
return context.getExternalFilesDirs(type);
} else {
return new File[]{context.getExternalFilesDir(type)};
}
}
}
@@ shani,作为获取比较图像大小的替代方法,如何获取每个图像(或任何项目)的哈希并将其与其他图像进行比较以查找重复项?