안드로이드

안드로이드 갤러리에 저장된 동영상 목록 불러오기, 불러온 동영상 재생하기

알통몬_ 2018. 12. 20. 14:25
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


안드로이드 갤러리에 저장된 동영상 목록 불러오기, 불러온 동영상 재생하기에

대해 알아봅니다.


언제나처럼 DataBinding을 사용합니다.


1. 갤러리에 저장된 동영상 목록 불러오기

ㄱ. GetStoredActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import android.database.Cursor;
import android.databinding.DataBindingUtil;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import java.util.Vector;
 
import superbrain.rowan.com.questionnaire.databinding.ActivityGetstoredvideoBinding;
 
public class GetStoredVideoActivity extends AppCompatActivity {
 
    ActivityGetstoredvideoBinding binding;
    private static final int GSV = R.layout.activity_getstoredvideo;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, GSV);
 
        binding.menuListView.setLayoutManager(new GridLayoutManager(this2));
        GSVAdapter adapter = new GSVAdapter(this);
        binding.menuListView.setAdapter(adapter);
        getVideo();
        adapter.setUp(getVideo());
    }
 
 
    private Vector<Menu> getVideo() {
        String[] proj = {MediaStore.Video.Media._ID,
                MediaStore.Video.Media.DISPLAY_NAME,
                MediaStore.Video.Media.DATA
        };
        Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = getContentResolver().query(uri, proj, nullnullnull);
        Vector<Menu> menus = new Vector<>();
        assert cursor != null;
        while (cursor.moveToNext()) {
            String title = cursor.getString(1);
            long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media._ID));
            Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(getContentResolver(), id, MediaStore.Video.Thumbnails.MINI_KIND, null);
 
            // 썸네일 크기 변경할 때.
            //Bitmap thumbnail = ThumbnailUtils.extractThumbnail(bitmap, width, height);
            String data = cursor.getString(2);
            menus.add(new Menu(title, bitmap, Uri.parse(data)));
        }
 
        cursor.close();
        return menus;
    }
 
}
cs

String[] proj = ...;

코드를 보면 MediaStore.Video.Media.상수가 선언되었는데요.

https://developer.android.com/reference/android/provider/MediaStore.Video.Media

위 링크를 가시면 어떤 상수들이 있는지, 각 상수들을 어떤 내용을 가지는지

확인하실 수 있습니다.

만약 동영상을 최근에 찍은 것들부터 나오게 하고 싶다면

Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
String orderBy = MediaStore.Video.Media.DATE_TAKEN;
Cursor cursor = getContentResolver().query(uri, proj, null, null, orderBy + " DESC");

요렇게 orderBy를 추가해주면 됩니다.

썸네일을 만드는 코드에서

MediaStore.Video.Thumbnails.MINI_KIND

를 볼 수 있는데요.

MINI_KIND 말고도 MICRO_KIND, FULL_SCREEN_KIND 가 있는데요.

이유는 모르겠으나 MICRO_KIND는 사용이 되었는데, FULL_SCREEN_KIND는

에러가 났습니다. ㅎㅎ 아시는 분은 댓글 좀 부탁드립니다.



ㄴ. Menu.java

import android.graphics.Bitmap;
import android.net.Uri;

public class Menu {

private String title;
private Bitmap img;
private Uri uri;

public Menu(String title, Bitmap img, Uri uri) {
this.title = title;
this.img = img;
this.uri = uri;
}

public String getTitle() {
return title;
}

public Bitmap getImg() {
return img;
}

public Uri getUri() {
return uri;
}
}

ㄷ. GSVAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
 
import java.util.Vector;
 
import superbrain.rowan.com.questionnaire.databinding.ItemMenuBinding;
 
public class GSVAdapter extends RecyclerView.Adapter<GSVAdapter.GSVHolder> {
 
    private Vector<Menu> menus = new Vector<>();
 
    Context context;
    Activity activity;
 
    public GSVAdapter(Activity activity) {
        this.activity = activity;
        this.context = activity.getApplicationContext();
    }
 
    @NonNull
    @Override
    public GSVHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        ItemMenuBinding binding = ItemMenuBinding.inflate(LayoutInflater.from(context), viewGroup, false);
        return new GSVHolder(binding);
    }
 
    @Override
    public void onBindViewHolder(@NonNull GSVHolder gsvHolder, int position) {
        ItemMenuBinding binding = gsvHolder.binding;
        Menu menu  = menus.get(position);
        String title = menu.getTitle();
        Bitmap img = menu.getImg();
        Uri uri = menu.getUri();
        binding.menuTitleImgView.setImageBitmap(img);
        //다이얼로그로 동영상의 Uri를 보내며 다이얼로그를 띄우는코드.
binding.menuTitleImgView.setOnClickListener(view -> {
            ShowVideoDialog dialog = new ShowVideoDialog(activity, uri, activity);
            dialog.show();
        });
    }
 
    @Override
    public int getItemCount() {
        return menus.size();
    }
 
    public void setUp(Vector<Menu> menus) {
        this.menus = menus;
        notifyDataSetChanged();
    }
 
    class GSVHolder extends RecyclerView.ViewHolder {
        ItemMenuBinding binding;
 
        GSVHolder(ItemMenuBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
 
    }
}
 
 
cs

ㄹ. activity_getstoredVideo.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GetStoredVideoActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/menuListView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.constraint.ConstraintLayout>
</layout>

ㅁ. item_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
android:id="@+id/menuTitleImgView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/app_name"
android:scaleType="fitXY"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>


</android.support.constraint.ConstraintLayout>
</layout>

여기까지가 갤러리에 있는 동영상들을 불러오는 코드입니다.

여기까지 작성하시면 아래처럼 갤러리에있는 동영상들이 아래처럼 나오게 됩니다.


2. 불러온 동영상을 다이얼로그에 띄워 재생하기

여기서 부터는 딱히 설명이 필요하지 않을 듯합니다. ㅎㅎ

커스텀다이얼로그를 만들고 그 안에 VideoView를 넣어서 동영상을 재생합니다.

ㅂ. ShowVideoDialog.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
 
import superbrain.rowan.com.questionnaire.databinding.DialogShowvideoBinding;
 
public class ShowVideoDialog extends Dialog {
 
    DialogShowvideoBinding binding;
 
    private Uri videoUri;
 
    private Activity activity;
    Context context;
 
    ShowVideoDialog(Context context, Uri videoUri, Activity activity) {
        super(context);
        this.videoUri = videoUri;
        this.activity = activity;
        this.context = context;
    }
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_showvideo, nullfalse);
        setContentView(binding.getRoot());
        String uriStr = this.videoUri.toString();
        uriStr = uriStr.substring(16, uriStr.length() - 12);
        binding.videoView.setVideoURI(this.videoUri);
        binding.videoView.setOnPreparedListener(mp -> binding.videoView.start());
        binding.videoView.setOnCompletionListener(mp -> cancel());
    }
}
 
cs

ㅅ. dialog.showvideo.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>
</layout>

여기까지 그냥 복사 붙여넣기 하시면 됩니다.

이상입니다. 감사합니다.

반응형