零、前言

因项目需要自己写了一个文件管理器,主要实现的功能有以下几点:

  • 获取设备中的图片、音乐、视频、文档文件;
  • 刷新查看最新文件;
  • 选中文件并发送;
    技术要点如下:
  • 异步读取文件:耗时操作在非主线程中读取
  • 回调返回文件列表 :FileService读取文件完成自动返回list
  • 主动刷新文件:点击刷新按钮,service重新读取文件

一、代码结构设计


二、布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background7"android:fitsSystemWindows="true"><LinearLayoutandroid:id="@+id/ll_toplist"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/plum1"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_return"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/ic_keyboard_arrow_left_40dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="@string/back_main_page"android:textColor="@color/black"android:textSize="18dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="100dp"android:text="@string/choose_file"android:textColor="@color/black"android:textSize="20dp"></TextView><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="right"><ImageViewandroid:id="@+id/iv_refresh"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:background="@drawable/ic_refresh_blue_200_36dp"android:gravity="center"/></LinearLayout></LinearLayout><LinearLayoutandroid:id="@+id/ll_btngroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/ll_toplist"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_jpg"style="@style/style_file_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/common_blue"android:gravity="center"android:text="@string/str_picture"android:textSize="16dp"android:textStyle="bold"/><Buttonandroid:id="@+id/btn_music"style="@style/style_file_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/common_blue"android:gravity="center"android:text="@string/str_music"android:textSize="16dp"android:textStyle="bold"/><Buttonandroid:id="@+id/btn_movie"style="@style/style_file_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/common_blue"android:gravity="center"android:text="@string/str_movie"android:textSize="16dp"android:textStyle="bold"/><Buttonandroid:id="@+id/btn_doc"style="@style/style_file_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/common_blue"android:gravity="center"android:text="@string/str_document"android:textSize="16dp"android:textStyle="bold"/></LinearLayout><Buttonandroid:id="@+id/btn_send"style="@style/style_file_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="15dp"android:background="@drawable/bg_cancel_btn"android:gravity="center"android:text="@string/str_send"/><ListViewandroid:id="@+id/lv_file"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/btn_send"android:layout_below="@+id/ll_btngroup"android:choiceMode="singleChoice"android:listSelector="@drawable/listviewselector"></ListView></RelativeLayout>

还有一个dialog忽略

三、关键activity和service

附上关键的activity和service,其他的Adaper和bean文件忽略

package com.example.colorfulquicklytransmission.ui.activity;import android.annotation.SuppressLint;
import android.os.Bundle;import com.example.colorfulquicklytransmission.R;import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import com.example.colorfulquicklytransmission.data.bean.Documentbean;
import com.example.colorfulquicklytransmission.data.bean.Moviebean;
import com.example.colorfulquicklytransmission.data.bean.Musicbean;
import com.example.colorfulquicklytransmission.data.bean.Picturebean;
import com.example.colorfulquicklytransmission.service.file.FileService;
import com.example.colorfulquicklytransmission.ui.adapter.DocumentAdapter;
import com.example.colorfulquicklytransmission.ui.adapter.MovieAdapter;
import com.example.colorfulquicklytransmission.ui.adapter.MusicAdapter;
import com.example.colorfulquicklytransmission.ui.adapter.PictureAdapter;
import com.example.colorfulquicklytransmission.ui.dialog.ConfirmDialog;import java.util.ArrayList;
import java.util.List;/*** Created by PsycheWang on 2021/11/9.*/
public class FileManageActivity extends Activity implements View.OnClickListener {private static final String TAG = "FileManageActivity";private static final int FILE_READ_MESSAGE = 1;private static final int FILE_READOK_MESSAGE = 2;public static final int FILE_MUISC = 3;public static final int FILE_MOVIE = 4;public static final int FILE_PICTURE = 5;public static final int FILE_DOCUMENT = 6;Button mBtndoc, mBtnjpg, mBtnmusic, mBtnmovie, mBtnSend;ListView mlvFile;ImageView mIvreturn, mIvreflesh;private String mFileName = null;private String mFilePath = null;private int mFileType = FILE_MUISC;private List<Musicbean> mMusiclist = new ArrayList<>();private List<Moviebean> mMovielist = new ArrayList<>();private List<Picturebean> mPicturelist = new ArrayList<>();private List<Documentbean> mDocumentList = new ArrayList<>();FileService.MyBinder myBinder;Context mContext;PictureAdapter mPictureAdapter;MusicAdapter mMusicAdapter;MovieAdapter mMovieAdapter;DocumentAdapter mDocumentAdapter;ConfirmDialog confirmDialog;public FileServiceCallBack fileServiceCallBack = new FileServiceCallBack() {@Overridepublic void onFileReadState(boolean state) {Message message = mHandler.obtainMessage();if (state) {message.what = FILE_READ_MESSAGE;mHandler.sendMessage(message);} else {message.what = FILE_READOK_MESSAGE;mHandler.sendMessage(message);Log.d(TAG, "isgetFile: 加载结束");}}@Overridepublic void onMusicFileGet(List<Musicbean> musicbeanlist) {if (musicbeanlist != null) {mHandler.obtainMessage(FILE_MUISC, musicbeanlist).sendToTarget();} else {Log.d(TAG, "onMusicFileGet: musicbeanlist is empty");}}@Overridepublic void onMovieFileGet(List<Moviebean> moviebeanlist) {if (moviebeanlist != null) {mHandler.obtainMessage(FILE_MOVIE, moviebeanlist).sendToTarget();} else {Log.d(TAG, "onMovieFileGet: moviebeanlist is empty");}}@Overridepublic void onPictureFileGet(List<Picturebean> picturebeanlist) {if (picturebeanlist != null) {mHandler.obtainMessage(FILE_PICTURE, picturebeanlist).sendToTarget();} else {Log.d(TAG, "onPictureFileGet: picturebeanlist is empty");}}@Overridepublic void onDocumentFileGet(List<Documentbean> documentbeanlist) {if (documentbeanlist != null) {mHandler.obtainMessage(FILE_DOCUMENT, documentbeanlist).sendToTarget();} else {Log.d(TAG, "onDocumentFileGet: documentbeanlist is empty");}}};@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_choose_file);initView();setListener();mContext = this;final Intent intent = new Intent(this, FileService.class);bindService(intent, connection, BIND_AUTO_CREATE);}public Handler mHandler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what) {case FILE_READ_MESSAGE:Toast.makeText(mContext, getResources().getString(R.string.toast_get_file), Toast.LENGTH_SHORT).show();break;case FILE_READOK_MESSAGE:Toast.makeText(mContext, getResources().getString(R.string.toast_get_file_success), Toast.LENGTH_SHORT).show();onClick(mBtnmusic);break;case FILE_MUISC:List<Musicbean> musicList = (List<Musicbean>) msg.obj;mMusiclist.clear();mMusiclist.addAll(musicList);mMusicAdapter = new MusicAdapter(mContext, mMusiclist);break;case FILE_MOVIE:List<Moviebean> movieList = (List<Moviebean>) msg.obj;mMovielist.clear();mMovielist.addAll(movieList);mMovieAdapter = new MovieAdapter(mContext, mMovielist);break;case FILE_PICTURE:List<Picturebean> pictureList = (List<Picturebean>) msg.obj;mPicturelist.clear();mPicturelist.addAll(pictureList);mPictureAdapter = new PictureAdapter(mContext, mPicturelist);break;case FILE_DOCUMENT:List<Documentbean> documentList = (List<Documentbean>) msg.obj;mDocumentList.clear();mDocumentList.addAll(documentList);mDocumentAdapter = new DocumentAdapter(mContext, mDocumentList);break;default:break;}}};ServiceConnection connection = new ServiceConnection() {@SuppressLint("ResourceAsColor")@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {myBinder = (FileService.MyBinder) iBinder;if (myBinder != null) {myBinder.setCallBack(fileServiceCallBack);myBinder.init();}}@Overridepublic void onServiceDisconnected(ComponentName componentName) {mPictureAdapter.release();if (myBinder != null) {fileServiceCallBack = null;}}};private void initView() {mBtndoc = findViewById(R.id.btn_doc);mBtnjpg = findViewById(R.id.btn_jpg);mBtnmovie = findViewById(R.id.btn_movie);mBtnmusic = findViewById(R.id.btn_music);mlvFile = findViewById(R.id.lv_file);mIvreturn = findViewById(R.id.iv_return);mBtnSend = findViewById(R.id.btn_send);mIvreflesh = findViewById(R.id.iv_refresh);mBtndoc.setOnClickListener(this);mBtnjpg.setOnClickListener(this);mBtnmovie.setOnClickListener(this);mBtnmusic.setOnClickListener(this);mIvreturn.setOnClickListener(this);mBtnSend.setOnClickListener(this);mIvreflesh.setOnClickListener(this);}private void setListener() {//给listview设置item的点击监听mlvFile.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {TextView tvFileName = (TextView) view.findViewById(R.id.tv_name);mFileName = tvFileName.getText().toString();TextView tvFilePath = (TextView) view.findViewById(R.id.tv_path);mFilePath = tvFilePath.getText().toString();}});}@SuppressLint("ResourceAsColor")@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_jpg:mlvFile.setAdapter(mPictureAdapter);mPictureAdapter.notifyDataSetChanged();mFileType = FILE_PICTURE;mBtnjpg.setBackgroundColor(R.color.sakura2);mBtnmovie.setBackgroundColor(R.color.common_blue);mBtndoc.setBackgroundColor(R.color.common_blue);mBtnmusic.setBackgroundColor(R.color.common_blue);break;case R.id.btn_music:mlvFile.setAdapter(mMusicAdapter);mMusicAdapter.notifyDataSetChanged();mFileType = FILE_MUISC;mBtnmovie.setBackgroundColor(R.color.common_blue);mBtndoc.setBackgroundColor(R.color.common_blue);mBtnjpg.setBackgroundColor(R.color.common_blue);mBtnmusic.setBackgroundColor(R.color.sakura2);break;case R.id.btn_movie:mlvFile.setAdapter(mMovieAdapter);mMovieAdapter.notifyDataSetChanged();mFileType = FILE_MOVIE;mBtnjpg.setBackgroundColor(R.color.common_blue);mBtndoc.setBackgroundColor(R.color.common_blue);mBtnmusic.setBackgroundColor(R.color.common_blue);mBtnmovie.setBackgroundColor(R.color.sakura2);break;case R.id.btn_doc:mlvFile.setAdapter(mDocumentAdapter);mDocumentAdapter.notifyDataSetChanged();mFileType = FILE_DOCUMENT;mBtnmovie.setBackgroundColor(R.color.common_blue);mBtnjpg.setBackgroundColor(R.color.common_blue);mBtnmusic.setBackgroundColor(R.color.common_blue);mBtndoc.setBackgroundColor(R.color.sakura2);break;case R.id.iv_return:Intent intent = new Intent(FileManageActivity.this, FirstActivity.class);startActivity(intent);onDestroy();break;case R.id.btn_send:if (mFileName == null) {Toast.makeText(mContext, getResources().getString(R.string.toast_choose_file), Toast.LENGTH_LONG).show();} else {showMyDialog(getResources().getString(R.string.dialog_send_sure) + mFileName + getResources().getString(R.string.dialog_question_mark),getResources().getString(R.string.dialog_sendfile_yes), getResources().getString(R.string.dialog_sendfile_no));}break;case R.id.iv_refresh:mlvFile.setAdapter(null);myBinder.init();mBtnjpg.setBackgroundColor(R.color.common_blue);mBtndoc.setBackgroundColor(R.color.common_blue);mBtnmusic.setBackgroundColor(R.color.common_blue);mBtnmovie.setBackgroundColor(R.color.common_blue);default:break;}}/*** 发送弹框提示,点击发送跳转到发送界面*/public void showMyDialog(String title, String yesText, String noText) {confirmDialog = new ConfirmDialog(this, R.layout.dialog_send, title, yesText, noText);confirmDialog.show();//给弹框设置弹出的位置和大小Window dialogWindow = confirmDialog.getWindow();WindowManager.LayoutParams layoutParams = dialogWindow.getAttributes();layoutParams.width = 900;//设置弹框的宽度layoutParams.height = 900;//设置弹框的高度dialogWindow.setAttributes(layoutParams);confirmDialog.setConfirmDialogView(dialogWindow);confirmDialog.setOnButtonClickListener(new ConfirmDialog.OnClickBtnListener() {@Overridepublic void onClickYes() {Log.d(TAG, "onClickYes: 点击确认发送");TransferActivity.actionStart(FileManageActivity.this, mFilePath, mFileType);//finish();Log.d(TAG, "onClickYes: 查看文件类型" + mFileType);}@Overridepublic void onClickNo() {Log.d(TAG, "onClickNo: 点击取消发送 ");}});}@Overrideprotected void onDestroy() {if (mPictureAdapter != null) {mPictureAdapter.release();}if (myBinder != null) {unbindService(connection);}fileServiceCallBack = null;super.onDestroy();}
}
package com.example.colorfulquicklytransmission.service.file;import android.annotation.SuppressLint;
import android.app.Service;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.util.Log;import com.example.colorfulquicklytransmission.R;
import com.example.colorfulquicklytransmission.data.bean.Documentbean;
import com.example.colorfulquicklytransmission.data.bean.Moviebean;
import com.example.colorfulquicklytransmission.data.bean.Musicbean;
import com.example.colorfulquicklytransmission.data.bean.Picturebean;
import com.example.colorfulquicklytransmission.ui.activity.FileServiceCallBack;import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;public class FileService extends Service {private static final String TAG = "FileService";private static List<Musicbean> mMusicList = new ArrayList<>();private static List<Moviebean> mMovieList = new ArrayList<>();private static List<Picturebean> mPictureList = new ArrayList<>();private static List<Documentbean> mDocumentList = new ArrayList<>();private static FileServiceCallBack fileServiceCallBack;private static int INIT_FILE_FLAG = 1;Context context;@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.return new MyBinder();}public class MyBinder extends Binder {public void setCallBack(FileServiceCallBack fileServiceCallBack1) {Log.d(TAG, "setCallBack: " + fileServiceCallBack);fileServiceCallBack = fileServiceCallBack1;}public void init() {initFileData();}}@Overridepublic void onCreate() {super.onCreate();context = this;}public void initFileData() {mMusicList.clear();initMusicData();mPictureList.clear();initPictureData();mDocumentList.clear();initDocumentData();mMovieList.clear();initMovieData();}public List<Musicbean> initMusicData() {Log.d(TAG, "run: " + fileServiceCallBack);Thread mThread = new Thread() {public void run() {super.run();if (fileServiceCallBack != null) {fileServiceCallBack.onFileReadState(true);}mMusicList = readMusicData(context);if (fileServiceCallBack != null) {INIT_FILE_FLAG++;Log.d(TAG, "INIT_FILE_FLAG " + INIT_FILE_FLAG);fileServiceCallBack.onMusicFileGet(mMusicList);if (INIT_FILE_FLAG == 5) {fileServiceCallBack.onFileReadState(false);INIT_FILE_FLAG = 1;Log.d(TAG, "initFileData: " + "读取完毕");}}}};mThread.start();return mMusicList;}public List<Moviebean> initMovieData() {Thread mThread = new Thread() {public void run() {super.run();mMovieList = readMovieData(context);if (fileServiceCallBack != null) {INIT_FILE_FLAG++;Log.d(TAG, "INIT_FILE_FLAG " + INIT_FILE_FLAG);fileServiceCallBack.onMovieFileGet(mMovieList);if (INIT_FILE_FLAG == 5) {fileServiceCallBack.onFileReadState(false);Log.d(TAG, "initFileData: " + "读取完毕");INIT_FILE_FLAG = 1;}}}};mThread.start();return mMovieList;}public List<Picturebean> initPictureData() {Thread mThread = new Thread() {public void run() {super.run();try {mPictureList = readPictureData(context);if (fileServiceCallBack != null) {INIT_FILE_FLAG++;Log.d(TAG, "INIT_FILE_FLAG " + INIT_FILE_FLAG);fileServiceCallBack.onPictureFileGet(mPictureList);if (INIT_FILE_FLAG == 5) {fileServiceCallBack.onFileReadState(false);Log.d(TAG, "initFileData: " + "读取完毕");INIT_FILE_FLAG = 1;}}} catch (Exception e) {e.printStackTrace();}}};mThread.start();return mPictureList;}public List<Documentbean> initDocumentData() {Thread mThread = new Thread() {public void run() {super.run();mDocumentList = readDocumentData(context);if (fileServiceCallBack != null) {INIT_FILE_FLAG++;Log.d(TAG, "INIT_FILE_FLAG " + INIT_FILE_FLAG);fileServiceCallBack.onDocumentFileGet(mDocumentList);if (INIT_FILE_FLAG == 5) {fileServiceCallBack.onFileReadState(false);Log.d(TAG, "initFileData: " + "读取完毕");INIT_FILE_FLAG = 1;}}}};mThread.start();return mDocumentList;}/*** 读取音乐*/public static List<Musicbean> readMusicData(Context context) {Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,null, MediaStore.Audio.AudioColumns.IS_MUSIC);if (cursor != null) {while (cursor.moveToNext()) {Musicbean music = new Musicbean();music.setmMusicSong(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));music.setmMusicPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));music.setmMusicSize(getNetFileSizeDescription(size));long album_id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));long songid = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));music.setmMusicBitmap(getMusicBitmap(context, songid, album_id));mMusicList.add(music);}cursor.close();}return mMusicList;}/*** 获取音乐专辑封面*/public static Bitmap getMusicBitmap(Context context, long songid, long albumid) {Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");Bitmap bm = null;try {if (albumid < 0) {Uri uri = Uri.parse("content://media/external/audio/media/"+ songid + "/albumart");ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");if (pfd != null) {FileDescriptor fd = pfd.getFileDescriptor();bm = BitmapFactory.decodeFileDescriptor(fd);}} else {Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");if (pfd != null) {FileDescriptor fd = pfd.getFileDescriptor();bm = BitmapFactory.decodeFileDescriptor(fd);} else {return null;}}} catch (FileNotFoundException ex) {}//如果获取的bitmap为空,则返回一个默认的bitmapif (bm == null) {Resources resources = context.getResources();Drawable drawable = resources.getDrawable(R.mipmap.icon_mp3);//Drawable 转 BitmapBitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;bm = bitmapDrawable.getBitmap();}return Bitmap.createScaledBitmap(bm, 150, 150, true);}/*** 读取视频*/public static List<Moviebean> readMovieData(Context context) {Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null,null, null, MediaStore.Video.Media.DISPLAY_NAME);if (cursor != null) {while (cursor.moveToNext()) {Moviebean movie = new Moviebean();movie.setmMovieName(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)));movie.setmMoviePath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)));long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));movie.setmMovieSize(getNetFileSizeDescription(size));mMovieList.add(movie);}cursor.close();}return mMovieList;}/*** 读取图片*/public static List<Picturebean> readPictureData(Context context) throws Exception {Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[]{MediaStore.Images.Media.DATA},MediaStore.Images.ImageColumns.MIME_TYPE + "=? or "+ MediaStore.Images.ImageColumns.MIME_TYPE + "=?",new String[]{"image/jpeg", "image/png"},MediaStore.Images.ImageColumns.DATE_MODIFIED);if (cursor != null) {while (cursor.moveToNext()) {Picturebean picture = new Picturebean();String picturePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA));picture.setmPicturePath(picturePath);File file = new File(picturePath);if (file.exists()) {picture.setmPictureBitmap(BitmapFactory.decodeFile(picturePath));}picture.setmPictureName(picturePath.substring(picturePath.lastIndexOf("/") + 1));if (file.exists()) {long size = 0;FileInputStream fis = null;fis = new FileInputStream(file);size = fis.available();picture.setmPictureSize(getNetFileSizeDescription(size));}mPictureList.add(picture);}cursor.close();}Log.d(TAG, "getPictureData: " + mPictureList.size());return mPictureList;}/*** 读取文件*/@SuppressLint("Range")public static List<Documentbean> readDocumentData(Context context) {String selection = MediaStore.Files.FileColumns.MIME_TYPE + "= ? "+ " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "+ " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "+ " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? ";String[] selectionArgs = new String[]{"text/plain", "application/pdf", "application/vnd.ms-powerpoint", "application/vnd.ms-excel"};Cursor cursor = context.getContentResolver().query(MediaStore.Files.getContentUri("external"),null, "mime_type=\"text/plain\"", null, null);if (cursor != null) {Log.d(TAG, "getDocumentData: " + cursor.getCount());while (cursor.moveToNext()) {Documentbean document = new Documentbean();document.setmDocumentName(cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.TITLE)));document.setmDocumentPath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)));long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE));document.setmDocumentSize(getNetFileSizeDescription(size));mDocumentList.add(document);}cursor.close();}Log.d(TAG, "getPictureData: " + mDocumentList.size());return mDocumentList;}/*** 文件大小转换函数,转换byte为KB,MB,GB*/public static String getNetFileSizeDescription(long size) {StringBuffer bytes = new StringBuffer();DecimalFormat format = new DecimalFormat("###.0");if (size >= 1024 * 1024 * 1024) {double i = (size / (1024.0 * 1024.0 * 1024.0));bytes.append(format.format(i)).append("GB");} else if (size >= 1024 * 1024) {double i = (size / (1024.0 * 1024.0));bytes.append(format.format(i)).append("MB");} else if (size >= 1024) {double i = (size / (1024.0));bytes.append(format.format(i)).append("KB");} else if (size < 1024) {if (size <= 0) {bytes.append("0B");} else {bytes.append((int) size).append("B");}}return bytes.toString();}}

Android文件管理器相关推荐

  1. android文件管理器项目,浅析Android文件管理器(项目一)

    文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能, ...

  2. 穿越派·派盘 + Solid Explorer = 全能 Android 文件管理器

    Solid Explorer 是一款非常优秀的 Android 文件管理器,Material Design 设计风格,双栏布局,可拖拽操作.支持 ROOT 权限.多媒体浏览器.压缩包支持,Chrome ...

  3. android文件管理器listview,浅析Android文件管理器(项目一)

    文件管理器是管理文件的软件,帮助用户处理日常工作,管理储存在本地和网络中的文件.所有文件管理器都提供了基本的操作如创建.打开.查看.编辑.移动和删除文件.许多Android文件管理器还提供了额外功能, ...

  4. android文件管理器项目,GitHub - yangsmith/FileExplorer: android file explorer android文件管理器...

    File_Explorer Android 文件管理器 #发布版本 ####腾讯助手 ####百度助手 ####91助手 #包常用ui控件有: 1.侧滑菜单slidingMenu 2.兼容action ...

  5. Android10文件管理,10款优秀的Android文件管理器

    本文将介绍10款Android文件管理器,包括:ES File Explorer.Dual File Manager XT.ASTRO File Manager,Ghost Commander,Fil ...

  6. 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助

    转自 https://blog.csdn.net/weixin_33698823/article/details/87269955 浅谈Android文件管理器的几种实现方式 为了完成毕业设计,我花费 ...

  7. 史上最全Android文件管理器技术方案细节

    前言: 这些都是基于市面上开源的文件管理器源码阅读提炼出来的思路,应用市场上绝大多数的文件管理器核心功能的实现其实大同小异,开源项目以小米社区开放版为主.如思路有错误希望大家提出一起商讨更好的思路. ...

  8. android文件管理器u盘,Android U盘文件显示在文件管理器

    在做物联网客户需求时,有客户要求实现u盘中的文件在文件管理器中显示,便于客户管理. 查看代码后,发现u盘是基于usb-otg挂载的,只要实现usb-otg文件显示在文件管理器中即可. android ...

  9. Android 文件管理器 Android文件管理器源代码

    /**************************************************** 大家都知道写博客会很累的,大热天的. 希望=转载请注明出处:http://blog.csdn ...

最新文章

  1. Xamarin XAML语言教程构建ControlTemplate控件模板 (四)
  2. 2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲
  3. 父亲节,来认识一下这几位“爸爸”
  4. 好程序员分享居中一个float元素
  5. sql server web管理软件
  6. 使用什么优化器_新的深度学习优化器Ranger:RAdam + LookAhead强强结合
  7. 对软件未来走向的看法
  8. 如何在 Pr 中创建动作序列?
  9. 梭子鱼下一代防火墙在对比研究中名列榜首
  10. Educational Codeforces Round 67 E.Tree Painting (树形dp)
  11. 如何降低软件项目的风险 -- 包括客户的风险,软件提供商的风险
  12. 软件设计师考试考点分析总结
  13. 【推荐】智慧城市建设及发展资料合集
  14. 信息系统项目管理师(2022年)—— 重点内容:项目变更管理(16)
  15. 笔记本电脑怎么打不开计算机,笔记本电脑打不开了怎么办
  16. 简易命令行界面的C/S聊天室
  17. 小众又冷门的手帐,居然也是一个非常赚钱的项目
  18. poi读取受保护的excel
  19. 关于微信小程序第三方客服接入调查
  20. 微软薪资福利大揭密!

热门文章

  1. qq公众号消息是发送到自己服务器,qq公众号屏蔽后还发消息 qq消息被屏蔽了怎么办...
  2. 关闭窗口提示以及窗口被关闭后执行函数
  3. 【python入门小知识】实现人名全大写,全小写,首字母大写
  4. java文件存储系统_分布式小文件存储系统
  5. SPSS如何使用基础功能?
  6. Jsp实现注册登录以及忘记找回密码等操作(上)
  7. Android使用VideoView播放视频
  8. python爬虫之入门级实战实例(东方财富人气top100、汉服荟视频下载)
  9. 用Excel写个摸球模拟器玩玩
  10. 针对 DNS 监控的 Grafana Dashboard面板DeepFlow