建议下载 包名为com.speedsoftware.sqleditor的软件,使用有root权限的手机查看数据库文件加深学习印象。
本demo代码存在问题
1,点击不能播放视频,只有Toast
2,视频排列的顺序不确定是不是1,2,3这样按照大小排序
3,每次都是删除数据库,重建,没有优化速度
import java.util.ArrayList;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import static android.content.ContentValues.TAG;
import static nativesample.videolan.org.myapplication.FindVideo.getFileDir;
import static nativesample.videolan.org.myapplication.FindVideo.getStoragePath;
public class MainActivity extends AppCompatActivity {
private ListView lv_Dir;
private FileBrowserAdaper1 adapter;
//文件名,路径
private String rempath;//外置存储
private String norempath;//内置存储
private MyDatabaseHelper dbHelp;
private SQLiteDatabase db;
private ArrayList<String> parentdir,// /storage/sdcard1/Download
currentdir, // Download
filepathArr, // /storage/sdcard1/Download/中国山寨机无可超越的史诗传说!无法匹敌的国产神话!.flv
filenameArr; //中国山寨机无可超越的史诗传说!无法匹敌的国产神话!.flv
Cursor cursor;//用于遍历数据库
@Override
protected void onDestroy() {
super.onDestroy();
db.close();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
currentdir = new ArrayList<>();
parentdir = new ArrayList<>();
filepathArr = new ArrayList<>();
filenameArr = new ArrayList<>();
deleteDatabase("test.db");
dbHelp = new MyDatabaseHelper(this, "test.db", null, 1);
db = dbHelp.getWritableDatabase();
setContentView(R.layout.activity_main);
rempath = getStoragePath(MainActivity.this, true);
norempath = getStoragePath(MainActivity.this, false);
lv_Dir = (ListView) findViewById(R.id.lv_localvideo);
//可以遍历内置存储下的external_sd
if (rempath != null) getFileDir(rempath, db);
if (norempath != null) getFileDir(norempath, db);
//遍历数据库 dir部分
cursor = db.rawQuery("select * from dirinfo", null);
if (cursor.moveToFirst()) {
do {
currentdir.add(cursor.getString(cursor.getColumnIndex("currentdir")));
parentdir.add(cursor.getString(cursor.getColumnIndex("parentdir")));
} while (cursor.moveToNext());
}
//使用系统默认的listview
ArrayAdapter<String> diradapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_expandable_list_item_1,
currentdir
);
lv_Dir.setAdapter(diradapter);
lv_Dir.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, parentdir.get(position), Toast.LENGTH_LONG).show();
filenameArr.clear();
filepathArr.clear();
//遍历数据库 video部分
cursor = db.rawQuery("select * from videoinfo where parentdir like '" + parentdir.get(position) + "'", null);
if (cursor.moveToFirst()) {
do {
filepathArr.add(cursor.getString(cursor.getColumnIndex("filepath")));
filenameArr.add(cursor.getString(cursor.getColumnIndex("filename")));
} while (cursor.moveToNext());
}
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
intent.putExtra("filenameArr", filenameArr);
intent.putExtra("filepathArr", filepathArr);
startActivity(intent);
}
});
}
}
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by lybly on 2018/3/18.
*/
public class MyDatabaseHelper extends SQLiteOpenHelper{
private Context mcontext;
private final String CREATE_DIRINFO="create table dirinfo("+ // dir部分
"parentdir Text primary key,"+ ///storage/sdcard1/Download
"currentdir Text"+ //Download
")";
private final String CREATE_VIDEOINFO="create table videoinfo("+ //video部分
"filepath Text primary key,"+// /storage/sdcard1/Download/中国山寨机无可超越的史诗传说!无法匹敌的国产神话!.flv
"filename Text,"+ //中国山寨机无可超越的史诗传说!无法匹敌的国产神话!.flv
"parentdir Text,"+ ///storage/sdcard1/Download
"foreign key(parentdir) references dirinfo(parentdir)"+ //外键
")";
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mcontext=context;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DIRINFO);
db.execSQL(CREATE_VIDEOINFO);
Toast.makeText(mcontext,"suc",Toast.LENGTH_LONG).show();
}
}
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class VideoActivity extends AppCompatActivity {
private ListView lv_Video;
private FileBrowserAdaper1 adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> filenameArr=(ArrayList)getIntent().getSerializableExtra("filenameArr");
final ArrayList<String> filepathArr=(ArrayList)getIntent().getSerializableExtra("filepathArr");
for(int i = 0; i < filenameArr.size(); i++){
Log.d("videoActivty ", "onCreate: "+filenameArr.get(i)+filenameArr.size());
Log.d("videoActivty ", "onCreate: "+filepathArr.get(i)+filepathArr.size());
}
lv_Video = (ListView) findViewById(R.id.lv_localvideo);
adapter = new FileBrowserAdaper1(this,filenameArr,filepathArr);
lv_Video.setAdapter(adapter);
lv_Video.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(VideoActivity.this,filepathArr.get(position),Toast.LENGTH_LONG).show();
}
});
}
}
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.storage.StorageManager;
import java.io.File;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by lybly on 2018/3/18.
*/
public class FindVideo {
public static void getFileDir(String infilePath, SQLiteDatabase db) {
String dirinfostr = null,filename,filepath,parentdir,currentDir,tmp,videoinfostr;
File f = new File(infilePath);
File[] files = f.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isDirectory()) {
getFileDir(file.getPath(),db);
} else {
if (checkVideo(file.getName())) {
//文件名 中国山寨机无可超越的史诗传说!无法匹敌的国产神话!.flv
filename = file.getName();
//文件路径 /storage/sdcard1/Download/中国山寨机无可超越的史诗传说!无法匹敌的国产神话!.flv
filepath = file.getPath();
//父路径 /storage/sdcard1/Download
parentdir = file.getParent().toString();
//当前路径 Download
currentDir = file.toString().substring(f.toString().lastIndexOf("/") + 1, f.toString().length());
tmp = "insert into dirinfo(parentdir,currentdir)values(\"" + parentdir + "\",\"" + currentDir + "\")";
if ( !tmp.equals(dirinfostr)){
dirinfostr=tmp;
db.execSQL(dirinfostr);
}
videoinfostr = "insert into videoinfo(filepath,filename,parentdir)values(\"" + filepath + "\",\"" + filename + "\",\"" + parentdir + "\")";
db.execSQL(videoinfostr);
}
}
}
}
}
private static String[] suffixname = {".3gp", ".amv", ".ape", ".flv", ".mp4", "wmv", ".rmvb"};
//判断后缀名
private static boolean checkVideo(String path) {
for (int i = 0; i < suffixname.length; i++) {
if (path.lastIndexOf(suffixname[i]) != -1) {
return true;
}
continue;
}
return false;
}
//获取内置或外置存储;路径
public static String getStoragePath(Context mContext, boolean is_removale) {
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
Class<?> storageVolumeClazz = null;
try {
storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
Method getPath = storageVolumeClazz.getMethod("getPath");
Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
Object result = getVolumeList.invoke(mStorageManager);
final int length = Array.getLength(result);
for (int i = 0; i < length; i++) {
Object storageVolumeElement = Array.get(result, i);
String path = (String) getPath.invoke(storageVolumeElement);
boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
if (is_removale == removable) {
return path;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class FileBrowserAdaper1 extends BaseAdapter{
private ArrayList<String> paths;
private ArrayList<String> names;
private LayoutInflater mInflater;
public FileBrowserAdaper1(Context mContext, ArrayList<String> names, ArrayList<String> paths) {
this.paths = paths;
this.names = names;
mInflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return names != null ? names.size() : -1;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return names != null && !names.isEmpty() ? names.get(position) : null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder viewHolder;
if(convertView == null) {
convertView = mInflater.inflate(R.layout.file_row, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView)convertView.findViewById(R.id.text);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)convertView.getTag();
}
if(names != null && !names.isEmpty()) {
viewHolder.text.setText(names.get(position));
viewHolder.icon.setBackgroundResource(R.mipmap.ic_launcher);
}
return convertView;
}
class ViewHolder{
TextView text;
ImageView icon;
}
}