Commit ef567503 authored by wanglei's avatar wanglei

图片卡顿

parent 1fa11825
...@@ -97,4 +97,6 @@ dependencies { ...@@ -97,4 +97,6 @@ dependencies {
// compile(name:'trustlook_cleanjunk_sdk_release_3.0.4.20240322',ext:'aar') // compile(name:'trustlook_cleanjunk_sdk_release_3.0.4.20240322',ext:'aar')
implementation files('libs/trustlook_cleanjunk_sdk_release_3.0.4.20240322.aar') implementation files('libs/trustlook_cleanjunk_sdk_release_3.0.4.20240322.aar')
implementation files('libs/cloudscan_sdk_5.0.5.20240306.aar') implementation files('libs/cloudscan_sdk_5.0.5.20240306.aar')
implementation("com.github.bumptech.glide:glide:4.15.1")
} }
...@@ -13,6 +13,8 @@ import androidx.lifecycle.ViewModelProvider ...@@ -13,6 +13,8 @@ import androidx.lifecycle.ViewModelProvider
import com.kongzue.dialogx.dialogs.WaitDialog import com.kongzue.dialogx.dialogs.WaitDialog
import com.xm.test.myfilemaster.R import com.xm.test.myfilemaster.R
import com.xm.test.myfilemaster.adapter.MediaAdapter import com.xm.test.myfilemaster.adapter.MediaAdapter
import com.xm.test.myfilemaster.adapter.MediaAdapter2
import com.xm.test.myfilemaster.databinding.ActivityMediaBinding
import com.xm.test.myfilemaster.model.FileBean import com.xm.test.myfilemaster.model.FileBean
import com.xm.test.myfilemaster.util.FileUtil import com.xm.test.myfilemaster.util.FileUtil
...@@ -31,8 +33,11 @@ class MediaActivity : AppCompatActivity() { ...@@ -31,8 +33,11 @@ class MediaActivity : AppCompatActivity() {
private lateinit var mTitleTv: TextView private lateinit var mTitleTv: TextView
lateinit var mItemCheckedArray: SparseBooleanArray lateinit var mItemCheckedArray: SparseBooleanArray
private var mItemDataList = ArrayList<FileBean>() private var mItemDataList = ArrayList<FileBean>()
private var mItemAdapter: MediaAdapter? =null private lateinit var binding: ActivityMediaBinding
// private var mItemAdapter: MediaAdapter? = null
private var mItemAdapter: MediaAdapter2? = null
private var mDataList: ArrayList<String> = ArrayList<String>() private var mDataList: ArrayList<String> = ArrayList<String>()
private var mCheckedDataList: ArrayList<String> = ArrayList<String>() private var mCheckedDataList: ArrayList<String> = ArrayList<String>()
...@@ -40,27 +45,28 @@ class MediaActivity : AppCompatActivity() { ...@@ -40,27 +45,28 @@ class MediaActivity : AppCompatActivity() {
private lateinit var mModel: BaseActivityViewModel private lateinit var mModel: BaseActivityViewModel
val mFileTypeBeanList : ArrayList<String> = ArrayList() val mFileTypeBeanList: ArrayList<String> = ArrayList()
var mShowBeanData: ArrayList<String> = ArrayList() var mShowBeanData: ArrayList<String> = ArrayList()
var mStartNumber: Int = 0 var mStartNumber: Int = 0
var mIsCheckClick = false var mIsCheckClick = false
companion object{ companion object {
var isClickEditBtn = false var isClickEditBtn = false
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_media) binding = ActivityMediaBinding.inflate(layoutInflater)
setContentView(binding.root)
initView() initView()
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun initView() { private fun initView() {
mGridView = findViewById(R.id.image_item_grid) // mGridView = findViewById(R.id.image_item_grid)
mTitleBar = findViewById(R.id.title_bar) mTitleBar = findViewById(R.id.title_bar)
mSelectBar = findViewById(R.id.switch_and_select_layout) mSelectBar = findViewById(R.id.switch_and_select_layout)
// mScrollView = findViewById(R.id.grid_view_scroll) // mScrollView = findViewById(R.id.grid_view_scroll)
...@@ -81,17 +87,19 @@ class MediaActivity : AppCompatActivity() { ...@@ -81,17 +87,19 @@ class MediaActivity : AppCompatActivity() {
mItemCheckedArray = SparseBooleanArray() mItemCheckedArray = SparseBooleanArray()
val fileType = intent.getStringExtra("fileType").toString() val fileType = intent.getStringExtra("fileType").toString()
mItemAdapter = MediaAdapter(mItemDataList, this, mItemCheckedArray, fileType, 118) // mItemAdapter = MediaAdapter(mItemDataList, this, mItemCheckedArray, fileType, 118)
mGridView.adapter = mItemAdapter mItemAdapter = MediaAdapter2()
// mGridView.adapter = mItemAdapter
binding.imageItemGrid.adapter = mItemAdapter
Thread(Runnable { Thread(Runnable {
WaitDialog.show("please wait..") WaitDialog.show("please wait..")
mItemDataList = FileUtil.getMediaFiles(this, fileType, 20) mItemDataList = FileUtil.getMediaFiles(this, fileType, 20)
runOnUiThread { runOnUiThread {
mItemAdapter?.setData(mItemDataList)
WaitDialog.dismiss() WaitDialog.dismiss()
for (fileBean in mItemDataList){ for (fileBean in mItemDataList) {
mDataList.add(fileBean.filePath) mDataList.add(fileBean.filePath)
} }
mItemAdapter?.setData(mItemDataList)
} }
}).start() }).start()
...@@ -131,31 +139,31 @@ class MediaActivity : AppCompatActivity() { ...@@ -131,31 +139,31 @@ class MediaActivity : AppCompatActivity() {
} }
} }
private fun setOnGridViewItemClickListener(){ private fun setOnGridViewItemClickListener() {
mGridView.setOnItemClickListener { parent, view, position, id -> // mGridView.setOnItemClickListener { parent, view, position, id ->
if (isClickEditBtn){ // if (isClickEditBtn) {
updateCheckBoxStatus(view, position) // updateCheckBoxStatus(view, position)
}else{ // } else {
//TODO 点击进入图片或视频播放 // //TODO 点击进入图片或视频播放
} // }
} // }
} }
private fun setStateCheckedMap(isChecked: Boolean){ private fun setStateCheckedMap(isChecked: Boolean) {
for(i in mDataList.indices){ for (i in mDataList.indices) {
mItemCheckedArray.put(i, isChecked) mItemCheckedArray.put(i, isChecked)
mGridView.setItemChecked(i, isChecked) mGridView.setItemChecked(i, isChecked)
} }
} }
private fun updateCheckBoxStatus(view: View, position: Int){ private fun updateCheckBoxStatus(view: View, position: Int) {
val viewHolder = view.tag as MediaAdapter.ViewHolder val viewHolder = view.tag as MediaAdapter.ViewHolder
viewHolder.checkedBox.toggle() viewHolder.checkedBox.toggle()
mGridView.setItemChecked(position, viewHolder.checkedBox.isChecked) mGridView.setItemChecked(position, viewHolder.checkedBox.isChecked)
mItemCheckedArray.put(position, viewHolder.checkedBox.isChecked) mItemCheckedArray.put(position, viewHolder.checkedBox.isChecked)
if (viewHolder.checkedBox.isChecked){ if (viewHolder.checkedBox.isChecked) {
mCheckedDataList.add(mDataList[position]) mCheckedDataList.add(mDataList[position])
}else{ } else {
mCheckedDataList.remove(mDataList[position]) mCheckedDataList.remove(mDataList[position])
} }
mItemAdapter?.notifyDataSetChanged() mItemAdapter?.notifyDataSetChanged()
...@@ -163,14 +171,14 @@ class MediaActivity : AppCompatActivity() { ...@@ -163,14 +171,14 @@ class MediaActivity : AppCompatActivity() {
mModel.setNumber(mCheckedNumber) mModel.setNumber(mCheckedNumber)
} }
private fun selectAll(){ private fun selectAll() {
mCheckedDataList.clear() mCheckedDataList.clear()
mCheckedNumber = if (mIsCheckClick){ mCheckedNumber = if (mIsCheckClick) {
setStateCheckedMap( true) setStateCheckedMap(true)
mCheckedDataList.addAll(mDataList) mCheckedDataList.addAll(mDataList)
mCheckedDataList.size mCheckedDataList.size
}else{ } else {
setStateCheckedMap( false) setStateCheckedMap(false)
0 0
} }
mModel.setNumber(mCheckedNumber) mModel.setNumber(mCheckedNumber)
...@@ -179,9 +187,9 @@ class MediaActivity : AppCompatActivity() { ...@@ -179,9 +187,9 @@ class MediaActivity : AppCompatActivity() {
override fun onBackPressed() { override fun onBackPressed() {
mItemAdapter?.notifyDataSetChanged() mItemAdapter?.notifyDataSetChanged()
if (isClickEditBtn){ if (isClickEditBtn) {
cancelBtn() cancelBtn()
}else{ } else {
super.onBackPressed() super.onBackPressed()
} }
} }
......
package com.xm.test.myfilemaster.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.util.SparseBooleanArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.CheckBox
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.xm.test.myfilemaster.R
import com.xm.test.myfilemaster.activity.MediaActivity
import com.xm.test.myfilemaster.databinding.ItemImageVideoBinding
import com.xm.test.myfilemaster.model.FileBean
import com.xm.test.myfilemaster.util.FileUtil
class MediaAdapter2 : RecyclerView.Adapter<MediaAdapter2.CCC>() {
private var mListData: ArrayList<FileBean> = arrayListOf()
fun Int.inflate(parent: ViewGroup, attachToRoot: Boolean = false): View {
return LayoutInflater.from(parent.context).inflate(this, parent, attachToRoot)
}
class CCC(view: View) : RecyclerView.ViewHolder(view) {
val binding = ItemImageVideoBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CCC {
return CCC(R.layout.item_image_video.inflate(parent))
}
override fun getItemCount(): Int {
return mListData.size
}
override fun onBindViewHolder(holder: CCC, position: Int) {
val data = mListData[position]
val context = holder.binding.root.context
Glide.with(context).load(data.filePath).centerCrop().into(holder.binding.ivMedia)
}
@SuppressLint("NotifyDataSetChanged")
fun setData(datas: List<FileBean>) {
mListData.clear()
mListData.addAll(datas)
notifyDataSetChanged()
}
}
\ No newline at end of file
...@@ -23,7 +23,7 @@ object FileUtil { ...@@ -23,7 +23,7 @@ object FileUtil {
const val TEXT_MIME_TYPE = "text/plain" const val TEXT_MIME_TYPE = "text/plain"
const val ZIP_MIME_TYPE = "application/zip" const val ZIP_MIME_TYPE = "application/zip"
const val RAR_MIME_TYPE = "application/x-rar-compressed" const val RAR_MIME_TYPE = "application/x-rar-compressed"
const val ZIP_7Z_MIME_TYPE ="application/x-7z-compressed" const val ZIP_7Z_MIME_TYPE = "application/x-7z-compressed"
const val PDF_MIME_TYPE = "application/pdf" const val PDF_MIME_TYPE = "application/pdf"
const val WORD_MIME_TYPE = "application/msword" const val WORD_MIME_TYPE = "application/msword"
const val EXCEL_MIME_TYPE = "application/vnd.ms-excel" const val EXCEL_MIME_TYPE = "application/vnd.ms-excel"
...@@ -32,7 +32,7 @@ object FileUtil { ...@@ -32,7 +32,7 @@ object FileUtil {
const val MP3_MIME_TYPE = "audio/mpeg" const val MP3_MIME_TYPE = "audio/mpeg"
const val WAV_MIME_TYPE = "audio/x-wav" const val WAV_MIME_TYPE = "audio/x-wav"
fun getFileCreateTime(filePath: String) : Triple<Int, Int, Int>{ fun getFileCreateTime(filePath: String): Triple<Int, Int, Int> {
val folder = File(filePath) val folder = File(filePath)
val fileCreateTime = folder.lastModified() val fileCreateTime = folder.lastModified()
val date = Date(fileCreateTime) val date = Date(fileCreateTime)
...@@ -41,14 +41,14 @@ object FileUtil { ...@@ -41,14 +41,14 @@ object FileUtil {
return Triple(yearMonthDay[0].toInt(), yearMonthDay[1].toInt(), yearMonthDay[2].toInt()) return Triple(yearMonthDay[0].toInt(), yearMonthDay[1].toInt(), yearMonthDay[2].toInt())
} }
fun createDirectory(path: String, fileDirName: String): FileBean{ fun createDirectory(path: String, fileDirName: String): FileBean {
val fileBean = FileBean() val fileBean = FileBean()
val file = File(path + "/" + fileDirName) val file = File(path + "/" + fileDirName)
fileBean.filePath = "-1" fileBean.filePath = "-1"
if (!file.exists()){ if (!file.exists()) {
val mkdirs = file.mkdirs() val mkdirs = file.mkdirs()
if (mkdirs){ if (mkdirs) {
if (file.isDirectory){ if (file.isDirectory) {
fileBean.fileName = file.name fileBean.fileName = file.name
fileBean.filePath = file.path fileBean.filePath = file.path
fileBean.fileSize = file.length() fileBean.fileSize = file.length()
...@@ -63,8 +63,8 @@ object FileUtil { ...@@ -63,8 +63,8 @@ object FileUtil {
@SuppressLint("Range") @SuppressLint("Range")
fun scanFiles(context: Context, uri: Uri, minSize: Long) : ArrayList<FileBean>{ fun scanFiles(context: Context, uri: Uri, minSize: Long): ArrayList<FileBean> {
var filesItemBean : FileBean var filesItemBean: FileBean
var fileListItemBean = ArrayList<FileBean>() var fileListItemBean = ArrayList<FileBean>()
val projection = arrayOf( val projection = arrayOf(
MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns._ID,
...@@ -72,22 +72,25 @@ object FileUtil { ...@@ -72,22 +72,25 @@ object FileUtil {
MediaStore.Files.FileColumns.SIZE MediaStore.Files.FileColumns.SIZE
) )
val cursor = context.contentResolver.query(uri, projection,null,null,null) val cursor = context.contentResolver.query(uri, projection, null, null, null)
if (cursor != null && cursor.moveToFirst()){ if (cursor != null && cursor.moveToFirst()) {
do { do {
val fileSize = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns.SIZE)) val fileSize =
if (fileSize > minSize){ cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns.SIZE))
if (fileSize > minSize) {
filesItemBean = FileBean() filesItemBean = FileBean()
filesItemBean.fileName = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DISPLAY_NAME)) filesItemBean.fileName =
cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DISPLAY_NAME))
filesItemBean.fileSize = fileSize filesItemBean.fileSize = fileSize
filesItemBean.filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.RELATIVE_PATH)) filesItemBean.filePath =
cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.RELATIVE_PATH))
filesItemBean.isDir = false filesItemBean.isDir = false
filesItemBean.fileType = getFileType(File(filesItemBean.filePath)) filesItemBean.fileType = getFileType(File(filesItemBean.filePath))
fileListItemBean.add(filesItemBean) fileListItemBean.add(filesItemBean)
} }
}while (cursor.moveToNext()) } while (cursor.moveToNext())
cursor.close() cursor.close()
} }
...@@ -96,31 +99,31 @@ object FileUtil { ...@@ -96,31 +99,31 @@ object FileUtil {
} }
@SuppressLint("Range") @SuppressLint("Range")
fun sanRecursive(context: Context, uri: Uri, minSize: Long): ArrayList<FileBean>{ fun sanRecursive(context: Context, uri: Uri, minSize: Long): ArrayList<FileBean> {
var filesItemBeanList = ArrayList<FileBean>() var filesItemBeanList = ArrayList<FileBean>()
filesItemBeanList.addAll(scanFiles(context, uri, minSize)) filesItemBeanList.addAll(scanFiles(context, uri, minSize))
val selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "=" + val selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "=" +
MediaStore.Files.FileColumns.MEDIA_TYPE_NONE MediaStore.Files.FileColumns.MEDIA_TYPE_NONE
val sortOrder = MediaStore.Files.FileColumns.DATE_MODIFIED val sortOrder = MediaStore.Files.FileColumns.DATE_MODIFIED
val cursor = context.contentResolver.query(uri,null, selection,null, sortOrder) val cursor = context.contentResolver.query(uri, null, selection, null, sortOrder)
if (cursor != null && cursor.moveToFirst()){ if (cursor != null && cursor.moveToFirst()) {
do { do {
val fileId = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID)) val fileId = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID))
val chiIdUri = Uri.withAppendedPath(uri,""+ fileId) val chiIdUri = Uri.withAppendedPath(uri, "" + fileId)
filesItemBeanList.addAll(scanFiles(context,chiIdUri, minSize)) filesItemBeanList.addAll(scanFiles(context, chiIdUri, minSize))
}while (cursor.moveToNext()) } while (cursor.moveToNext())
cursor.close() cursor.close()
} }
return filesItemBeanList return filesItemBeanList
} }
fun getAllFilesAndDirectories(context: Context): ArrayList<FileBean>{ fun getAllFilesAndDirectories(context: Context): ArrayList<FileBean> {
var fileList = ArrayList<FileBean>() var fileList = ArrayList<FileBean>()
// val internalStorageDir = context.filesDir // val internalStorageDir = context.filesDir
val internalStorageDir = File(EXTERNAL_STORAGE) val internalStorageDir = File(EXTERNAL_STORAGE)
if (internalStorageDir != null && internalStorageDir.exists()){ if (internalStorageDir != null && internalStorageDir.exists()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
traverseDirectory(internalStorageDir, fileList) traverseDirectory(internalStorageDir, fileList)
} }
...@@ -129,22 +132,22 @@ object FileUtil { ...@@ -129,22 +132,22 @@ object FileUtil {
return fileList return fileList
} }
fun traverseDirectory(directory: File, fileList:ArrayList<FileBean>){ fun traverseDirectory(directory: File, fileList: ArrayList<FileBean>) {
val files = directory.listFiles() val files = directory.listFiles()
if (files!=null){ if (files != null) {
for (file: File in files){ for (file: File in files) {
val fileBean: FileBean = FileBean() val fileBean: FileBean = FileBean()
fileBean.fileName = file.name fileBean.fileName = file.name
fileBean.filePath = file.path fileBean.filePath = file.path
fileBean.isDir = file.isDirectory fileBean.isDir = file.isDirectory
// val type = Files.probeContentType(Paths.get(file.path)) // val type = Files.probeContentType(Paths.get(file.path))
if (file.isDirectory){ if (file.isDirectory) {
val children = ArrayList<FileBean>() val children = ArrayList<FileBean>()
// traverseDirectory(file, children) // traverseDirectory(file, children)
fileBean.childList = children fileBean.childList = children
fileBean.fileType = "dir" fileBean.fileType = "dir"
}else{ } else {
fileBean.fileType = getFileType(file) fileBean.fileType = getFileType(file)
fileBean.fileSize = file.length() fileBean.fileSize = file.length()
} }
...@@ -153,44 +156,44 @@ object FileUtil { ...@@ -153,44 +156,44 @@ object FileUtil {
} }
} }
fun getFileList(directory: File) : ArrayList<FileBean>{ fun getFileList(directory: File): ArrayList<FileBean> {
val fileBeans = ArrayList<FileBean>() val fileBeans = ArrayList<FileBean>()
// val directory = Environment.getExternalStorageDirectory() // val directory = Environment.getExternalStorageDirectory()
val files = directory.listFiles() val files = directory.listFiles()
for (file in files!!){ for (file in files!!) {
if (!file.isHidden && !file.name.startsWith(".") && file.name != ".face") { if (!file.isHidden && !file.name.startsWith(".") && file.name != ".face") {
val fileBean = FileBean() val fileBean = FileBean()
fileBean.fileName = file.name fileBean.fileName = file.name
fileBean.filePath = file.path fileBean.filePath = file.path
fileBean.isDir = file.isDirectory fileBean.isDir = file.isDirectory
// val type = Files.probeContentType(Paths.get(file.path)) // val type = Files.probeContentType(Paths.get(file.path))
if (file.isDirectory){ if (file.isDirectory) {
val children = ArrayList<FileBean>() val children = ArrayList<FileBean>()
traverseDirectory(file, children) traverseDirectory(file, children)
fileBean.childList = children fileBean.childList = children
fileBean.fileType = "dir" fileBean.fileType = "dir"
}else{ } else {
fileBean.fileType = getFileType(file) fileBean.fileType = getFileType(file)
fileBean.fileSize = file.length() fileBean.fileSize = file.length()
} }
Log.e("yanglin", "getFileList: childList.size = ${fileBean.childList.size}", ) Log.e("yanglin", "getFileList: childList.size = ${fileBean.childList.size}")
fileBeans.add(fileBean) fileBeans.add(fileBean)
} }
} }
return fileBeans return fileBeans
} }
fun getFileType(file: File): String{ fun getFileType(file: File): String {
val fileName = file.name val fileName = file.name
val indexOf = fileName.lastIndexOf(".") val indexOf = fileName.lastIndexOf(".")
if (indexOf != -1 && indexOf < fileName.length -1){ if (indexOf != -1 && indexOf < fileName.length - 1) {
return fileName.substring(indexOf + 1) return fileName.substring(indexOf + 1)
}else{ } else {
return "notType" return "notType"
} }
} }
fun fileListSort(fileList: ArrayList<FileBean>): ArrayList<FileBean>{ fun fileListSort(fileList: ArrayList<FileBean>): ArrayList<FileBean> {
fileList.sortWith(Comparator { fileBean1, fileBean2 -> fileList.sortWith(Comparator { fileBean1, fileBean2 ->
if (File(fileBean1.filePath).isDirectory && !File(fileBean2.filePath).isDirectory) { if (File(fileBean1.filePath).isDirectory && !File(fileBean2.filePath).isDirectory) {
-1 -1
...@@ -202,10 +205,11 @@ object FileUtil { ...@@ -202,10 +205,11 @@ object FileUtil {
}) })
return fileList return fileList
} }
/** /**
* 查询大于10M的文件 * 查询大于10M的文件
* ***/ * ***/
fun search10MFiles(context: Context, sizeInByte: Int): ArrayList<FileBean>{ fun search10MFiles(context: Context, sizeInByte: Int): ArrayList<FileBean> {
val fileBeans = ArrayList<FileBean>() val fileBeans = ArrayList<FileBean>()
val projection = arrayOf( val projection = arrayOf(
MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.DATA,
...@@ -259,27 +263,28 @@ object FileUtil { ...@@ -259,27 +263,28 @@ object FileUtil {
return allDeleted return allDeleted
} }
fun moveFile(path: String, destinationPath: String) : Boolean{ fun moveFile(path: String, destinationPath: String): Boolean {
val file = File(path) val file = File(path)
val destinationFile = File(destinationPath) val destinationFile = File(destinationPath)
Log.e("yanglin", "moveFile: filePath = ${path}, currentPath = $destinationPath", ) Log.e("yanglin", "moveFile: filePath = ${path}, currentPath = $destinationPath")
return file.renameTo(destinationFile) return file.renameTo(destinationFile)
} }
fun copyFile(path: String, destinationPath: String): Boolean{ fun copyFile(path: String, destinationPath: String): Boolean {
return try { return try {
File(path).inputStream().use { input-> File(path).inputStream().use { input ->
File(destinationPath).outputStream().use { output-> File(destinationPath).outputStream().use { output ->
input.copyTo(output) input.copyTo(output)
} }
} }
true true
}catch (e: IOException){ } catch (e: IOException) {
e.printStackTrace() e.printStackTrace()
false false
} }
} }
fun scanEmptyFiles(filePath: String, fileList: ArrayList<FileBean>){
fun scanEmptyFiles(filePath: String, fileList: ArrayList<FileBean>) {
val files = File(filePath).listFiles() // 获取当前目录下的所有文件和文件夹 val files = File(filePath).listFiles() // 获取当前目录下的所有文件和文件夹
if (files != null) { if (files != null) {
for (file in files) { for (file in files) {
...@@ -292,15 +297,15 @@ object FileUtil { ...@@ -292,15 +297,15 @@ object FileUtil {
fileBean.isDir = true fileBean.isDir = true
fileList.add(fileBean) fileList.add(fileBean)
}else if (file.isDirectory){ } else if (file.isDirectory) {
scanEmptyFiles(file.path,fileList) scanEmptyFiles(file.path, fileList)
} }
} }
} }
} }
fun dpToPx(dp: Int, context: Context): Int{ fun dpToPx(dp: Int, context: Context): Int {
return TypedValue.applyDimension( return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, TypedValue.COMPLEX_UNIT_DIP,
dp.toFloat(), dp.toFloat(),
...@@ -309,7 +314,7 @@ object FileUtil { ...@@ -309,7 +314,7 @@ object FileUtil {
} }
@SuppressLint("Recycle") @SuppressLint("Recycle")
fun getMediaData(context: Context): ArrayList<FileBean>{ fun getMediaData(context: Context): ArrayList<FileBean> {
val fileBeans = ArrayList<FileBean>() val fileBeans = ArrayList<FileBean>()
val projection = arrayOf(MediaStore.Images.Media.DATA) val projection = arrayOf(MediaStore.Images.Media.DATA)
val cursor = context.contentResolver.query( val cursor = context.contentResolver.query(
...@@ -320,7 +325,7 @@ object FileUtil { ...@@ -320,7 +325,7 @@ object FileUtil {
cursor?.let { cursor?.let {
val indexOrThrow = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) val indexOrThrow = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
while (cursor.moveToNext()){ while (cursor.moveToNext()) {
val imagePath = cursor.getString(indexOrThrow) val imagePath = cursor.getString(indexOrThrow)
val bitmap = BitmapFactory.decodeFile(imagePath) val bitmap = BitmapFactory.decodeFile(imagePath)
val file = File(imagePath) val file = File(imagePath)
...@@ -330,24 +335,24 @@ object FileUtil { ...@@ -330,24 +335,24 @@ object FileUtil {
fileBean.fileName = file.name fileBean.fileName = file.name
fileBean.filePath = imagePath fileBean.filePath = imagePath
fileBean.fileType = getFileType(file) fileBean.fileType = getFileType(file)
Log.e("yanglin", "getFileList: childList.size = ${imagePath}", ) Log.e("yanglin", "getFileList: childList.size = ${imagePath}")
fileBeans.add(fileBean) fileBeans.add(fileBean)
} }
} }
return fileBeans return fileBeans
} }
fun getTypeFiles(types: Array<String>, fileBeans: ArrayList<FileBean>){ fun getTypeFiles(types: Array<String>, fileBeans: ArrayList<FileBean>) {
MediaStore.Files() MediaStore.Files()
val externalStorageDir = Environment.getExternalStorageDirectory() val externalStorageDir = Environment.getExternalStorageDirectory()
externalStorageDir.listFiles()?.forEach { externalStorageDir.listFiles()?.forEach {
if (it.isDirectory){ if (it.isDirectory) {
getTypeFiles(types, fileBeans) getTypeFiles(types, fileBeans)
}else{ } else {
val fileBean = FileBean() val fileBean = FileBean()
for (type in types){ for (type in types) {
if (type.contains(getFileType(it))){ if (type.contains(getFileType(it))) {
fileBean.fileName = it.name fileBean.fileName = it.name
fileBean.filePath = it.path fileBean.filePath = it.path
...@@ -366,14 +371,14 @@ object FileUtil { ...@@ -366,14 +371,14 @@ object FileUtil {
fun getMediaFiles(context: Context, fileType: String, limit: Int): ArrayList<FileBean> { fun getMediaFiles(context: Context, fileType: String, limit: Int): ArrayList<FileBean> {
val fileBeans = ArrayList<FileBean>() val fileBeans = ArrayList<FileBean>()
val projection = arrayOf(MediaStore.Images.Media.DATA) val projection = arrayOf(MediaStore.Images.Media.DATA)
var contentUri : Uri var contentUri: Uri
if (fileType.contains("image")){ if (fileType.contains("image")) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}else if (fileType.contains("video")){ } else if (fileType.contains("video")) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}else if (fileType.contains("audio")){ } else if (fileType.contains("audio")) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}else{ } else {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
} }
val cursor = context.contentResolver.query( val cursor = context.contentResolver.query(
...@@ -386,7 +391,7 @@ object FileUtil { ...@@ -386,7 +391,7 @@ object FileUtil {
cursor?.use { cursor?.use {
var count = 0 var count = 0
while (it.moveToNext()) { while (it.moveToNext()) {
if (count < limit){ if (count < limit) {
val imagePath = it.getString(it.getColumnIndex(MediaStore.Images.Media.DATA)) val imagePath = it.getString(it.getColumnIndex(MediaStore.Images.Media.DATA))
// images.add(imagePath) // images.add(imagePath)
val fileBean = FileBean() val fileBean = FileBean()
...@@ -396,10 +401,13 @@ object FileUtil { ...@@ -396,10 +401,13 @@ object FileUtil {
fileBean.fileSize = file.length() fileBean.fileSize = file.length()
fileBean.fileType = getFileType(file) fileBean.fileType = getFileType(file)
fileBean.isDir = false fileBean.isDir = false
fileBean.drawable = if (fileType.contains("image")) BitmapDrawable(context.resources, BitmapFactory.decodeFile(file.path)) else null fileBean.drawable = if (fileType.contains("image")) BitmapDrawable(
context.resources,
BitmapFactory.decodeFile(file.path)
) else null
fileBeans.add(fileBean) fileBeans.add(fileBean)
} }
count ++ count++
} }
cursor.close() cursor.close()
} }
...@@ -407,7 +415,7 @@ object FileUtil { ...@@ -407,7 +415,7 @@ object FileUtil {
return fileBeans return fileBeans
} }
fun getFileType(mimeType: String, context: Context): ArrayList<FileBean>{ fun getFileType(mimeType: String, context: Context): ArrayList<FileBean> {
val fileBeans: ArrayList<FileBean> = ArrayList() val fileBeans: ArrayList<FileBean> = ArrayList()
val projection = arrayOf( val projection = arrayOf(
MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.DATA,
......
package com.xm.test.myfilemaster.util
import android.app.Application
import com.bumptech.glide.annotation.GlideModule
@GlideModule
class GlideApp : Application() {
}
\ No newline at end of file
...@@ -3,43 +3,36 @@ ...@@ -3,43 +3,36 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main" android:id="@+id/main"
android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.MediaActivity"> tools:context=".activity.MediaActivity">
<include <include
android:id="@+id/title_bar" android:id="@+id/title_bar"
layout="@layout/title_bar_layout"/> layout="@layout/title_bar_layout" />
<!-- <ScrollView--> <!-- <ScrollView-->
<!-- android:id="@+id/grid_view_scroll"--> <!-- android:id="@+id/grid_view_scroll"-->
<!-- android:layout_width="match_parent"--> <!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"--> <!-- android:layout_height="match_parent"-->
<!-- android:layout_marginTop="12dp"--> <!-- android:layout_marginTop="12dp"-->
<!-- android:layout_marginStart="16dp"--> <!-- android:layout_marginStart="16dp"-->
<!-- android:layout_marginEnd="16dp">--> <!-- android:layout_marginEnd="16dp">-->
<GridView <androidx.recyclerview.widget.RecyclerView
android:layout_marginTop="12dp" android:id="@+id/image_item_grid"
android:layout_marginStart="16dp" android:layout_width="match_parent"
android:layout_marginEnd="16dp" android:layout_height="wrap_content"
android:id="@+id/image_item_grid" android:layout_marginStart="16dp"
android:layout_width="fill_parent" android:layout_marginTop="12dp"
android:layout_height="wrap_content" android:layout_marginEnd="16dp"
android:fadingEdge="none" android:padding="1dp"
android:horizontalSpacing="1dp" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
android:listSelector="#00000000" app:spanCount="3" />
android:padding="1dp"
android:scrollbars="none"
android:verticalSpacing="5dp" <!-- </ScrollView>-->
android:numColumns="3"
android:columnWidth="118dp"/>
<!-- </ScrollView>-->
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_margin="15dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_media"
android:layout_width="100dp"
android:layout_height="100dp"
tools:ignore="ContentDescription" />
</FrameLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment