ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드: 비디오 갤러리(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;
        }
    
    
    
    }
    
    

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.