操作SD卡,获取文件目录及文件工具类Android

1.获取文件目录及文件工具类: DirectoryInfo  FileScan

1.1 DirectoryInfo:

package com.glsite.entity;import java.util.ArrayList;public class DirectoryInfo {public String fatherDirectory;public String currentDirectory;//当前目录public ArrayList<String> directoryName;//目录或文件名public ArrayList<String> childDirectoryContain;//目录下有多少文件//   public DirectoryInfo(String fatherDirectory,ArrayList<String> directoryName,int[] childAmount){//     this.fatherDirectory=fatherDirectory;//        this.directoryName=directoryName;//        this.childAmount=childAmount;//    }public DirectoryInfo() {}
}

1.2 FileScan:

package com.glsite.utils;import com.glsite.entity.DirectoryInfo;import java.io.File;
import java.util.ArrayList;public class FileScan {/*** 根据提供的String类型的路径信息返回所含的子文件夹信息,父文件夹信息等* 获取文件目录*/public DirectoryInfo getFileDirectory(String filePathString) {DirectoryInfo directoryInfo = new DirectoryInfo();directoryInfo.directoryName = new ArrayList<String>();directoryInfo.childDirectoryContain = new ArrayList<String>();directoryInfo.currentDirectory = filePathString;if (directoryInfo.currentDirectory.equals("/sdcard")) {} else {String path = directoryInfo.currentDirectory;directoryInfo.fatherDirectory = (new File(path)).getParent();}getFileList(new File(filePathString), directoryInfo);return directoryInfo;}/*** 获取文件列表* @param currentFile* @param directoryInfo*/private void getFileList(File currentFile, DirectoryInfo directoryInfo) {if (currentFile.isDirectory()) {File[] childFileGroup = currentFile.listFiles();   //当前目录包含的所有文件if (childFileGroup == null)  //权限判断return;for (int i = 0; i < childFileGroup.length; i++) {String childFileString = childFileGroup[i].getAbsolutePath();   //获取子文件夹中单个文件File childFile = new File(childFileString);String childFileName = childFileString.substring(childFileString.lastIndexOf("/") + 1); //从路径中截取名字if (!childFileName.startsWith(".") && childFile.isDirectory() && (childFile != null)) { //如果是目录File[] childChildfiles = childFile.listFiles();directoryInfo.directoryName.add(childFileName);directoryInfo.childDirectoryContain.add("(" + childChildfiles.length + ")");} else if (!childFileName.startsWith(".") && childFile.isFile() && (childFile != null)) { //如果是文件directoryInfo.directoryName.add(childFileName);directoryInfo.childDirectoryContain.add("");}}}}
}

2. AndroidManifest.xml

SD卡文件操作权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.glsite.mobilesafe"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".ui.SplashActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".ui.MainActivity"></activity><activity android:name=".ui.DirectoryListViewActivity"></activity></application></manifest>

3. 运行时权限:

BaseActivity.java

使用时继承它

package com.glsite.mobilesafe.ui;import android.app.Activity;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;/*** @author Admin* @version $Rev$* @des ${TODO}* @updateAuthor $Author$* @updateDes ${TODO}*/
public class BaseActivity extends Activity {//**************** Android M Permission (Android 6.0权限控制代码封装)private int permissionRequestCode = 88;private PermissionCallback permissionRunnable;public interface PermissionCallback {void hasPermission();void noPermission();}/*** Android M运行时权限请求封装** @param permissionDes 权限描述* @param runnable      请求权限回调* @param permissions   请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS*/public void performCodeWithPermission(@NonNull String permissionDes, PermissionCallback runnable, @NonNull String... permissions) {if (permissions == null || permissions.length == 0)return;//        this.permissionrequestCode = requestCode;this.permissionRunnable = runnable;if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.M) || checkPermissionGranted(permissions)) {if (permissionRunnable != null) {permissionRunnable.hasPermission();permissionRunnable = null;}} else {//permission has not been granted.requestPermission(permissionDes, permissionRequestCode, permissions);}}private boolean checkPermissionGranted(String[] permissions) {boolean flag = true;for (String p : permissions) {if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {flag = false;break;}}return flag;}private void requestPermission(String permissionDes, final int requestCode, final String[] permissions) {if (shouldShowRequestPermissionRationale(permissions)) {/*1. 第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale()  返回 true,应该显示一些为什么需要这个权限的说明2.第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale()  返回 false3. 设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale()  返回 false*/// Provide an additional rationale to the user if the permission was not granted// and the user would benefit from additional context for the use of the permission.// For example, if the request has been denied previously.//            Snackbar.make(getWindow().getDecorView(), requestName,//                    Snackbar.LENGTH_INDEFINITE)//                    .setAction(R.string.common_ok, new View.OnClickListener() {//                        @Override//                        public void onClick(View view) {//                            ActivityCompat.requestPermissions(BaseAppCompatActivity.this,//                                    permissions,//                                    requestCode);//                        }//                    })//                    .show();//如果用户之前拒绝过此权限,再提示一次准备授权相关权限new AlertDialog.Builder(this).setTitle("提示").setMessage(permissionDes).setPositiveButton("授权", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);}}).show();} else {// Contact permissions have not been granted yet. Request them directly.ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);}}private boolean shouldShowRequestPermissionRationale(String[] permissions) {boolean flag = false;for (String p : permissions) {if (ActivityCompat.shouldShowRequestPermissionRationale(this, p)) {flag = true;break;}}return flag;}/*** Callback received when a permissions request has been completed.*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {if (requestCode == permissionRequestCode) {if (verifyPermissions(grantResults)) {if (permissionRunnable != null) {permissionRunnable.hasPermission();permissionRunnable = null;}} else {Toast.makeText(this, "暂无权限执行相关操作!", Toast.LENGTH_SHORT).show();if (permissionRunnable != null) {permissionRunnable.noPermission();permissionRunnable = null;}}} else {super.onRequestPermissionsResult(requestCode, permissions, grantResults);}}public boolean verifyPermissions(int[] grantResults) {// At least one result must be checked.if (grantResults.length < 1) {return false;}// Verify that each required permission has been granted, otherwise return false.for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}//********************** END Android M Permission ****************************************
}

4.DirectoryListViewActivity

 FileScan的使用:

package com.glsite.mobilesafe.ui;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import com.glsite.entity.DirectoryInfo;
import com.glsite.mobilesafe.R;
import com.glsite.utils.FileScan;import java.io.File;
import java.util.ArrayList;/*** @author glsite.com* @version $Rev$* @des ${TODO}* @updateAuthor $Author$* @updateDes ${TODO}*/
public class DirectoryListViewActivity extends Activity implements View.OnClickListener {private TextView canusemenmery;private TextView canuseSDmenmery;private TextView currentDirectory;//SD卡/cdbarcodeprivate ImageButton directoryReturn, back;private ListView directoryListView;private static final String defaultPath = "/sdcard";//sd卡private FileScan mFileScan;//文件工具private DirectoryInfo mDirectoryInfo;private String targetFile=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.directory_listview);initview();}/*** 初始化布局文件*/private void initview() {canusemenmery = (TextView) findViewById(R.id.canusemenmery);//可用内存canuseSDmenmery = (TextView) findViewById(R.id.canuseSDmenmery);//可用sd内存directoryReturn = (ImageButton) findViewById(R.id.dialog_save_turnback);//返回currentDirectory = (TextView) findViewById(R.id.dialog_save_path);//SD卡/cdbarcodedirectoryListView = (ListView) findViewById(R.id.dir_listview);//ListViewdirectoryReturn.setOnClickListener(this);back = (ImageButton) findViewById(R.id.back);//退出文件管理back.setOnClickListener(this);//操作文件工具类mFileScan = new FileScan();//获取SD卡目录mDirectoryInfo = mFileScan.getFileDirectory(defaultPath);//显示数据到界面上createListView(mDirectoryInfo);}/*** 显示数据到界面上** @param directoryInfo*/private void createListView(final DirectoryInfo directoryInfo) {DirectoryListAdpter directoryListAdpter = new DirectoryListAdpter(this, directoryInfo);directoryListView.setAdapter(directoryListAdpter);directoryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//点击事件@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {String dr = directoryInfo.currentDirectory + "/";//当前的目录String fileItem = dr + directoryInfo.directoryName.get(position);//当前的文件路径File file = new File(fileItem);if(file.isFile()){//点击的如果是文件targetFile = fileItem;Toast.makeText(DirectoryListViewActivity.this,"已选文件"+fileItem, Toast.LENGTH_SHORT).show();}else{//点击的如果是目录mDirectoryInfo=  mFileScan.getFileDirectory(fileItem);createListView(mDirectoryInfo);}}});currentDirectory.setText(directoryInfo.currentDirectory);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.back:finish();break;case R.id.dialog_save_turnback://返回sd卡根目录if(!defaultPath.equals(mDirectoryInfo.currentDirectory)){mDirectoryInfo = mFileScan.getFileDirectory(mDirectoryInfo.fatherDirectory);createListView(mDirectoryInfo);}break;default:break;}}class DirectoryListAdpter extends BaseAdapter {private LayoutInflater mInflater;private ArrayList<String> directoryname, childAmount;public DirectoryListAdpter(Context context, DirectoryInfo directoryInfo) {mInflater = LayoutInflater.from(context);directoryname = directoryInfo.directoryName;childAmount = directoryInfo.childDirectoryContain;}@Overridepublic int getCount() {return directoryname == null ? 0 : directoryname.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;holder = new ViewHolder();convertView = mInflater.inflate(R.layout.directory_list_items, null);holder.directoryImage = convertView.findViewById(R.id.directory_item_image);holder.directoryname = convertView.findViewById(R.id.directory_item_name);holder.directoryChildAmount = convertView.findViewById(R.id.directory_item_childamount);holder.directoryImage.setImageResource(R.drawable.ic_dxhome_file_manager);holder.directoryname.setText(directoryname.get(position));holder.directoryChildAmount.setText(childAmount.get(position));return convertView;}public final class ViewHolder {public ImageView directoryImage;public TextView directoryname;public TextView directoryChildAmount;}}
}

MainActivity.java

package com.glsite.mobilesafe.ui;import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;import com.glsite.adapter.PopWindowsAdapter;
import com.glsite.mobilesafe.R;
import com.glsite.mobilesafe.adapter.pageAdapter;
import com.glsite.entity.PopItem;import java.util.ArrayList;public class MainActivity extends BaseActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {private TextView mTools;private TextView mOptimization;private TextView mAppmanager;private ImageView mTransbar;private ViewPager mVpager;private View mViewTools;private View mViewOptimization;private View mViewAppmanager;private ArrayList<View> mPageList;private TextView curTxt;private ImageView mMore;private ArrayList<PopItem> list = new ArrayList<PopItem>();private PopItem mItem;private int wight;private int hight;private View mView;private ListView mIstView;private PopupWindow mPopupWindow;private LinearLayout mLy_filemanager;private LinearLayout mLv_dashituijian;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去除时间与状态栏requestWindowFeature(Window.FEATURE_NO_TITLE);//去除标题;注意把BaseActivity继承的AppCompatActivity类改成继承Activity类;因为AppCompatActivity与Activity类使用的风格不同setContentView(R.layout.activity_main);initView();setImageParam();//初始化图片参数initContentView();//初始化内容页initpage();//初始化page}/*** 初始化page*/private void initpage() {//大师推荐mLv_dashituijian = mViewTools.findViewById(R.id.lv_dashituijian);//大师推荐mLy_filemanager = mViewTools.findViewById(R.id.ly_filemanager);//文件管理mLy_filemanager.setOnClickListener(new toolsClickListener());}/*** 初始化内容页*/private void initContentView() {LayoutInflater flater = LayoutInflater.from(this);mViewTools = flater.inflate(R.layout.activitymain_tools, null);mViewOptimization = flater.inflate(R.layout.activitymain_optimization, null);mViewAppmanager = flater.inflate(R.layout.activitymain_appmanager, null);mPageList.add(mViewTools);mPageList.add(mViewOptimization);mPageList.add(mViewAppmanager);mVpager.setAdapter(new pageAdapter(mPageList));//设置适配器}/*** 初始化图片参数*/private void setImageParam() {int disWidth = getWindowManager().getDefaultDisplay().getWidth();//获取屏幕的宽度int imgWidth = (int) (disWidth / 4 * 0.75);//将屏幕尺寸除以4乘0.75 计算出下标图片宽度LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mTransbar.getLayoutParams();//获取图片参数params.weight = imgWidth;//修改原图片宽度mTransbar.setLayoutParams(params);TranslateAnimation move = new TranslateAnimation(0, (disWidth / 4 - imgWidth) / 2, 0, 0);move.setDuration(100);//延时100毫秒move.setFillAfter(true);//保持这个位置mTransbar.startAnimation(move);}//Ctrl+Alt+F 使局部变量成为成员变量private void initView() {//工具箱mTools = findViewById(R.id.tv_toools);//系统优化mOptimization = findViewById(R.id.tv_optimization);//应用管理mAppmanager = findViewById(R.id.tv_appmanager);//工具栏下面的一横线,下标图片的位置mTransbar = findViewById(R.id.trans_bar);//视图翻页工具,提供了多页面切换的效果mVpager = findViewById(R.id.vpager);mTools.setOnClickListener(this);//点击事件mOptimization.setOnClickListener(this);//点击事件mAppmanager.setOnClickListener(this);//点击事件mVpager.setOnPageChangeListener(this);mPageList = new ArrayList<>();curTxt = mTools;setTxtColor(mTools);mMore = findViewById(R.id.more);initMoreList();mMore.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int[] location = new int[2];mMore.getLocationOnScreen(location);  //获取在屏幕上的位置int x = location[0];int y = location[1];wight = x;hight = y;//显示弹出菜单showPopWindows();}});}/*** 显示弹出菜单*/private void showPopWindows() {mView = getLayoutInflater().inflate(R.layout.pup_main, null, false);mIstView = mView.findViewById(R.id.pup_list);mIstView.setAdapter(new PopWindowsAdapter(list, getApplicationContext()));mPopupWindow = new PopupWindow(mView, 200, 470);mPopupWindow.setFocusable(true);//是否有焦点mPopupWindow.setOutsideTouchable(true);//设置是否可以点击mPopupWindow.setBackgroundDrawable(new BitmapDrawable());//设置背景图片mPopupWindow.showAsDropDown(mView, wight, hight+200);mIstView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {switch (position) {case 0:Toast.makeText(MainActivity.this,"0弹出窗体", Toast.LENGTH_SHORT).show();break;case 1:Toast.makeText(MainActivity.this,"1弹出窗体", Toast.LENGTH_SHORT).show();break;case 2:Toast.makeText(MainActivity.this,"2弹出窗体", Toast.LENGTH_SHORT).show();break;default:break;}if (mPopupWindow != null) {mPopupWindow.dismiss();//关闭窗口}}});}/*** 初始化弹出菜单栏*/private void initMoreList() {mItem = new PopItem("用户中心");list.add(mItem);mItem = new PopItem("系统设置");list.add(mItem);mItem = new PopItem("设置项");list.add(mItem);mItem = new PopItem("设置项");list.add(mItem);}/*** 点击事件** @param v*/@Overridepublic void onClick(View v) {//点击事件switch (v.getId()) {case R.id.tv_toools://工具箱//Toast.makeText(this,"tv_toools工具箱", Toast.LENGTH_SHORT).show();imgTrans(mTools);//动画效果改变下标图片的位置setTxtColor(mTools);//切换设置文本颜色mVpager.setCurrentItem(0);//点击的是哪一页 当前页break;case R.id.tv_optimization://系统优化//Toast.makeText(this,"tv_optimization系统优化", Toast.LENGTH_SHORT).show();imgTrans(mOptimization);//动画效果改变下标图片的位置setTxtColor(mOptimization);//切换设置文本颜色mVpager.setCurrentItem(1);//点击的是哪一页 当前页break;case R.id.tv_appmanager://应用管理//Toast.makeText(this,"tv_appmanager应用管理", Toast.LENGTH_SHORT).show();imgTrans(mAppmanager);//动画效果改变下标图片的位置setTxtColor(mAppmanager);//切换设置文本颜色mVpager.setCurrentItem(2);//点击的是哪一页 当前页break;default:break;}}/*** 切换设置文本颜色** @param endText*/private void setTxtColor(TextView endText) {switch (endText.getId()) {case R.id.tv_toools://工具箱mTools.setTextColor(getResources().getColor(R.color.green));mOptimization.setTextColor(getResources().getColor(R.color.floralwhite));mAppmanager.setTextColor(getResources().getColor(R.color.floralwhite));break;case R.id.tv_optimization://系统优化mTools.setTextColor(getResources().getColor(R.color.floralwhite));mOptimization.setTextColor(getResources().getColor(R.color.green));mAppmanager.setTextColor(getResources().getColor(R.color.floralwhite));break;case R.id.tv_appmanager://应用管理mTools.setTextColor(getResources().getColor(R.color.floralwhite));mOptimization.setTextColor(getResources().getColor(R.color.floralwhite));mAppmanager.setTextColor(getResources().getColor(R.color.green));break;default:break;}}/*** 动画效果改变下标图片的位置** @param endTxt*/private void imgTrans(TextView endTxt) {int startMid = curTxt.getLeft() + curTxt.getWidth() / 2;int startLeft = startMid - mTransbar.getWidth() / 2;int endMid = endTxt.getLeft() + endTxt.getWidth() / 2;int endLift = endMid - mTransbar.getWidth() / 2;TranslateAnimation move = new TranslateAnimation(startLeft, endLift, 0, 0);move.setDuration(200);move.setFillAfter(true);//保存位置mTransbar.startAnimation(move);curTxt = endTxt;}@Overridepublic void onPageScrolled(int i, float v, int i1) {}@Overridepublic void onPageSelected(int i) {switch (i) {case 0://工具箱//Toast.makeText(this,"tv_toools工具箱", Toast.LENGTH_SHORT).show();imgTrans(mTools);//动画效果改变下标图片的位置setTxtColor(mTools);//切换设置文本颜色// mVpager.setCurrentItem(0);//点击的是哪一页 当前页break;case 1://系统优化//Toast.makeText(this,"tv_optimization系统优化", Toast.LENGTH_SHORT).show();imgTrans(mOptimization);//动画效果改变下标图片的位置setTxtColor(mOptimization);//切换设置文本颜色//mVpager.setCurrentItem(1);//点击的是哪一页 当前页break;case 2://应用管理//Toast.makeText(this,"tv_appmanager应用管理", Toast.LENGTH_SHORT).show();imgTrans(mAppmanager);//动画效果改变下标图片的位置setTxtColor(mAppmanager);//切换设置文本颜色//mVpager.setCurrentItem(2);//点击的是哪一页 当前页break;default:break;}}@Overridepublic void onPageScrollStateChanged(int i) {}private class toolsClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.lv_dashituijian:大师推荐break;case R.id.ly_filemanager://文件管理startActivity(new Intent(MainActivity.this,DirectoryListViewActivity.class));break;default:break;}}}
}

directory_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/whitesmoke"><RelativeLayoutandroid:id="@+id/mian_title"android:layout_width="match_parent"android:layout_height="40dp"android:background="#074060"><ImageButtonandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:background="@drawable/titlebar_logo_back"/><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="文件管理"android:textColor="@color/whitesmoke"android:textSize="20sp"/></RelativeLayout><!-- 手机信息界面 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="30dp"android:layout_gravity="center"android:background="@drawable/navigationbar_bg"><TextViewandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentLeft="true"android:layout_marginLeft="10dp"android:gravity="center"android:text="可用内存:"android:textColor="@android:color/black"android:textSize="14sp" /><TextViewandroid:id="@+id/canusemenmery"android:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentLeft="true"android:layout_marginLeft="5dp"android:gravity="center"android:text="124M"android:textColor="@android:color/black"android:textSize="14sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentLeft="true"android:layout_marginLeft="35dp"android:gravity="center"android:text="可用Sd内存:"android:textColor="@android:color/black"android:textSize="14sp" /><TextViewandroid:id="@+id/canuseSDmenmery"android:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentLeft="true"android:layout_marginLeft="5dp"android:gravity="center"android:text="4511M"android:textColor="@android:color/black"android:textSize="14sp" /></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="45dp"android:background="@drawable/navigationbar_bg"><TextViewandroid:id="@+id/dialog_save_path"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_marginLeft="10dp"android:ellipsize="start"android:gravity="center"android:maxWidth="240dp"android:singleLine="true"android:text="SD卡/cdbarcode"android:textColor="@color/black"android:textSize="18sp"/><ImageButtonandroid:id="@+id/dialog_save_turnback"android:layout_width="40dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="5dp"android:background="@drawable/directory_back_selector"/></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"><ListViewandroid:id="@+id/dir_listview"android:layout_width="match_parent"android:layout_height="wrap_content"android:cacheColorHint="#00000000"></ListView></LinearLayout></LinearLayout>

directory_list_items.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/directory_item"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/directory_item_image"android:layout_width="wrap_content"android:layout_height="40dp"android:layout_gravity="center_vertical"android:layout_margin="5dp"android:scaleType="fitCenter" /><TextViewandroid:id="@+id/directory_item_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_margin="5dp"android:singleLine="true"android:text=""android:textColor="@android:color/black"android:textSize="18sp"></TextView><TextViewandroid:id="@+id/directory_item_childamount"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:text="(0)"android:textColor="#ff525353"android:textSize="18sp"></TextView>
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.glsite.mobilesafe"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".ui.SplashActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".ui.MainActivity"></activity><activity android:name=".ui.DirectoryListViewActivity"></activity></application></manifest>

操作SD卡,获取文件目录及文件工具类Android,listView相关推荐

  1. 获取SD卡中的音乐文件

    小编近期在搞一个音乐播放器App.练练手: 首先遇到一个问题.怎么获取本地的音乐文件? /*** 获取SD卡中的音乐文件** @param context* @return*/public stati ...

  2. [原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - 从SD卡内读取图片文件,然后显示在TFT-LCD上...

    实在很抱歉,时间紧张,我只讲怎样从SD卡内读取bin文件(二进制文件),然后现在TFT-LCD上. 准备工具 1. Image2Lcd.zip 操作步骤 步骤1 寻找或制作240x320的图片 简单起 ...

  3. 读取SD卡里面的BMP文件 显示到TFT上

    读取SD卡里面的BMP文件 显示到TFT上 http://blog.csdn.net/yunxianpiaoyu/article/details/8841755 我刚好最近做了一个BMP565格式的图 ...

  4. Qt SD卡 文件系统挂载、文件预览

    /*********************************************************************************** Qt SD卡 文件系统挂载.文 ...

  5. sd卡有多个android文件夹,android - 如何adb拉出SD卡中存在的文件夹的所有文件

    android - 如何adb拉出SD卡中存在的文件夹的所有文件 我的SD卡中有一个文件夹:/mnt/sdcard/Folder1/Folder2/Folder3/*.jpg Folder1和Fold ...

  6. 解决修改properties 属性文件存在缓存问题,附带操作properties文件工具类

    2019独角兽企业重金招聘Python工程师标准>>> 在做项目的时候有些数据不一定需要在数据库管理,例如数据库连接,定时任务等等的配置..有时候需要动态修改这些数据,但在修改完后, ...

  7. 计算机中硬盘上删了的东西为什么还可以恢复sd卡可以吗,怎么从SD卡中恢复误删文件...

    怎么从SD卡中恢复误删文件?SD卡广泛用于各种便携式设备,如数码相机,手机和多媒体播放器.虽然它给用户带来了极大的便利,但是因为SD卡空间有限,这就要求你总是你删除旧的数据写入新的数据,这导致您的数据 ...

  8. 可以恢复SD卡丢失的数据的工具推荐

    现在,小编向大家介绍一下如何使用易我数据恢复软件恢复SD卡丢失的照片.文件.视频等资料. 准备工具: 1.电脑.SD卡读卡器和需要恢复数据的SD卡 2.SD卡数据恢复软件 - 易我数据恢复大师 第一步 ...

  9. java获取properties属性_java工具类中获取properties文件的属性

    记录获取properties文件属性的工具类 package org.jasig.cas.mylogin.util; import org.slf4j.Logger; import org.slf4j ...

最新文章

  1. c memcpy 与 strcpy 区别
  2. [CommunityServer]看RBAC的一方景象
  3. 从零开始netty学习笔记之BIO
  4. 吴恩达机器学习笔记二之多变量线性回归
  5. 【Python】自动化升级所有pip安装的包
  6. HBase数据模型和读写原理
  7. 使用RIP协议处理不连续的子网和VLSM(一)
  8. 仓库文件SVN总结-java教程
  9. 动手学深度学习Pytorch Task07
  10. ip8plus多重_【苹果 iPhone 8 Plus 手机使用总结】容量|处理器|手感_摘要频道_什么值得买...
  11. 如何使用jmeter录制脚本
  12. 【渝粤教育】广东开放大学 计量基础知识 形成性考核 (48)
  13. type 与 interface 的区别
  14. Quantile-Quantile (q-q) Plots
  15. 网游之古剑太初最新章节
  16. linux删除文件子最后两行,关于linux:如何使用sed删除文件的最后n行
  17. 学习实践-Vicuna【小羊驼】(部署+运行)
  18. JVM系列之JDK、JRE、JVM的区别是什么?(二)
  19. 【题解】[POI2006」Tet-Tetris 3D
  20. MySQL+Mybatis

热门文章

  1. The Linux commands you need!
  2. Linux查看实时网卡流量的几种方式
  3. 16 Managing Undo
  4. application/x-www-form-urlencoded接口响应报文中文乱码
  5. Java常用api和操作必背
  6. python 十六进制打印编码
  7. 使用XmlWriter写XML文件
  8. Microsoft Excel 不能访问文件
  9. win 10专业版中虚拟机里面无法按打开centos镜像
  10. netstat命令常见用法