操作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"/>
<application
android: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() 返回 false
3. 设备的策略禁止当前应用获取这个权限的授权: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() {
@Override
public 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.
*/
@Override
public 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卡/cdbarcode
private ImageButton directoryReturn, back;
private ListView directoryListView;
private static final String defaultPath = "/sdcard";//sd卡
private FileScan mFileScan;//文件工具
private DirectoryInfo mDirectoryInfo;
private String targetFile=null;
@Override
protected 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卡/cdbarcode
directoryListView = (ListView) findViewById(R.id.dir_listview);//ListView
directoryReturn.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() {//点击事件
@Override
public 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);
}
@Override
public 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;
}
@Override
public int getCount() {
return directoryname == null ? 0 : directoryname.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public 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;
@Override
protected 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() {
@Override
public 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() {
@Override
public 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
*/
@Override
public 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;
}
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public 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;
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
private class toolsClickListener implements View.OnClickListener {
@Override
public 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">
<RelativeLayout
android:id="@+id/mian_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#074060">
<ImageButton
android: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"
/>
<TextView
android: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>
<!-- 手机信息界面 -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="30dp"
android:layout_gravity="center"
android:background="@drawable/navigationbar_bg">
<TextView
android: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" />
<TextView
android: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" />
<TextView
android: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" />
<TextView
android: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>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@drawable/navigationbar_bg">
<TextView
android: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"
/>
<ImageButton
android: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>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<ListView
android: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">
<ImageView
android: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" />
<TextView
android: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>
<TextView
android: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"/>
<application
android: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>