도전과제 25 : 앨범 사진을 리스트로 보여주기 (Do it Android 앱 프로그래밍) [JAVA]
반응형

 

도전과제 25

단말의 앨범에 있는 사진들을 가져와 리스트로 보여주는 기능을 만들어 보세요. 앨범에 있는 사진들은 내용 제공자를 이용해 가져올 수 있습니다.

  1. 앨범에 저장된 사진을 가져와 사진 리스트를 표시합니다.
  2. 앨범에 들어 있는 사진은 내용 제공자(Content Provider)를 사용해 가져옵니다.
  3. 리싸이클러뷰의 한 아이템에는 사진 썸네일(Thumbnail) 이미지와 날짜를 표시합니다.
  4. 리싸이클러뷰의 위쪽에는 전체 사진의 개수를 표시합니다.

참고할점
단말의 사진 앱으로 사진을 찍으면 앨범에서 볼 수 있습니다.
앨범 앱을 사용하지 않고 여러분이 만든 앱에서도 앨범에 저장된 사진을 보여줄 수 있습니다.

 

풀이

이전 도전과제 18번 앨범의 사진을 번갈아 보여주기에서 리싸이클러뷰로 보여주기만 하면 되어서 간단하게 진행하였다.

이미지의 thumbnail, 날짜, 이름을 담은 객체인 sampleimage 클래스를 정의하고, 이를 imageAdapter를 통해 보여준다. 사진을 받아오는 방법은 MediaStore.Images.ImageColumns로 ID, DISPLAY_NAME, DATE_TAKEN, DATA를 받아오고, id값을 사용하여 비트맵을 만들어 진행하였다. 

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    imageAdapter imageadapter;
    TextView textNum;

    Cursor cursor;
    int totalpages = 0;

    Bitmap bitmap;

    String date;
    Calendar cal = new GregorianCalendar();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    ArrayList<sampleimage> sampleimages = new ArrayList<sampleimage>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AutoPermissions.Companion.loadAllPermissions(this,101);
        textNum = findViewById(R.id.textNum);

        recyclerView = findViewById(R.id.recyclerview);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        imageadapter = new imageAdapter();
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(imageadapter);

        getImages();
    }

    private void getImages(){
        sampleimage images;
        String[] projection = new String[]{
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DISPLAY_NAME,
                MediaStore.Images.ImageColumns.DATE_TAKEN,
                MediaStore.Images.ImageColumns.DATA
        };
        cursor = getContentResolver()
                .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null,
                        null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
        totalpages = cursor.getCount();
        textNum.setText(totalpages + " 개");

        for (int i=0; i<100; i++){
            cursor.moveToPosition(i);
            images = new sampleimage();
            long id = cursor.getLong(0);
            String name = cursor.getString(1);
            long datessec = cursor.getLong(2);
            String data = cursor.getString(3);

            getThumbnail(id, images);
            getDate(datessec,images);
            //getImage(data, images);
            images.setName(name);
            imageadapter.addItem(images);
        }
        cursor.close();
    }

    //썸네일 띄우기
    public void getThumbnail(long id, sampleimage image){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inDither = true;
        options.inSampleSize = 2; // 이 숫자가 커질수록 사진 크기가 작아져서 속도가 빨라진다
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        Bitmap bit = MediaStore.Images.Thumbnails.getThumbnail( getContentResolver(), id, MediaStore.Images.Thumbnails.MINI_KIND,options);
        bitmap = ThumbnailUtils.extractThumbnail(bit,100,100,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
        image.setThumbnail(bitmap);
    }
    public void getImage(String path, sampleimage image){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        Bitmap bit  = BitmapFactory.decodeFile(path,options);
        image.setThumbnail(bit);
    }
    //날짜 형식
    public void getDate(long time, sampleimage image){
        cal.setTimeInMillis(time);
        Date d = cal.getTime();
        date = format.format(d);
        image.setDate(date);
    }
}

 

결과

그런데 카카오톡 저장 사진들은 안보인다.. 아시는 분은 댓글로 지적 부탁드립니다.

전체 소스코드 : https://github.com/howtolivelikehuman/DoitAndroid/tree/master/DoitMission_25/app/src/main

 

howtolivelikehuman/DoitAndroid

Do it Android programing (JAVA). Contribute to howtolivelikehuman/DoitAndroid development by creating an account on GitHub.

github.com

 

반응형