开始的时候我是通过根路径去遍历,发现行不通。不知道是手机的问题还是逻辑问题(个人觉得没毛病),最后我就是用了查询手机的数据库来找出所有的本地视频。
话不多少说。
下面的类,是主界面的一个内部类。因为要查询数据库(一个耗时操作)所以要在子线程里面进行,通过handle更改UI界面(跳转到主线程)。
MediaStore这个类是Android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取(视频和图像和音频基本类似)。
ContentResolver 用法参数详情到了解http://blog.csdn.net/jdsjlzx/article/details/9080235
/**
* 遍历系统数据库找出相应的是视频的信息
*/
class Search_photo extends Thread {
@Override
public void run() {
// 如果有sd卡(外部存储卡)
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
Uri originalUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
ContentResolver cr = LocalVideoActivity1.this.getApplicationContext().getContentResolver();
Cursor cursor = cr.query(originalUri, null, null, null, null);
if (cursor == null) {
return;
}
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
long duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
//获取当前Video对应的Id,然后根据该ID获取其缩略图的uri
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
String[] selectionArgs = new String[]{id + ""};
String[] thumbColumns = new String[]{MediaStore.Video.Thumbnails.DATA,
MediaStore.Video.Thumbnails.VIDEO_ID};
String selection = MediaStore.Video.Thumbnails.VIDEO_ID + "=?";
String uri_thumb = "";
Cursor thumbCursor = (LocalVideoActivity1.this.getApplicationContext().getContentResolver()).query(
MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, thumbColumns, selection, selectionArgs,
null);
if (thumbCursor != null && thumbCursor.moveToFirst()) {
uri_thumb = thumbCursor
.getString(thumbCursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA));
}
BitmapEntity bitmapEntity = new BitmapEntity(title, path, size, uri_thumb, duration);
bit.add(bitmapEntity);
}
if (cursor != null) {
cursor.close();
mHandler.sendEmptyMessage(1);
}
}
}
}
查到了信息保存后,通过handle进行自己想要的界面显示(这些都是我自己的显示,可以自己修改)
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressLint("ShowToast")
public void handleMessage(android.os.Message msg) {
if (msg.what == 1 && bit != null) {
adapter = new VideodetailListviewAdapter(LocalVideoActivity1.this, bit);
Toast.makeText(LocalVideoActivity1.this, "视频总数:" + bit.size(), Toast.LENGTH_SHORT).show();
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
//单单点击一次后执行
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if (bit.size() != 0) {
Intent intent = new Intent(Intent.ACTION_VIEW);
String type = "video/mp4";
Uri uri = Uri.parse("file://" + bit.get(arg2).getUri());
intent.setDataAndType(uri, type);
startActivity(intent);
}
}
});
//长按后执行 mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { ppDismiss();//弹出框消失的方法
View ppView = View.inflate(LocalVideoActivity1.this, R.layout.view_pp, null); //newpp对象 pp = new PopupWindow(ppView, -2, -2); pp.setFocusable(true); //ppwindow的bug就是无论做什么都给他设置一个背景,不然无法起作用 pp.setBackgroundDrawable(new ColorDrawable()); int[] location = new int[2]; view.getLocationInWindow(location); pp.showAtLocation(view, Gravity.LEFT + Gravity.TOP, 260, location[1]); //ppwindow的动画 //缩放 ScaleAnimation sa = new ScaleAnimation(0.2f, 1.0f, 0.2f, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f); sa.setDuration(500); //渐变 AlphaAnimation aa = new AlphaAnimation(0.2f, 1.0f); aa.setDuration(500); //动画集 AnimationSet set = new AnimationSet(false); set.addAnimation(sa); set.addAnimation(aa); //开启动画,谁开启就作用在谁的身上 ppView.startAnimation(set); /*LinearLayout ll_start = (LinearLayout) ppView.findViewById(R.id.ll_start); ll_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(LocalVideoActivity.this, "123456", Toast.LENGTH_SHORT).show(); // System.out.println("播放"); String path = Environment.getExternalStorageDirectory().toString() + "/Movies/"; //设置视频控制器// videoView.setMediaController(new MediaController(LocalVideoActivity.this));// videoView.setVideoPath(path + name.get(position));// videoView.start(); } });*/ //获取视频信息上传到服务器跳转(可以不看) LinearLayout ll_share = (LinearLayout) ppView.findViewById(R.id.ll_share); ll_share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Toast.makeText(LocalVideoActivity.this, "上传", Toast.LENGTH_SHORT).show(); // Toast.makeText(LocalVideoActivity.this, s, Toast.LENGTH_SHORT).show(); // Uri uri = Uri.parse("file://" + bit.get(position).getUri()); // 得到sd卡内image文件夹的路径 File.separator(/) //String path = Environment.getExternalStorageDirectory().toString()+ "/Movies"; String path=new String(""+ bit.get(position).getUri()); //File file = new File(ss); // String path=file.getPath(); ppDismiss(); Intent intent = new Intent(LocalVideoActivity1.this, UploadActivity.class); intent.putExtra("videoname", path); startActivity(intent); } }); return true; } }); } } };//自定义弹出框