识别视频文件夹,listview

该博客探讨了如何通过ListView展示视频文件,并利用数据库进行管理。文章指出,尽管代码存在一些问题,如无法直接播放视频、显示顺序不明确以及数据库操作效率待优化,但推荐使用com.speedsoftware.sqleditor软件来辅助学习数据库文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建议下载 包名为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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值