공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
대해 알아봅니다.
언제나처럼 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(this, 2)); 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, null, null, null); 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, null, false); 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>
여기까지 그냥 복사 붙여넣기 하시면 됩니다.
이상입니다. 감사합니다.
'안드로이드' 카테고리의 다른 글
안드로이드 이미지, 동영상 동적 삭제 File delete(), exists(), how to delete file(image, video) dynamically (0) | 2018.12.28 |
---|---|
안드로이드 ImageView 가로세로 길이 같이 맞추는 법 (0) | 2018.12.21 |
안드로이드 TextView Shadow 그림자 넣기 추가하기 (0) | 2018.12.14 |
안드로이드 RecyclerView.Decoration , recyclerView item 간격 설정 (0) | 2018.12.14 |
안드로이드 선 그리기, FingerDraw, drawline, canvas, setOntTouchListener (0) | 2018.12.11 |