-
안드로이드: 비디오 갤러리(Video Gallery) 만들기안드로이드 스튜디오 2020. 12. 17. 22:24
안드로이드내 내부저장소에 저장되어있는 mp4파일을 참조해서 비디오 갤러리를
만들어야 할 일이 있어서 만들었다.
<activity_video_gallery.xml>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".VideoActivity" android:orientation="vertical" android:background="@color/white" > <Gallery android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/gallery1" android:spacing="10dp" android:unselectedAlpha="0.2" > </Gallery> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#4784ea" android:gravity="center"> <VideoView android:id="@+id/videoVideo" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:visibility="visible" /> </LinearLayout> </LinearLayout> </LinearLayout>
<activity_row.xml>
<?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#4784ea" android:orientation="vertical"> <ImageView android:id="@+id/gallery_imageView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="10dp" android:src="@drawable/ic_launcher_foreground" /> <TextView android:id="@+id/galleryTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="7dp" android:fontFamily="@font/nanumsquareroundl" android:gravity="center" android:text="title" android:textColor="#FFFFFF" android:textSize="20dp" /> </LinearLayout> </androidx.cardview.widget.CardView>
<VideoGallery.java>
package org.techtown.blackbox; import androidx.appcompat.app.AppCompatActivity; import android.media.MediaPlayer; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.Gallery; import android.widget.MediaController; import android.widget.VideoView; import java.io.File; public class VideoGallery extends AppCompatActivity { private VideoView videoView; // 재생할 비디오뷰 private String videoList[]; // 내부저장소내 비디오 리스트 private String videoDirPath; private String videoFilePath; @Override protected void onPause() { if(videoView!=null && videoView.isPlaying()) videoView.pause(); super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); if(videoView!=null) videoView.stopPlayback(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_gallery); videoDirPath = this.getFilesDir().getAbsolutePath() + "/blackbox"; // 내부저장소에 미리 저장해둔 blackbox디렉토리의 경로를 가져온다. File file = new File(videoDirPath); videoList = file.list(); // 파일 내 비디오 리스트를 가져온다. String videoListReverse[] = new String[videoList.length]; for(int i = 0; i< videoList.length; i++) videoListReverse[i] = videoList[videoList.length - i - 1]; // 파일 내 저장된 비디오를 최신순으로 바꾸는 과정 MyGalleryAdapter adapter = new MyGalleryAdapter( // 미리 만들어둔 adpater 선언 getApplicationContext(), // 현재 화면의 제어권자 R.layout.activity_row, videoListReverse); // adapterView Gallery gallery = (Gallery)findViewById(R.id.gallery1); gallery.setAdapter(adapter); final MediaController controller = new MediaController(this); // 비디오 mediacontroller // 갤러리에서 비디오 선택시 비디오 재생 gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 선택되었을 때 콜백메서드 videoFilePath = videoDirPath + "/" + videoListReverse[position]; Log.e("VideoFilePath: ", videoFilePath); videoView =findViewById(R.id.videoVideo); videoView.setVideoPath(videoFilePath); videoView.requestFocus(); videoView.setMediaController(controller); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { videoView.start(); // 첫화면이 보이게 // 그렇지 않으면 첫 화면은 그냥 검은 화면 videoView.postDelayed(new Runnable() { @Override public void run() { controller.show(0); videoView.pause(); } },100); } }); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } }
<MyGalleryAdapter.java>
package org.techtown.blackbox; import android.content.Context; import android.graphics.Bitmap; import android.media.ThumbnailUtils; import android.os.AsyncTask; import android.provider.MediaStore; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import org.w3c.dom.Text; import java.util.ArrayList; class MyGalleryAdapter extends BaseAdapter { Context context; int layout; String [] videoTitle; // 비디오 제목 LayoutInflater inf; private ArrayList<Bitmap> bmThumbnail; // 비디오 썸네일 public MyGalleryAdapter(Context context, int layout, String[] videoTitle) { this.context = context; this.layout = layout; this.videoTitle = videoTitle; inf = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // 보여줄 데이터의 총 개수 - 필수 return videoTitle.length; } @Override public Object getItem(int position) { // 해당행의 데이터- 선택 return null; } @Override public long getItemId(int position) { // 해당행의 유니크한 id-선택 return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // 보여줄 해당행의 row xml 파일의 데이터를 셋팅해서 뷰를 완성하는 작업 if (convertView == null) { convertView = inf.inflate(layout, null); } // 비디오 썸네일 만들기 Bitmap bmThumbnail = ThumbnailUtils.createVideoThumbnail(context.getFilesDir().getAbsolutePath() + "/blackbox/" + videoTitle[position], MediaStore.Images.Thumbnails.MINI_KIND); // MINI_KIND크기 if(bmThumbnail !=null) { // 썸네일 크기 조절 bmThumbnail = Bitmap.createBitmap(bmThumbnail, 0, bmThumbnail.getHeight() / 5, bmThumbnail.getWidth(), bmThumbnail.getHeight() * 3 / 5); } ImageView imageThumbnail = (ImageView)convertView.findViewById(R.id.gallery_imageView); imageThumbnail.setImageBitmap(bmThumbnail); // 비디오 제목 정해주기 TextView textView = convertView.findViewById(R.id.galleryTextView); if(videoTitle[position] != null) { String[] title = videoTitle[position].split("_"); textView.setText(title[1] + "_" + title[2]); }else{ textView.setText("잘못된 형식"); } return convertView; } }
반응형'안드로이드 스튜디오' 카테고리의 다른 글
안드로이드: 간단한 데이터를 저장하고 싶을 때(SharedPreferences 사용예제) (0) 2020.12.18 안드로이드: 내장 가속도계 센서 이용해서 충돌 감지하기 (0) 2020.12.17 안드로이드: callOnClick 메소드 (클릭없이 이벤트 호출) (0) 2020.10.09 안드로이드: 간단 그림판 만들기!(Canvas, Paint 클래스 사용하기) (0) 2020.09.23 안드로이드: xml파일 만들어서 사용하기 (대화상자, 토스트메시지 커스텀) (0) 2020.09.22